For Programmer

백준 2661번 파이썬 문제풀이(좋은수열) 본문

코팅테스트/백준 문제 모음

백준 2661번 파이썬 문제풀이(좋은수열)

유지광이 2022. 3. 3. 22:05
728x90


 

이 문제 골드 4이지만 파이썬의 슬라이싱 쓰면 인덱스가 범위를 넘어가는 부분을 고려하지 않아도 돼서 아주 쉽게 한줄로 풀 수 있다.  단, 인덱스를 고려하게 된다면 다음 밑의 if문에 인덱스가 넘어가는 부분을 다음과 같이 고려해야 한다. 

if len(num) >= 2 * k and j <= len(num) - 2 * k and num[j: j + k] == num[j + k:j + 2 * k]:

하지만 슬라이싱은 인덱스가 넘어가도 인덱스에러가 발생하지 않기 때문에 밑의 조건문 같이 구현해주면 쉽게 문제를 해결할 수 있다.

def dfs(depth, num):
    global exit_flag

    if exit_flag:  # 재귀 전체 종료 변수 체킹
        return

    if 1 <= depth <= N:  # 길이가 1부터 N 까지
        for j in range(len(num) - 1):  # 마지막 전 변수까지
            for k in range(1, len(num) // 2 + 1):  # 1개부터~문자열 길이의 절반까지 비교한다.
                if num[j: j + k] == num[j + k:j + 2 * k]:  # 만약 j 부터 j + k 까지와 j + k 부터 j + 2k 까지의 배열이 동일하다면
                    return  # 나쁜수열 이므로 리턴

    if depth == N:
        print(num)  # 첫 number 찾고
        exit_flag = True  # 바로탈출 변수 True
        return  # 재귀 전체 종료

    for i in range(1, 3 + 1):
        dfs(depth + 1, num + str(i))


N = int(input())
exit_flag = False

dfs(0, '')

 

728x90
Comments