풀이 흐름 설명
이 문제는 YYYYMMDD 형태로 들어오는 날짜 문자열이 실제로 가능한 날짜인지 확인하는 문제이다.
먼저 테스트 케이스 개수 T를 입력받고 각 테스트 케이스마다 날짜 문자열 date를 입력받았다. 날짜 문자열은 길이가 8로 고정되어 있으므로 substring()을 사용해서 앞의 4자리는 연도 y, 그다음 2자리는 월 m, 마지막 2자리는 일 d로 나누었다.
출력할 때는 문자열 형태의 y, m, d를 그대로 사용해야 하므로 따로 저장해두었다. 그리고 날짜가 유효한지 비교하기 위해 월과 일은 Integer.parseInt()를 사용해 정수로 변환하였다.
먼저 month가 1보다 작거나 12보다 크면 존재하지 않는 월이므로 -1을 출력하고 continue로 다음 테스트 케이스로 넘어가도록 처리하였다. 여기서 continue를 사용하지 않으면 잘못된 월인데도 아래 날짜 검사 로직까지 이어질 수 있기 때문에 반드시 끊어주어야 했다.
월이 정상 범위라면 달마다 가능한 일수를 나누어 검사하였다. 1월, 3월, 5월, 7월, 8월, 10월, 12월은 31일까지 존재하므로 day가 1보다 작거나 31보다 크면 -1을 출력하였다. 4월, 6월, 9월, 11월은 30일까지 존재하므로 day가 30보다 큰 경우 잘못된 날짜로 처리하였다. 나머지 경우는 2월이므로 day가 1보다 작거나 28보다 크면 -1을 출력하였다.
모든 조건을 통과한 날짜는 유효한 날짜이므로 YYYY/MM/DD 형식으로 출력하였다. 여러 테스트 케이스의 결과는 StringBuilder에 모아두었다가 마지막에 한 번에 출력하였다.
시간복잡도:O(N), 공간복잡도:O(N)
- [ x ] 1회
- 2회
- 3회
import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
static StringBuilder sb = new StringBuilder();
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
String date = sc.next();
String y = date.substring(0,4);
String m = date.substring(4,6);
String d = date.substring(6);
int year = Integer.parseInt(date.substring(0,4));
int month = Integer.parseInt(date.substring(4,6));
int day = Integer.parseInt(date.substring(6));
if(month<1 || month>12){
sb.append("#").append(test_case).append(" ").append("-1").append("\n");
continue;
}
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
if(day<1 || day>31){
sb.append("#").append(test_case).append(" ").append("-1").append("\n");
}else{
sb.append("#").append(test_case).append(" ").append(y).append("/").append(m).append("/").append(d).append("\n");
}
}else if(month==4 || month==6 || month==9 || month==11){
if(day<1 || day>30){
sb.append("#").append(test_case).append(" ").append("-1").append("\n");
}else{
sb.append("#").append(test_case).append(" ").append(y).append("/").append(m).append("/").append(d).append("\n");
}
}else{
if(day<1 || day>28){
sb.append("#").append(test_case).append(" ").append("-1").append("\n");
}else{
sb.append("#").append(test_case).append(" ").append(y).append("/").append(m).append("/").append(d).append("\n");
}
}
}
System.out.print(sb);
}
}

import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
static StringBuilder sb = new StringBuilder();
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int[] lastDay = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
for(int test_case = 1; test_case <= T; test_case++)
{
String date = sc.next();
String y = date.substring(0, 4);
String m = date.substring(4, 6);
String d = date.substring(6, 8);
int month = Integer.parseInt(m);
int day = Integer.parseInt(d);
if(month < 1 || month > 12 || day < 1 || day > lastDay[month]) {
sb.append("#").append(test_case).append(" -1\n");
} else {
sb.append("#").append(test_case).append(" ")
.append(y).append("/")
.append(m).append("/")
.append(d).append("\n");
}
}
System.out.print(sb);
}
}