문제 설명
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다.
도현이는 앞으로 M번 바구니의 순서를 회전시키려고 만들려고 한다. 도현이는 바구니의 순서를 회전시킬 때, 순서를 회전시킬 범위를 정하고, 그 범위 안에서 기준이 될 바구니를 선택한다. 도현이가 선택한 바구니의 범위가 begin, end이고, 기준이 되는 바구니를 mid라고 했을 때, begin, begin+1, ..., mid-1, mid, mid+1, ..., end-1, end 순서로 되어있는 바구니의 순서를 mid, mid+1, ..., end-1, end, begin, begin+1, ..., mid-1로 바꾸게 된다.
바구니의 순서를 어떻게 회전시킬지 주어졌을 때, M번 바구니의 순서를 회전시킨 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에는 바구니의 순서를 바꾸는 만드는 방법이 주어진다. 방법은 i, j, k로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 회전시키는데, 그 때 기준 바구니는 k번째 바구니라는 뜻이다. (1 ≤ i ≤ k ≤ j ≤ N)
도현이는 입력으로 주어진 순서대로 바구니의 순서를 회전시킨다.
출력
모든 순서를 회전시킨 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.
문제 분석 과정
총 n 개의 바구니를 갖고 있으므로 1 부터 n 까지의 배열을 생성한다.
m 번을 회전 시킬 것이므로 for문을 통해 단순 반복과정을 처리한다.
이제 1번 회전 할 때를 살펴보자.
1번 처리 할때, 배열의 순서는 begin mid end -> mid end begin 으로 변하게된다.
이런 경우는, 슬라이싱한후 갖다 붙이면 된다. (시간복잡도가 좋지는 못하겠지만 ,,ㅎ)
입력값을 받을 때도 주의해야한다, begin, mid, end 순이 아니라 begin, end, mid 순 이다
배열에서 인덱스는 0 부터 카운팅하므로,, 1씩 - 해준다.
배열의 슬라이싱을 할때 범위에 유의한다.
소스코드
n,m = map(int,input().split())
# 총 n 개의 바구니를 갖고 있고
arr = [i for i in range(1,n+1)]
# m 번을 회전 시킨다.
# 1번 회전 할 때
# begin mid end -> mid end begin 이된다.
# 슬라이싱한후 갖다 붙이면 된다.
# m번의 시행
for _ in range(m):
# 바구니를 1번 시행 시키기위한 피벗값을 입력받음
begin, end, mid = map(int,input().split())
# begin to end 만 회전시키고, 기준은 mid 이다.
# mid를 기준으로 인덱스 슬라이싱을 하면 된다.
begin -= 1;end -= 1;mid -= 1
# 배열에서 인덱스는 0 부터 카운팅하므로,, 1씩 - 해준다.
arr[begin:end+1] = arr[mid:end+1] + arr[begin:mid]
# 배열의 슬라이싱을 할때 범위에 유의한다.
print(*arr)
분류
구현(implementation), 시뮬레이션(simulation)
'PS > Implementation' 카테고리의 다른 글
[PS][BOJ/1181]-단어 정렬 (0) | 2023.04.04 |
---|---|
[PS][BOJ/10813]-공 바꾸기 (0) | 2023.02.23 |
[PS][BOJ/2439]-별 찍기-1 (0) | 2023.02.20 |