본문 바로가기

알고리즘 삽질장

[이코테] 구현 - 시각

반응형

해당 포스팅의 문제의 출처는 나동빈님의 이것이 취업을 위한 코딩 테스트 교재를 공부하면서 풀이할 때 본인의 사고 과정 흐름과 문제 풀이를 기록하기 위함 입니다. 

 


문제설명

정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 구하는 프로그램을 작성해라.

입력조건

  • 첫째 줄에 정수 N이 입력된다.(0 <= N <= 23)

출력조건

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

사고과정

  • 처음에 문득 생각한건 3중 반복문이었다.
  • 그런데 갑자기 예전에 풀었을 때 while문으로 풀었던 것 같은데 라는 근거 없는 기억 때문에 갑작스레 while문으로 아이디어를 바꾸어서 시간이 더 걸렸다. 아이러니한건 책의 풀이도 3중 반복문을 사용...(예전 기억에 좀 의존하지 좀 말자...🤬)
  • 당시에는 생각 못했지만, 해설에서 00시 00분 00초부터 최악의 경우 23시 59분 59초라고 해도 전체 경우의 수가 86,400가지 밖에 안되어서 완전 탐색이 가능하다는 것을 알 수 있다.(보통 완전탐색은 데이터 개수가 100만개 이하일 때 사용하는 것을 권장한다고 함)
  • 3이 포함되는 것은 시간을 다 문자열로 붙여서 '3'이 포함 여부 기준으로 경우의 수를 카운트 하도록 했다. 이는 풀이랑 일치했다

풀이

1. 나의 풀이

while 반복문을 사용함

n = int(input())
hour = 0
minute = 0
second = 0
cnt = 0
while True:
    second += 1
    if second == 60:
        minute += 1
        second = 0
    if minute == 60:
        hour += 1
        minute = 0
    # 시간 문자열로 바꾸기
    time = str(hour)+str(minute)+str(second)
    if time.find('3') != -1:
        cnt += 1

    if hour == n+1:
        break

print(cnt)

2. 책의 풀이

3중 반복문을 활용

n = int(input())
cnt = 0

for h in range(n+1):
    for m in range(60):
        for s in range(60):
            time = str(h)+str(m)+str(s)
            if '3' in time:
                cnt += 1

print(cnt)
반응형