본문 바로가기
Algorithm/Graph

[파이썬] 백준 1327 : 소트게임 (골드5)

by 베짱이28호 2023. 8. 24.

[파이썬] 백준 1327 : 소트게임 (골드5)

 

1327번: 소트 게임

홍준이는 소트 게임을 하려고 한다. 소트 게임은 1부터 N까지 정수로 이루어진 N자리의 순열을 이용한다. 이 게임에선 K가 주어진다. 어떤 수를 뒤집으면, 그 수부터 오른쪽으로 K개의 수를 뒤집

www.acmicpc.net


문제


풀이

0. 방향성 생각

  • visit에 뒤집은 배열들을 문자열 형태로 변환해서 방문처리한다.
  •  

1. 입력

from collections import deque

n,k = map(int,input().split())
arr = input().split()
visit = set()
goal = sorted(arr)

 

2. 뒤집기 함수 정의

def flip(array,x):
    temp = array[:]
    temp[x-1:x-1+k] = temp[x-1:x-1+k][::-1]
    return temp

 

3. 출력

q = deque([(arr,0)])
while q:
    a,t = q.popleft()
    if a == goal:
        print(t)
        break

    for i in range(n-k+1):
        na = flip(a,i+1)
        na_str = ''.join(na)
        if na_str not in visit:
            q.append((na,t+1))
            visit.add(''.join(na))
else:
    print(-1)
  • 바꿀 수 있는 모든 경우의 수를 탐색한다.
  • 방문하지 않은 경우는 큐에 추가하고, 문자열로 변환하여 visit에 추가한다.

전체코드

from collections import deque

n,k = map(int,input().split())
arr = input().split()
visit = set()
goal = sorted(arr)

def flip(array,x):
    temp = array[:]
    temp[x-1:x-1+k] = temp[x-1:x-1+k][::-1]
    return temp


q = deque([(arr,0)])
while q:
    a,t = q.popleft()
    if a == goal:
        print(t)
        break

    for i in range(n-k+1):
        na = flip(a,i+1)
        na_str = ''.join(na)
        if na_str not in visit:
            q.append((na,t+1))
            visit.add(''.join(na))
else:
    print(-1)

코멘트

백준 1525 퍼즐이랑 비슷함

댓글