• Home
  • About
    • Awesome soubii photo

      Awesome soubii

      초보 개발자의 공부정리용 블로그입니다. 잘못 쓰여진게 있다면 친절히 알려주세요 :)

    • Learn More
    • Twitter
    • Facebook
    • Instagram
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

[Algorithm]1436 영화감독 숌 By Python3

09 Aug 2020

Reading time ~1 minute

오늘의 문제

https://www.acmicpc.net/problem/1436

포인트 쳌쳌

  1. while 문으로 1씩 증가시키며 원하는 n번째 숫자를 찾을 때까지 반복한다.
  2. “666”을 포함해야 한다.
  3. 숫자 6은 연속으로 존재해야 한다.
  4. 숫자 순서는 대략 666, 1666, 2666, 3666, 4666, 5666, 6660, 6661, 6662, … 와 같다.

처음 시도했던 코드는 이랬다.
숫자 6이 나오면 그 바로 앞자리도 6인 경우 그 연속된 경우를 카운트하여 답을 찾고자 했다.

n = int(input())
start = 665
result = 0
while n > 0:
    cnt = 0
    seq = list(str(start)) #숫자 리스트
    for i in range(1,len(seq)):
        if seq[i] == '6':
            if seq[i-1] == seq[i]:
                cnt += 1

        if cnt >= 2:
            result = start
            n -= 1
            break
    start += 1
print(result)

n=1, 2, 10, 14와 같이 비교적 작은 숫자들로 테스트케이스를 확인했을 때는 잘 통과하길래 맞는 줄 알았지만
간과한 것은 연속된 6 세 자리 이상이다. 위 코드로는 6606과 같이 연속으로 배열된 숫자가 아니라도 결과값 result에 담겨져버린다.

두번째 시도한 것은 다음 코드이다. 통과는 했지만 시간이 1분 이상 어어어어어어ㅓ어엄청나게 소요됐다.

n = int(input())
start = 665
result = 0
while n > 0:
    cnt = 0
    seq = list(str(start)) #숫자 리스트
    for i in range(1,len(seq)):
        if seq[i] == '6':
            if seq[i-1] == seq[i]:
                cnt += 1
            else:
                cnt = 0

        if cnt >= 2:
            result = start
            n -= 1
            break
    start += 1
print(result)

그러다 구글링을 해본 결과 파이썬으로는 대부분 이 코드로 푸신 것 같다.
문장이 훨씬 간결할뿐더러 위 코드보다 시간이 절반 그 이상으로 줄었다!
모두들 굉장해……

n = int(input())
start = 665

while n > 0:
    if '666' in str(start):
        n -= 1
    start += 1

# n번째 까지 답이 구해진 후에 
# start += 1문장에 의해 결과값+1이 되므로 -1을 해주어야 한다.
print(start-1)

채점 결과

1436_Boj_time



algorithmbojpython3 Share Tweet +1