[알고리즘]/이코테

구현 - 시각

broship 2021. 2. 20. 14:52

문제


- 정수 n이 입력되면 00시 00분 00초부터 n시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하세요. 예를 들어 1을 입력했을 때 다음은 3이 하나라도 포함되어 있으므로 세어야 하는 시각입니다.

00시 00분 03초

00시 13분 30초

반면에 다음은 3이 하나도 포함되어 있지 않으므로 세면 안되는 시각입니다.

00시 02분 55초

01시 27분 45초

 

입력조건

- 첫째 줄에 정수 n이 입력됩니다 (0<=n<=23)

ex)

5

 

출력조건

00시 00분 00초부터 n시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 출력합니다

ex)

11475

 

 

 

문제해결


1) 내 풀이

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	
	int n = sc.nextInt();
	
	int cnt = 0;
	for(int h=0;h<=n;h++)//시
		if(h!=3 && h!=13 && h!=23)
			for(int m1=0;m1<6;m1++)//분 10자리
				if(m1!=3)
					for(int m2=0;m2<10;m2++)//분 1자리 
						if(m2!=3)
							for(int s1=0;s1<6;s1++) //초 10자리
								if(s1!=3)
									cnt++;
								else
									cnt += 10;
						else
							cnt += 10 * 6;
				else
					cnt += 10 * 6 * 10;
		else //3시,13시,23시일때
			cnt += 10 * 6 * 10 * 6;
	System.out.println(cnt);
}

 

 

2) 정답

//특정한 시각 안에 '3'이 포함되어 있는지의 여부
public static boolean check(int h, int m, int s) {
	//%는 1의 자리가 3인이 체크, /는 10의 자리가 3인지 체크
	if(h%10==3 || m/10==3 || m%10==3 || s/10==3 || s%10==3)
		return true;
	return false;
}

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	
	int n = sc.nextInt();
	
	int cnt = 0;
	for(int i=0;i<=n;i++) {
		for(int j=0;j<60;j++) {
			for(int k=0;k<60;k++) {
				if(check(i,j,k)) cnt++;
			}
		}
	}
	System.out.println(cnt);
}

 

각 시,분,초를 /3 과 %3을 하면 3이 포함되어 있는지를 찾을 수 있었는데 그걸 생각 못해서 각 시,분,초를 1의 자리 10의 자리로 쪼개서 반복문을 반복해 3이 포함되어 있는지를 체크했다

아직 이런 수학적 사고가 부족한거 같다, 앞으로 문제를 더 많이 풀어서 실력을 향상시킬수 있도록 해야겠다...

 

 

해설


- 이 문제는 가능한 모든 시각의 경우를 하나씩 모두 세서 풀 수 있는 문제입니다

- 하루는 86,400초 이므로, 00시 00분 00초부터 23시 59분 59초까지의 모든 경우는 86,400가지 입니다

24 * 60 * 60 = 86,400

- 따라서 단순히 시각을 1씩 증가시키면서 3이 하나라도 포함되어 있는지를 확인하면 됩니다.

- 이러한 유형은 완전 탐색(Brute Forcing)문제 유형이라고 불립니다.

(가능한 경우의 수를 모두 검사해보는 탐색 방법을 의미합니다)

 

 

'[알고리즘] > 이코테' 카테고리의 다른 글

구현 - 문자열 재정렬  (0) 2021.02.24
구현 - 왕실의 나이트  (0) 2021.02.23
구현 - 상하좌우  (0) 2021.02.19
그리디 - 모험가 길드  (0) 2021.02.18
그리디 - 곱하기 혹은 더하기  (0) 2021.02.17