관리 메뉴

100세까지 코딩

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

코딩테스트/파이썬

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

100세까지 코딩 2024. 1. 9. 15:25
문제

나의 생각
  • 투 포인터를 쓴다.
  • 시작값인 i는 오른쪽으로 전진. 즉 i+=1
  • 끝값인 j는 왼쪽으로 전진. 즉 j-=1
  • 시작값이 끝값과 같거나 커지면 종료. 즉 끝값이 시작값보다 큰 경우까지만 반복. while j > i
나의 풀이
N, M = map(int, input().split())
number_list = [i for i in range(1, N + 1)]
for _ in range(M):
    i, j = map(int, input().split())
    while j > i:
        number_list[i - 1], number_list[j - 1] = number_list[j - 1], number_list[i - 1]
        i += 1
        j -= 1
print(*number_list)
새롭게 배운 풀이
N, M = map(int, input().split())
number_list = [i for i in range(1, N + 1)]

for _ in range(M):
    i, j = map(int, input().split())
    temp_list = number_list[i - 1:j]
    temp_list.reverse()
    number_list[i - 1:j] = temp_list
print(*number_list)
참고 
1. 슬라이싱을 통해 list를 분리해 복사할 수 있다. (깊은 복사 : 원본의 list에 영향 안줌)
2. list의 내장함수 reverse()를 사용하면 list를 역순으로 바꿔준다.
3. 슬라이싱을 통해 기존 list에 temp_list를 복사할 수 있다.
4. 단, 슬라이싱한 개수와 대입할 list개수가 다르면 슬라이싱 자리에 temp_list를 넣은 후 남은 값 그대로 복사
    ex) number_list = [1,2,3,4,5]
          temp_list= [3,2,4] 
          number_list[0:1] = temp_list  
          print(number_list)   결과 : [3, 2, 4, 2, 3, 4, 5]