본문 바로가기
Algorithm/baekjoon

[백준] 10811번 바구니 뒤집기 파이썬 (python)

by eoieiie 2024. 3. 11.

문제

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

도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.

바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.

 

정답코드

n,m = map(int, input().split())
basket = [i for i in range(1,n+1)]
temp = []

for x in range(m):
  i,j = map(int, input().split())
  
  temp = basket[i-1:j]
  temp.reverse()
  basket[i-1:j] = temp

for x in range(n):
  print(basket[x],end=" ")

풀이

  1. n과 m을 입력받는다.
  2. basket 리스트를 선언하고 초기화한다. 
  3. temp 리스트를 선언한다. 
  4. m 만큼 반복하여 입력을 받는데, 
  5. basket의 i부터 j까지의 인덱싱에 해당하는 값을 잠시 temp안에 넣어준다. 
  6. temp 안의 값들을 reverse 함수로 재정렬하고, ( [ :: -1]) 로도 가능하다. 
  7. 다시 basket 안에 temp값을 넣어준다. 

 

느낀 점

내가 처음 해결한 코드는 이렇다.

N, M = map(int, input().split())
lista = [0] * N 

for i in range(N):
    lista[i] = i+1

for i in range(M):
    n, m = map(int, input().split()) 
    n -= 1 
    m -= 1 
    for i in range(((abs(n-m)+1) // 2)):
        b = lista[n + i]
        lista[n + i] = lista[m - i]
        lista[m - i] = b

for i in lista:
    print(i, end = " ")

 

  1. 우선 lista의 초기화를 진행하였고
  2. 입력받은 M만큼 반복하여 n, m을 입력받는다. 
  3. 인덱싱을 진행하기 전 미리 n과 m의 값을 수정하고
  4. 자리의 교환은 다음과 같이 구현하였다:
  5. 먼저 반복할 횟수를 구현하고, 
  6. 그 다음 횟수 변수에 따라 리스트 인덱스의 처음 값과 마지막 값을 temp변수 b를 사용하여 바꾸었고
  7. 처음 값은 1씩 증가, 마지막 값은 1씩 감소시키며 동일한 코드를 반복횟수만큼 진행시켰다. 
  8. 그렇게 만들어진 리스트의 각 요소를 출력하였다.

리스트 초기화를 원하는 범위로 지정하지 않으면 for문으로 해당 범위만큼 할당할 수 없음을 배웠다.

함수들을 많이 알수록 구현의 간결성이 올라간다. reverse함수를 사용했으면 훨씬 편했을텐데.

리스트 초기화 방법을 이제 더 간결하게 할 수 있다.

 

basket = [i for i in range(1,n+1)]

 

파이썬에서는 temp = 0 처럼 변수의 형을 지정해도, b = lista[n + i] 와 같이 해당 변수에 아예 다른 형(리스트)를 넣는 것이 가능하다. C하다가 파이썬 오니까 새삼 놀라게 되는 부분이다. 

 

 

 

 

댓글