728x90

📍 연월일 달력

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 

세 번째 테스트 케이스

입력
01010101

출력
#3 0101/01/01

 

년도가 "0"으로 시작할 경우를 고려해 year의 데이터 타입은 String으로 선언하였다.

month와 date는 숫자와 비교해 주어야 하기 때문에 우선 데이터 타입을 int로 선언하고 후에 처리해주었다.

입력값은 연월일 자리를 고정으로 8자리가 들어오기 때문에 substring() 함수를 사용했다.

String year = str.substring(0, 4);
int month = Integer.parseInt(str.substring(4, 6));
int date = Integer.parseInt(str.substring(6, 8));

 

 

 

처음 if문은 날짜형식을 충족하는 큰 범위(?)를 만들고 참이라는 의미로 answer = "1"로 바꿔주었다.

그 후 month마다 date가 맞지 않는 경우 처리를 해주었다. (1월은 31일, 2월은 28일)

answer의 값을 "-1"과 "1"로 하는 이유는 answer의 값에 따라 출력 방식을 나누려는 목적이다.

String answer = "-1";
    if (!year.equals("0000") && 1 <= month && month <= 12 && 1 <= date && date <= 31) {
        answer = "1";
        if (month == 2 && date > 28) answer = "-1";
        if (month == 4 || month == 6 || month == 9 || month == 11 && date > 30) answer = "-1";
}

 

 

 

첫 번째 테스트케이스

입력
22220228

출력
#1 2222/02/28

 

month와 date가 10보다 작을 경우 앞에 "0"을 붙여 출력하고

그렇지 않을 경우 Integer.toString() 함수를 사용해 문자열 타입으로 변환한다.

String months = "0";
if(month < 10) months += month;
else months = Integer.toString(month);
 
String dates = "0";
if(date < 10) dates += date;
else dates = Integer.toString(date);

 

 

 

✨ 전체 코드 ✨

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Solution {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
 
        int T = Integer.parseInt(sc.readLine());
        for (int test_case = 1; test_case <= T; test_case++) {
            String str = sc.readLine();
            String year = str.substring(0, 4);
            int month = Integer.parseInt(str.substring(4, 6));
            int date = Integer.parseInt(str.substring(6, 8));
 
            String answer = "-1";
            if (!year.equals("0000") && 1 <= month && month <= 12 && 1 <= date && date <= 31) {
                answer = "1";
                if (month == 2 && date > 28) answer = "-1";
                if (month == 4 || month == 6 || month == 9 || month == 11 && date > 30) answer = "-1";
            }
 
            String months = "0";
            if(month < 10) months += month;
            else months = Integer.toString(month);
 
            String dates = "0";
            if(date < 10) dates += date;
            else dates = Integer.toString(date);
 
            if (answer.equals("1")) answer = year + "/" + months + "/" + dates;
            sb.append("#").append(test_case).append(" ").append(answer).append("\n");
        } System.out.println(sb);
    }
}

 

 

 

🌀 성능

  • 메모리 : 20,796 KB
  • 실행시간 : 104 ms

 

 

 


🧐 회고

난이도는 D1인데 코드를 어떻게 짤지 고민하다가 시간이 꽤 걸렸다 ㅠ

처음엔 month와 date를 일차원 배열로 선언해 반복문으로 값을 받아볼까, 아님 해쉬맵으로 할까 고민해보았는데 결론은 if문을 최대한 적게 사용하는 것을 목표로 했다.

근데 제출이력을 보니 실행시간이 65ms 인 코드가 있더라.

포인트 쓰기 싫어서 안 봤는데 궁금하다.