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);
}
}
반응형