[BOJ] 좋은 수열

김가영·2021년 3월 3일
0

Algorithm

목록 보기
66/78
post-thumbnail

BOJ 2661 골드 4

import sys
from collections import deque
input = sys.stdin.readline

def isGood(x):
    for i in range(1,len(x)):
        if x[-i:] == x[-2*i:-i]:
            return False
    return True

target = int(input())
answer = ''
v = '1'
visited = set()
while len(v) < target:
    for i in ['1','2','3']:
        if i == v[-1]:
            continue
        if v + i not in visited and isGood(v+i):
            v = v + i
            visited.add(v)
            break
    else:
        v = v[:-1]

print(v)

bfs 를 이용하려고 했는데 시간초과가 났다.
그래서 일단 가능한 값 중 가장 작은 값을 골라나가면서 visited 에 방문한 것을 저장하고, 수열이 더 만들어지지 않는 상황이 생기면 v의 끝을 지워나갔다. 그 후에는 visited 에 존재하는 것은 skip 하므로 다른 값을 이용한 수열을 만들 수 있다.


isGood 은 좋은 수열인지 판단하는 함수이다. 가능한 부분수열의 크기를 i로 놓고 x의 끝을 비교한다. 새로운 것을 하나 붙일 때마다 isGood 함수를 호출하므로, 마지막 문자를 제외하면 모두 좋은 수열임을 전제로 한다.

profile
개발블로그

0개의 댓글