본문 바로가기

알고리즘 공부/알고리즘 구현 기초

백준) 바구니 뒤집기-파이썬

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

(브론즈 2 문제)

 

10811번: 바구니 뒤집기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2

www.acmicpc.net

입력

5 4
1 2
3 4
1 4
2 2

출력

3 4 1 2 5

내 코드

N,M=map(int,input().split())
result=[i+1 for i in range(N)]
for i in range(M):
    n,m=map(int,input().split())
    #알고리즘쪽 역순 reverse까진 생각했으나 어떻게 구현해야할지 생각이 안남
    
for i in range(N):
    print(result[i],end=" ")

풀이(생각 과정)

처음에 값을 받는 과정, 리스트 초기화 하는 방법, 출력 방법 등은 앞서 풀었던 문제 공 넣기나 공 바꾸기와 유사해서 금방 구현하였다.

 

특정 바구니의 번호 2개(n,m)을 받고 그 범위 내에 있는 바구니를 역순한다는 것에서 reverse 내장 함수를 이용해서 구현하면 되겠구나라는 생각까진 했으나 그 방식을 어떻게 구현하는지 도저히 생각이 나지 않았다.

다른 풀이

N,M=map(int,input().split())
result=[i+1 for i in range(N)]
for i in range(M):
    n,m=map(int,input().split())
    temp=result[n-1:m]
    temp.reverse()
    result[n-1:m]=temp
    
for i in range(N):
    print(result[i],end=" ")

알고리즘을 다음과 같이 구현했다.

 

먼저 temp 값에 result 리스트의 특정 부분(n부터 m까지의 범위)을 슬라이싱 해서 저장해둔다. 이때 인덱스는 0번부터 시작하므로 n-1에서 부터 m까지 슬라이싱 한다.

 

슬라이싱 한 temp 값을 reverse 내장 함수를 이용해서 역순으로 바꿔준다. 그 후 역순으로 바뀐 temp를 reverse의 슬라이싱한 부분에 대입하여 갱신하는 것으로 일부 요소를 역순으로 바꿔주는 알고리즘을 만들었다.

배운 점

역순으로 바꿔주는 것을 생각하지 못한 이유는 아무래도 슬라이싱 개념이 부족해서라고 생각한다.

 

파이썬 슬라이싱이란 연속적인 객체들에 범위를 지정해 선택해서 객체들을 가져오는 방법 및 표기법이다.

a라는 연속적인 객체들의 자료구조(리스트,튜플,문자열)이 존재한다고 했을때 기본 형태이다.

a[start : end : step]

start는 슬라이싱을 시작할 위치(인덱스 번호)

end는 슬라이싱을 끝낼 위치(end는 포함하지 않음, 인덱스 번호)

step은 몇개씩 끊어서 가져올지 방향

3개 다 정수를 사용하며, 음수 사용시 제일 뒤를 -1로 시작하여 번호를 앞쪽으로 감소하면서 매긴다.

 

또한 result[n-1,m]=temp 와 같이 리스트의 일부분에 갱신하여 넣을 수도 있다.