본문 바로가기

PS/백준

[BOJ] 백준 10811 바구니 뒤집기 (Swift)

반응형

문제

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

 

10811번: 바구니 뒤집기

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

www.acmicpc.net

풀이

[Int](0...n)으로 바구니들을 초기화 해줍시다.

뒤집는 것을 어떻게 할 수 있을까요?
revered() 메서드를 사용하여 뒤집을 수 있습니다.

reversed는 어떻게 활용할 수 있을까요?
Array의 replaceSubrange 메서드를 사용하여, 풀이할 수 있습니다.

단순히 Array에서 뒤집을 범위를 뒤집어서 넣어주면 되겠죠?
예를 들어 [1, 2, 3, 4, 5] 란 배열이 있는데, 2 부터 4까지를 뒤집고 싶다면..?
[2, 3, 4][4, 3, 2]를 넣어주면 됩니다.

아니면 정해진 범위 내에서 처음 것와 마지막 것을 바꾸고, 처음 + 1과 마지막 - 1 을 바꾸고.. 이를 반복해도 뒤집을 수 있습니다.
1 2 3 4 5
5 2 3 4 1
5 4 3 2 1
과 같이 말이죠!

start 값이 end 값 보다 작을 때 까지 반복하면 되겠네요.

두 가지 방법을 모두 사용해서 풀이해보았습니다.

소스코드

후기

두가지 방법으로 풀이해보았는데, 다양한 풀이 방법을 알면 좋을 것 같습니다.
n이 뒤집을 범위라고 가정하면
swapAt 하는 방법은 $O(n/2) = O(n)$ 만큼의 시간이 걸릴 것 이고,
replaceSubrange는 뒤집는 reversed가 $O(1)$이고, replaceSubrange가 $O(n)$ 이기 때문에, 비슷할 것 같기도하고..

반응형