ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/JAVA] 18312번 : 시각
    Algorithm 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);
    
        }
    }

    'Algorithm' 카테고리의 다른 글

    [백준/JAVA] 2231번 : 분해합  (0) 2024.10.28
    [백준/JAVA] 22864번 : 피로도  (0) 2024.10.26
    [백준/JAVA] 11286번 : 절댓값 힙  (0) 2024.10.26
    [백준/JAVA] 2075번 : N번째 큰 수  (0) 2024.10.22
    [백준/JAVA] 4358번 : 생태학  (0) 2024.10.22
Designed by Tistory.