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 와 같이 리스트의 일부분에 갱신하여 넣을 수도 있다.
'알고리즘 공부 > 알고리즘 구현 기초' 카테고리의 다른 글
백준)알파벳 찾기-파이썬 (0) | 2023.07.17 |
---|---|
백준) 평균-파이썬 (0) | 2023.06.23 |
백준) 과제 안 내신분...?-파이썬 (0) | 2023.06.23 |
백준) 공 바꾸기-파이썬 (0) | 2023.06.22 |
백준) 공 넣기-파이썬 (0) | 2023.06.20 |