ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1469. [Python]숌 사이 수열
    Python_알고리즘/Gold V 2024. 10. 8. 22:34

    1. 문제

     

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

     

    2. 접근 방법

     

    • 시간 제한: 2초
    • 메모리 제한: 128MB
    • 브루트 포스
    • 백트래킹

     

    3. 파이썬 코드

     

    import sys
    # 재귀 제한 해제
    sys.setrecursionlimit(10000)
    # 백트래킹
    def backtracking(cnt):
        # 리스트 2배의 길이가 됐을때 종료
        if cnt == N*2:
            print(*answer)
            exit()
            return
        # 리스트 안의 값 순회
        for value in num_list:
            # 딕셔너리 값이 존재할 경우
            if num_dict[value] > 0:
                # 딕셔너리 값이 2인 경우 백트래킹
                if num_dict[value] == 2:
                    answer.append(value)
                    num_dict[value] -= 1
                    backtracking(cnt+1)
                    answer.pop()
                    num_dict[value] += 1
                # 이미 한번 나온 경우
                elif num_dict[value] == 1:
                    # 현재 값의 인덱스 위치 찾기
                    idx = answer.index(value)
                    # 현재 cnt 값에서 idx + 1 한 값이 현재 값과 같은경우 같은수이므로 백트래킹
                    if cnt - (idx + 1) == value:
                        answer.append(value)
                        num_dict[value] -= 1
                        backtracking(cnt+1)
                        answer.pop()
                        num_dict[value] += 1
    
    
    N = int(input())
    num_list = list(map(int, input().split()))
    # 사전 순 먼저 나온것이므로 숫자 정렬
    num_list.sort()
    num_dict = {}
    # 초기 딕셔너리 2로 고정
    for i in num_list:
        num_dict[i] = 2
    
    answer = []
    # num_list 내부 순회 백트래킹
    for i in num_list:
        answer = [i]
        num_dict[i] -= 1
        backtracking(1)
        num_dict[i] += 1
    else:
        print(-1)

     

    4. 문제를 풀고난 후 생각

     

    • 처음 접근할 때 index 를 통한 접근을 진행했다가 들어오는 값을 바탕으로 딕셔너리를 구성해야 하는것을 뒤늦게 깨닫고 코드를 수정했다.
    • 백트래킹을 진행하는 과정에서 불필요한 연산을 줄이기 위해 딕셔너리 값을 이용하여 가지치기를 진행했다. 또한 사전 순으로 가장 빠른 것을 출력해야 했기 때문에 기존 리스트를 sort 처리하여 정렬한 후 연산을 진행함
    • 딕셔너리 값이 2인 경우 백트래킹 진행, 1인 경우 현재 cnt 값을 통한 몇번째 인덱스를 저장할 차례인지 체크 후 현재 값의 인덱스 위치를 구하여 뺀 값이 현재 value 값과 같은 경우 그 사이 value 의 숫자가 존재하기 때문에 백트래킹 진행 외의 경우 연산하지 않음을 구현했다.

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 브루트 포스
    • 백트래킹

    'Python_알고리즘 > Gold V' 카테고리의 다른 글

    13398. [Python]연속합 2  (0) 2025.03.16
    3980. [Python]선발 명단  (1) 2024.10.21
    14719. [Python]빗물  (0) 2024.09.30
    2294. [Python]동전 2  (1) 2024.09.05
    2293. [Python]동전 1  (0) 2024.09.05

    댓글

Designed by Tistory.