2021. 6. 4. 22:30ㆍ알고리즘/구현
유튜브 참고 : https://www.youtube.com/watch?v=2zjoKjt97vQ
문제 정의
정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성하시오. 예를 들어 1을 입력했을 때 다음은 3이 하나라도 포함되어있으므로 세어야하는 시각이다.
- 00시 00분 03초
- 00시 13분 30초
반면 다음은 3이 하나도 포함되어있지 않으므로 세면 안되는 시각이다.
- 00시 02분 55초
- 01시 27분 45초
입력
첫째 줄에 정수 N이 주어진다.(1 ≤ N ≤ 23)
출력
00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 출력한다.
예제 입력 1
5
예제 출력 1
11475
해당 문제의 주요 포인트
- n을 하나씩 차례로 올리며 계산을 하더라도 계산하더라도 최대 86,400건('23' 입력 시)밖에 계산하지 않는다. 따라서 모든 경우의 수를 따져가며 문제를 풀어도 된다.
접근 방법 1 (시간을 하나씩 늘려준다.)
1. 입력받은 n이 될 때까지 시간을 일초씩 늘린다.
2. 60초가 되면 1분으로, 60분이 되면 1시간으로 바꾼 뒤, 3이 있는 지 확인한다.
3. h가 n이 되기 전까지 지속한다.
코드
n = int(input())
h = 0
s = 0
m = 0
count = 0
while True:
s += 1
if s == 60:
s = 0
m += 1
if m == 60:
m = 0
h += 1
if h > n:
break
if '3' in str(h)+str(m)+str(s):
count += 1
print(count)
- 하지만 해당 방법은 코드도 다소 길뿐더러 비효율적이기에 나눗셈을 통해 몫과 나머지를 구하고 이를 통해 시간과 분을 한번에 계산하자.
접근 방법 2 (시간을 시, 분, 초로 나눈다.)
1. 입력받은 (n + 1)에 대해 3600만큼 곱한 수를 반복해준다. (00:00:00 ~ N:00:00)
2. iteration이 반복될 때마다 숫자가 하나씩 증가하는데, 몫과 나머지를 통해 시, 분, 초로 나눠주고 3이 있을 때 count를 증가시킨다.
3. 반복이 끝나면 count를 출력한다.
코드
n = int(input())
h = 0
s = 0
m = 0
count = 0
for i in range((n+1)*3600):
h = i // 3600
m = (i % 3600) // 60
s = i % 60
if '3' in str(h)+str(m)+str(s):
count += 1
print(count)
'알고리즘 > 구현' 카테고리의 다른 글
백준 온라인 저널, 구현/14503번 : 로봇 청소기(파이썬) / 골드 문제 (0) | 2021.06.11 |
---|---|
이코테 2021, 구현/ 왕실의 나이트(파이썬) (0) | 2021.06.04 |
백준 온라인 저널, 구현/2747번 : 피보나치 수(파이썬) (0) | 2021.06.03 |
백준 온라인 저널, 구현/10872번 : 팩토리얼(파이썬) (0) | 2021.06.03 |
이코테 2021, 구현/ 상하좌우(파이썬) (0) | 2021.06.01 |