시각 문제 (교재 113p)
난이도 ●○○ | 풀이 시간 15분 | 시간 제한 2초 | 메모리 제한 128MB
문제
정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 경우의 수를 구하는 프로그램을 작성하시오.
입출력 조건)
입력 조건 | - 첫째 줄에 정수 N이 입력진다. (1 ≤ N ≤ 100) |
출력 조건 | 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 출력한다. |
입출력 예시)
입력 예시 | 출력 예시 |
5 | 11475 |
문제 풀이 방법
- 모든 시각의 경우를 하나씩 세서 풀 수 있다.
- 왜냐하면 하루는 86,400초로 86,400가지밖에 존재하지 않기 대문이다.
- 경우의 수가 100,000개도 되지 않다.
- 문자열 연산을 이용해 3이 시각에 포함되어 있는지 확인
- 완전 탐색 유형이기도 하다.
- max값을 구해준다.
- max = 59 + 60*59 + 60*60*n
실수한 점 & 부족한 점
- 문자열 연산이 아닌, 정수 연산을 하려고 하여 복잡하게 생각하였다.
- 하지만, 정수 연산이 더 빠르다. 시간 계산 방법 링크 참조
실제로 아래 소스코드를 계산한 결과, 아래와 같이 소요되었다.
- 문자열 연산은 58ms
- 정수 연산은 2ms
- 하지만, 정수 연산이 더 빠르다. 시간 계산 방법 링크 참조
- sec를 0초로 두어서 00초 일 때의 경우가 집계되지 않았다.
소스 코드
package exam04_implementation;
import java.io.*;
public class Q2_Time {
public static int solution(int n){
int max = 59 + 60*59 + 60*60*n;
int sec = -1;
int min = 0;
int hour = 0;
int result = 0;
String str = "";
for(int temp=0 ; temp <= max ; temp++){
sec = sec + 1;
if(sec >= 60){
min += 1;
sec = 0;
}
if(min >= 60){
hour += 1;
min = 0;
}
// String으로 풀기
str = String.valueOf(hour) + String.valueOf(min) + String.valueOf(sec);
for(int j=0 ; j<str.length() ; j++){
if(str.charAt(j) == '3'){
result++;
break;
}
}
// int로 풀기
// if(sec % 10 == 3 || ((sec - 30) < 10 && (sec - 30) >= 0)){
// result ++;
// } else if(min % 10 == 3 || ((min - 30) < 10 && (min - 30) >= 0)) {
// result++;
// } else if(hour % 10 == 3 || ((sec - 30) < 10 && (sec - 30) >= 0)) {
// result++;
// }
}
return result;
}
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
System.out.println(solution(n));
br.close();
bw.close();
}
}
package baekjoon.implementation;
import java.io.*;
import java.util.StringTokenizer;
public class Q_18312_Time {
public static int solution(int n, String k){
int max = 59 + 60*59 + 60*60*n;
int sec = -1;
int min = 0;
int hour = 0;
int result = 0;
String strSec = "";
String strMin = "";
String strHour = "";
String strTime = "";
for(int temp=0 ; temp <= max ; temp++){
sec = sec + 1;
if(sec >= 60){
min += 1;
sec = 0;
}
if(min >= 60){
hour += 1;
min = 0;
}
strSec = String.valueOf(sec);
strMin = String.valueOf(min);
strHour = String.valueOf(hour);
if(strSec.length() == 1)
strSec = "0" + strSec;
if(strMin.length() == 1)
strMin = "0" + strMin;
if(strHour.length() == 1)
strHour = "0" + strHour;
strTime = strHour + strMin + strSec;
// System.out.println(strHour+"시 " + strMin+"분 "+ strSec+"초");
// String으로 풀기
for(int j=0 ; j<strTime.length() ; j++){
if(strTime.charAt(j) == k.charAt(0)){
result++;
break;
}
}
}
return result;
}
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
String k = st.nextToken();
System.out.println(solution(n,k));
br.close();
bw.close();
}
}
/** 실수한 부분
* 1. sec = 0 으로 설정하여 1초부터 시작하게한 것
* 2. 숫자가 한 자리수 일 때, 앞에 0문자를 붙여주지 않았던 것
**/
반응형
'자료구조&알고리즘 > 구현' 카테고리의 다른 글
[이.코.테] Chapter 04 구현 - 게임 개발 (Java) (0) | 2021.04.10 |
---|---|
[이.코.테] Chapter 04 구현 - 왕실의 나이트 (Java) (0) | 2021.04.10 |
[이.코.테] Chapter 04 구현 - 상하좌우 (Java) (0) | 2021.04.10 |
구현 (0) | 2021.04.10 |
댓글