[Python] 백준 10811 | 바구니 뒤집기 - 리스트 역순으로

heige·2023년 11월 30일
0

BOJ

목록 보기
4/46
post-thumbnail

문제

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

풀이

방법 1 | for문만 이용

N, M = map(int, input().split())
li = [i + 1 for i in range(N)]
temp = 0
for _ in range(M) :
    i, j = map(int, input().split())
    for k in range((j-i)//2 + 1) : #역순으로 바꾸는 횟수 
        temp = li[i-1+k]
        li[i-1+k] = li[j-1-k]
        li[j-1-k] = temp

print(*li)

이 풀이에서도 계속 에러가 났다.
for문 내 for문을 보면, 원래 range((j-i)//2) 로 했는데 계속 에러 나길래 손코딩 하면서 검사해봤다.
예를 들어 i = 1, j = 4일 경우 1, 2, 3, 4의 인덱스를 역순으로 바꿔야 하는데 range((j-i)//2)일 경우
1 ↔️ 4
2 ↔️ 3
2번 바꿔야 할 것을 1번 밖에 바꾸지 못한다.
수정 했더니 맞았음

방법 2 | reverse() 메소드 이용

#revers() 메소드 이용

N, M = map(int, input().split())
li = [i + 1 for i in range(N)]
temp = 0
for _ in range(M) :
    i, j = map(int, input().split())
    if i == j : pass
    else :
        tmp_li = li[i-1:j]
        tmp_li.reverse()
        li[i-1:j] = tmp_li 

print(*li)

reverse() 함수를 이용한다.

li[i-1:j] = tmp_li
이 부분을 보면, tmp_li에 복사해둔 리스트를 기존 리스트에 범위 지정해서 바로 대입 가능하다는 걸 알 수 있다.

이 문제는 생각할 게 많았다.
방법 2로 풀면 확실히 python이 손쉽게 풀린다. python이 편한 이유..
그러나 python만 쓸 거 아니고 머리 쓰는 연습을 해야 되기 때문에 ㅋㅋ

💡 개념 정리

리스트 요소 한 번에 출력

arr = [1, 2, 3, 4]
print(*arr)
4 3 2 1
  • 위와 같이 * 을 붙여주면 리스트의 내용을 대괄호 없이 한번에 출력할 수 있다.
  • 이유는 Python 리스트에 Asterisk(*) 를 사용하면 리스트 압축 해제를 할 수 있기 때문이다.

리스트 순서 뒤집기

슬라이싱 사용하기

li = [1, 2, 3, 4, 5]
reversed_li = li[::-1]

print(reversed_li)

li[::-1]은 순서가 뒤집어진 li 리스트가 된다.

하지만 원본 리스트는 바뀌지 않는다.

reverse() 메소드 사용하기

li = [1, 2, 3, 4, 5]
li.reverse()

print(li)
  • 리스트의 메서드 중 하나인 reverse()는 해당 리스트의 순서를 뒤집는다.
  • 원본 리스트 자체의 순서가 바뀐다.

내장함수 reversed() 사용하기

li = [1, 2, 3, 4, 5]
reverse_li = list(reversed(li))

print(reverse_li)
  • reverse() 내장함수는 주어진 시퀀스 (리스트, 튜플 등)에 대해 순서가 뒤집어진 iterator 객체의 형태로 반환하기 때문에 내장함수 list()를 이용해서 리스트 자료형으로 변환해준다.

  • 원본 리스트 close의 순서는 바뀌지 않는다.

profile
웹 백엔드와 클라우드 정복을 위해 탄탄한 기반을 쌓아가고 있는 예비개발자입니다. 'IT You Up'은 'Eat You Up'이라는 표현에서 비롯되어, IT 지식을 끝까지 먹어치운다는 담고 있습니다.

0개의 댓글