Algorithm/Java

[백준/JAVA] 18312번 : 시각

dbfl9911 2024. 10. 26. 13:52
반응형

https://www.acmicpc.net/problem/18312

 

📌 문제 요약 

정수 N과 K가 주어졌을 때, 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중 K가 하나라도 포함되는 모든 시각의 수를 세는 문제입니다. 시각은 디지털 시계 형식으로 초 단위로 구분합니다.



[ 오답 노트 ]


❌ 기존 오답 코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken()); // 5
        String K = st.nextToken(); // 3
        // 5시 59분 59초까지의 모든 시각 중 3이 하나라도 포함되는 모든 시각 세기
        // [00, 00, 00] 형태로
        // 00 01 02 03 04 05 06 07 08 09 10
        // 11 12 13 14 15 16 17 18 19 20


        int count = 0;
        for(int h = 0; h <= N; h++) { // 시
            for(int m = 0; m <= 59; m++) { // 분
                for(int s = 0; s <= 59; s++) { // 초
                    if(String.valueOf(s).contains(K) ||
                       String.valueOf(m).contains(K) ||
                       String.valueOf(h).contains(K)) {
                        count++;
                    }
                }
            }
        }

        System.out.println(count);

    }
}


📌 기존 코드의 문제점

 

1. 포맷의 일관성 문제:

  • 기존 코드에서는 시, 분, 초를 개별적으로 String.valueOf()로 변환해 contains(K)로 확인했습니다.
  • 이 방식은 대부분 올바르게 동작하지만, 특정 케이스에서 시, 분, 초가 따로 분리되어 체크되기 때문에 디지털 시계 형식(HHMMSS)과 일관성이 맞지 않아 오작동할 가능성이 있습니다.

 

 




[ 정답 코드 & 올바른 풀이 ]


📌 올바른 풀이

 

1. 포맷의 일관성 문제 해결

 

  • 문제 요구사항은 HHMMSS 형식의 디지털 시계 전체에서 K가 포함되는지를 확인하는 것입니다.  String.format("%02d%02d%02d", hour, minute, second)을 사용해 시, 분, 초를 HHMMSS 형식으로 통일한 후 indexOf로 K를 검색했습니다.
  • 이를 통해 하나의 통합된 문자열에서 한 번에 K를 탐색하며 일관성을 유지할 수 있었습니다.



📌 정답 코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken()); // 5
        String K = st.nextToken(); // 3
        // 5시 59분 59초까지의 모든 시각 중 3이 하나라도 포함되는 모든 시각 세기
        // [00, 00, 00] 형태로
        // 00 01 02 03 04 05 06 07 08 09 10
        // 11 12 13 14 15 16 17 18 19 20


        int count = 0;
        for(int h = 0; h <= N; h++) { // 시
            for(int m = 0; m <= 59; m++) { // 분
                for(int s = 0; s <= 59; s++) { // 초
                   // 현재 시각을 HHMMSS 형식으로 포맷
                    String time = String.format("%02d%02d%02d", h, m, s);

                    if(time.contains(K)) {
                        count++;
                    }
                }
            }
        }


        System.out.println(count);

    }
}
반응형