이코테 2021, 구현/ 시각(파이썬)

2021. 6. 4. 22:30알고리즘/구현

728x90
반응형

유튜브 참고 : 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)

 

728x90
반응형