CODING TEST/Beakjoon

[백준 / 10811 / python] 바구니 뒤집기

더라 2023. 9. 23. 19:47
728x90

문제

 

문제 보러 가기

백준(10811) - 바구니 뒤집기

 

10811번: 바구니 뒤집기

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

www.acmicpc.net

입출력 조건

입력 첫 줄) 바구니 개수, 입력 받을 횟수
역순으로 만들 바구니 위치의 시작과 끝 
출력 과정이 완료된 바구니의 상태

 

 


풀이

풀이 1번

arr=[]
def change_values(a, b):
    sub = b-a
    mid = sub//2
    if sub % 2 == 1:
        mid+=1
    cnt = 0
    for index in range(a, a+mid):
        tmp = arr[b-cnt]
        arr[b-cnt] = arr[index]
        arr[index] = tmp
        cnt += 1

n, m = map(int, input().split())
for k in range(n):
    arr.append(k+1)

for _ in range(m):
    i, j = map(int, input().split())
    change_values(i-1, j-1)

for c in range(n):
    print(arr[c], end=' ')

1) 값 교환을 위한 change_value()정의한다.

1.1) 매개변수로 범위의 시작(a)과 끝(b)을 받는다.

1.2) 시작과 끝의 범위 차를 구해 길이를 알아내고 이를 2로 나눈다. 해당 과정의 값을 mid에 저장한다.

1.3) 만약 길이가 홀수이면 mid값을 1증가 시킨다.

(mid가 1이고, a=0인경우 range(a, a+mid) = range(0, 1)과 동일해 0~1이 아닌 0인 1번만 수행)

1.4) cnt = 0, cnt는 반복분의 횟수를 나타낸다.

1.5) 범위의 시작(a)부터 a+mid까지 반복문을 반복시킨다.

1.6) (맨 앞과 맨 뒤), (맨 앞 + cnt, 맨 뒤 - cnt)처럼 구분하여 값을 교환한다.

arr[b-cnt]를 임시변수 tmp에 저장한다.

→ arr[b-cnt]에 arr[index]를 대입한다.

→ arr[index]에 tmp를 대입한다.

→ cnt를 1증가시킨다.

위의 과정을 통해 범위 안의 배열 값이 역순으로 교환된다.

2) 배열의 길이인 n과 교환횟수인 m을 입력받는다.

3) m번 배열을 역순으로 바꿀 범위인 i, j를 입력 받는다.

i, j를 change_value()에 넘긴다.

4) 위의 과정을 마친 배열을 출력한다.

 

 

 

 

풀이 2번 - reverse() 사용

arr=[]
tmp_arr=[]

n, m = map(int, input().split())
for k in range(n):
    arr.append(k+1)

for _ in range(m):
    i, j = map(int, input().split())
    for a in range(i-1, j):
        tmp_arr.append(arr[a])
    tmp_arr.reverse()
    index=0
    for b in range(i-1, j):
        arr[b]=tmp_arr[index]
        index+=1
    tmp_arr.clear()

for c in range(n):
    print(arr[c], end=' ')

1) 배열의 길이인 n과 교환횟수인 m을 입력받는다.

2) m번 배열을 역순으로 바꿀 범위인 i, j를 입력 받는다.

3) i~j범위의 배열을 tmp_arr에 담아 reverse()한다.

4) tmp_arr의 값을 arr의 i~j인덱스 위치에 삽입한다.

5) tmp_arr를 clear()를 통해 비운다.

6) 위의 과정을 마친 배열을 출력한다.

 

728x90