이번 문제는 프로그래머스의 레벨 3 리틀 프렌즈 사천성이다.
이 문제는 2017 카카오코드 본선
문제라고 한다.
문제를 풀며 내 구현 능력이 많이 부족하다는 것을 느낄 수 있었다.
문제를 차근차근 읽어보자.
우리가 흔히 아는 사천성과 유사한 게임이다.
100 x 100
의 판이 최대 크기로 주어지게 되며,
맞는 카드 짝을 찾아서 모두 없애면 되는 게임이다.
하지만 기존 사천성과는 다르게 경로가 한 번 이상 꺾이면 안된다.
문제를 어떻게 해결해야 할까?
완전 탐색?
처음에는 완전탐색으로 해결을 해야 할까? 생각했다.
그 이유는 짝을 짓는 순서에 따라 결과가 달라지기 때문이다.
직접 모든 순서를 조합으로 구한 다음 짝을 없애주어야 한다고 생각했다.
하지만 이는 너무 많은 시간이 소요된다.
문제에서는 최대 26
가지의 알파벳이 등장할 수 있다고 했다.
26
개로 모든 조합을 만들어 짝을 짓는 것은 너무 복잡하다.
따라서 완전탐색을 사용하는 문제는 아닌 것 같다.
DFS / BFS
우선 짝을 짓는데에는 DFS나 BFS를 사용하는 것이 맞다고 생각했다.
경로를 검사하며 나아가야하니, 경로를 매회 저장해야 한다.
그럼 DFS를 사용한다면 매개변수로 꺾은 횟수를 넘기면 되고,
BFS를 사용한다면 큐에 꺾은 횟수를 함께 저장하면 될 것이다.
단순 구현
짝을 지어주는 방법은 생각이 났으나, 순서를 결정할 방법이 떠오르지 않았다.
결국 다른 사람들의 풀이를 참고하게 되었다.
사실은 그냥 단순하게 구현을 하면 되는 것이었다.
어차피 모든 카드는 알파벳으로 주어진다는 점을 이용한다.
26칸의 배열에 알파벳 별로 위치를 저장하도록 하는 것이다.
배열의 앞에서 부터 탐색을 하면, 자연스레 알파벳 순으로 정렬이 될 것이다.
단, 우리는 while
문을 통해서 반복적으로 탐색을 해야 한다.
이 부분에서 아까 내가 고민했던 짝을 지을 순서가 해결되는 것이다.
A~Z
까지 순서대로 탐색하며 현재 상황에 가능한 짝을 먼저 짓는 것이다.
BFS
로 탐색을 하며, 짝을 지을 수 있는 알파벳이라면?
바로 해당 짝을 보드에서 지워주고, 배열 내에서도 삭제해준다!
그럼 다음 iteration
에는 해당 짝이 걸리지 않을 것이다.
최종적으로 아래와 같이 구현되었다.