코딩테스트[파이썬]/이것이 코딩테스트다(이코테)

[구현] 시각

softmoca__ 2024. 1. 25. 13:20
목차

정수 N이 입력되면 00시 00분 00초 부터 N시 59분 59초 까지의 모든 시각중 3이 하나라도 포함 되는 경우의 수를 출력.

 

 

나의코드

N=int(input())

cnt=0
for k in range(N+1):
    if k==3 or k==13 or k==23:
        cnt+=3600
        continue
    for i in range(60):
        if i %10==3 or i//10==3:
            cnt+=60
            continue
        for j in range(60):
            if j%10==3 or j//10==3:
                cnt+=1

print(cnt)

우선 시간, 분, 초단위로 나누어 생각을 해 보았다.

시간 단에서 3이 포함되면 분과 초는 어떤 값이 오더라도 카운팅이 된다. 즉 60*60이 바로 카운팅이 된다.

그리고 contine를 하여 이후 분과 시간에서는 카운팅이 되지 않게 하였다.

이후 분 단에서 3이 포함(1의자리숫자가3 또는 10의자리 숫자가 3)이 되면 초 단에서는 어떤 값이 오더라도 카운팅이 된다.

즉 60이 바로 카운팅이 된다.

마지막으로 초 단에서는 1의자리와 10의자리가 3인경우를 카운팅하면 끝 !

 

 

정답코드

# H를 입력받기
h = int(input())

count = 0
for i in range(h + 1):
    for j in range(60):
        for k in range(60):
            # 매 시각 안에 '3'이 포함되어 있다면 카운트 증가
            if '3' in str(i) + str(j) + str(k):
                count += 1

print(count)

이 문제는 모든 시간의 경우를 하나씩 세면 쉽게 풀수 있다.

왜냐면 하루는 총 86400초 밖에 되지 않아 하나하나 탐색을 해도 시간이 얼마 걸리지 않는다.

1초에 2000만번 연산이 가능한 파이썬에게 10만번도 안되는 연산은 1초도 채 걸리지 않는다.

즉, 100만개 이하일 때는 완전 탐색을 하면 충분하다.

 

정답 코드는 파이썬의 문법을 정말 잘 활용한 코드 같다.

난 로직적으로 어떤 경우에 카운팅이 되는지를 생각 했다면 정답 코드는 그저 완전 탐색을 위해 str함수와 + 연산자를 사용해서 문자열로 합친 뒤 in 으로 체크 하여 카운팅 하였다.

이런 방법도 기억해 둬야 겠다 !!!

 

그래도 나 이문제 차근차근 잘 접근해서 푼듯 ㅋㅅㅋ