알고리즘 분류 : 구현, 정렬, 구성적
https://www.acmicpc.net/problem/15887
15887번: 욱제는 결벽증이야!!
욱제는 카드 게임에서 1부터 N까지의 정수가 중복되지 않게 하나씩 적혀있는 N개의 카드를 배정 받았다. 욱제는 배정 받은 카드를 책상 위에 일렬로 배열했다. 하지만 결벽증이 있는 욱제는 카드
www.acmicpc.net
[ 풀이 ]
이 문제는 주어진 리스트를 정렬하기 위해서 필요한 횟수와 리스트의 어떤 부분을 reverse 하면 되는지 구하는 문제다.
이 문제는 리스트가 정렬되기 위해서 최수 횟수를 구하는 게 아니기 때문에 하나씩 그 자리를 맞춰주면 된다.
예를 들어, [2, 1, 5, 4, 3]을 [1, 2, 3, 4, 5]로 만들기 위해서는 아래의 과정이 필요하다.
리스트의 첫 번째 칸에 1이 있으면 2로 넘어가고, 1이 없다면 리스트에 1이 있는 칸과 맨 앞의 칸까지의 [2 ,1]을 reverse 해서 [1, 2]로 만든다. 그러면 두 번째 칸에는 2가 있으므로 3으로 넘어가고, 3은 세 번째 칸에 없으므로 [5, 4, 3]을 reverse 해서 [3, 4, 5]로 만든다. 이때 그 두 숫자의 자리만 바꾸는 것이 아니라 그 두 숫자를 앞뒤로 하는 리스트 전체를 reverse 하는 것이다.
[ 코드 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
n=int(input())
a=list(map(int,input().split()))
b=a.copy()
b.sort()
i=1
op=0
ch=[]
while a!=b:
if a[i-1]!=i:
op+=1
k=a.index(i)+1
a[i-1:a.index(i)+1]=a[i-1:a.index(i)+1][::-1]
ch.append([i,k])
i+=1
print(op)
for i in ch: print(*i)
|
[ 코드 설명 ]
리스트 b에 리스트 a를 복사해서 b는 먼저 정렬을 해놓고 while문으로 원래 리스트 a가 정렬된 리스트 b와 같은 때까지 반복한다. if문을 돌면서 리스트 a에 i-1번째 칸에 i가 없으면 리스트 a에 i가 있는 칸부터 i-1번째 칸까지 reverse를 한다. 그리고 i를 1씩 더해주면서 계속 돌다가 리스트 a가 정렬이 되면 끝이 난다.
'코딩 > 백준' 카테고리의 다른 글
[백준] 15888번 : 정답은 이수근이야!! (Python 파이썬) (0) | 2021.07.25 |
---|---|
[백준] 2840번 : 행운의 바퀴 (Python 파이썬) (0) | 2021.04.04 |
[백준] 1091번 : 카드 섞기 (Python 파이썬) (0) | 2021.04.03 |
[백준] 1700번 : 멀티탭 스케줄링 (Python 파이썬) (0) | 2021.02.22 |
[백준] 2858번 : 기숙사 바닥 (Python 파이썬) (0) | 2021.02.21 |