퍼즐: 1번 칸에 말 올려! 2번 칸에서 말 내려!

Bubbler @bubbler@hackers.pub

문제

가로로 20개의 빈 칸이 그려진 게임판과 20개의 말이 있습니다. 각각의 빈 칸은 왼쪽부터 순서대로 1부터 20까지 번호가 매겨져 있습니다. 당신은 다음의 동작을 원하는 만큼 수행할 수 있습니다.

  • 1번 칸에 말을 올려놓거나, 1번 칸에 올려져 있는 말을 제거할 수 있습니다.
  • 게임판 위에 말이 적어도 한 개 있다면, 말이 있는 칸의 번호들 중 가장 작은 것을 ii라고 합시다. 그러면 i+1i+1번 칸에 말을 올려놓거나, i+1i+1번 칸에 올려져 있는 말을 제거할 수 있습니다.

이때, 모든 칸에 말이 올려져 있도록 할 수 있을까요? 그렇다면 이를 위해 필요한 최소 동작 횟수는 몇 번일까요?

출처: BOJ 29225. Пещеры의 문제 내용을 퍼즐 형식으로 변경하였습니다.

풀이

스포일러 모든 칸을 채우기 위해서는 일단 20번 칸에 말을 올려야 합니다. 20번 칸에 말을 올리려면 일단 19번 칸에 말을 올려야 하고, ... 2번 칸에 말을 올리려면 일단 1번 칸에 말을 올려야 합니다.

이제 kk번 칸에 말을 올리기 위해 필요한 동작의 횟수를 알아봅시다. 편의상 kk번 칸에 말을 올리는 동작을 k+, 말을 내리는 동작을 k-라고 적습니다.

  • 2번: 1+ 2+
  • 3번: 1+ 2+ 1- 3+
  • 4번: 1+ 2+ 1- 3+ 1+ 2- 1- 4+
  • 5번: 1+ 2+ 1- 3+ 1+ 2- 1- 4+ 1+ 2+ 1- 3- 1+ 2- 1- 5+

여기서 kk번 칸에 말을 올리기 위해 필요한 동작의 수는 2k12^{k-1}임을 유추할 수 있습니다.

좀 더 논리적으로 설명하자면, kk번 자리에 말을 올리기 위해서는 k1k-1번 자리에 말이 있고 1번부터 k2k-2번 자리에는 말이 없는 상태를 만들어야 합니다. 그리고 나서 k+1k+1번 자리에 말을 올리려면 k1k-1번 자리에 있는 말을 제거해야 하는데, 이 과정은 k1k-1번 자리에 말을 올리고 그 앞의 말을 제거하는 과정을 거의 똑같이 반복하면 된다는 사실을 알 수 있습니다. 차이점은 k1k-1번 자리에 말을 올리는 동작이 k1k-1번 말을 제거하는 동작으로 바뀐 것 뿐입니다.

이제 원래의 문제로 돌아와서, 20번 칸에 말을 올리기 위해 필요한 동작의 수는 2192^{19}이고, 이때 19번 칸에도 말이 있으므로 다음으로 채워야 하는 칸은 18번 칸입니다. 이를 반복하면 답은 219+217++21=2(2201)32^{19} + 2^{17} + \cdots + 2^1 = \frac{2(2^{20} - 1)}{3}이 됩니다.

3

No comments

If you have a fediverse account, you can comment on this article from your own instance. Search https://hackers.pub/ap/articles/019811fa-aaab-70a3-a5a4-150607cfac1b on your instance and reply to it.