코딩 테스트/삼성 SW 역량 테스트 기출 문제

2. [백준 12100번 / C++] 2048(Easy)

SeoKyung 2024. 3. 4. 06:43

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

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2

www.acmicpc.net

 

삼성 SW 역량테스트 기출 문제 2번 문제 2048(Easy)이다.

 

1번과 마찬가지로 2048이라는 게임을 소개하는데 마찬가지로 내가 스마트폰 게임으로 많이 플레이해봤기 때문에 문제를 이해하는데에는 전혀 문제가 없었다.

 

하지만 모르는 사람이 있을 수 있으니 이 게임에서 가장 중요한 조건은 다음과 같다.

 

1. <그림>의 모든 블록은 (상, 하, 좌, 우) 움직이는 방향으로 한꺼번에 움직인다.

2. 이동중에 같은 값을 가진 블록을 만날 경우 두 블럭의 값을 하나의 블록으로 합친다.

3. 문제의 <그림 12>, <그림 13>에서 설명되어 있는데 블록이 한번의 움직임에 대해서 합쳐질 때, [2 2 2 2]가 한번에 합쳐서 [8 - - -]이 되는 것이 아닌 [4 4 - -]로 합쳐진다. 

 

가장 중요한 조건은 3번인데 이 3번을 구현하는게 정말 쉽지 않았다.

 

그런데 사실 살펴보면 이전에 풀었던 구슬 탈출과 문제가 굉장히 유사하다. 문제를 살펴보면 구현 아이디어

 

1. 입력받은 Board에 대해서 한쪽으로 블럭을 쭉 밀어버리는 move함수를 구현한다.

2. 상하좌우로 이동하는 대신에 입력받은 Board를 회전시키는 rotate함수를 구현한다.

== 즉, 방향을 굳이 설정할 필요없이 rotate -> move를 하면 상하좌우로의 이동을 모두 구현할 수 있다.

 

이다. 큰돌님의 '10주완성 C++ 코딩테스트'에서 예전에 풀어봤었던 문제를 다시 풀어본 문제고 새로 내 풀이로 해석해서 푼 게 아니라 아예 풀이법을 외워서 푸는 바람에 이 문제의 포스팅은 여기까지만 하겠다.