프렌즈 4블록

유승선 ·2022년 5월 31일
0

프로그래머스

목록 보기
20/48

오늘 백준에서 나왔던 문제를 꽤 고전하면서 풀게 됐었는데 생각해보니 프로그래머스에서도 유사한 문제가 있던게 생각이 나서 분명히 엄청 예전에 풀었지만 잘 기억이 안나던 문제를 다시 시도해보기로 했다. 확실히 문제도 그렇고 방법도 그렇고 꽤나 유사했다. 물론 백준에서 풀었던 문제가 조금 더 까다로웠던건 있었다 왜냐면은 백준에서는 DFS 방식으로 풀었던것도 있었고 조건 또한 더 많았기 때문이다. 2018년 카카오 에서 나온 문제였는데 이 문제도 DFS 를 요구하는 걸까 하고 다시 읽어봤는데 제목에서 나오듯 같은 문양에 4블록만 찾으면 되는 문제였다. 약간은 Sliding Window 방식으로 4X4 액자로 탐색을 하면서 같은 블록들이 모여있으면 visited 형식으로 표시 해두고 사라진 블록에 숫자를 카운트하고 위에 있는 블록들을 밑으로 떨어트리면 됐었다.

여기서 내가 백준에서 활용했던 코드에 예시를 생각해보면 while() 룹을 이용해서 더 이상 터트릴 블록이 없을때까지 무한 루핑 해주었다. 그리고 블록을 위에서 아래로 떨어트리는 과정에 코드를 동일하게 사용했으며 DFS 만 사용안했을뿐 많이 비슷하게 했기때문에 금방 풀었다.

윈도우 활용

중복되는 탐색을 막기 위한 표시

블록 떨어트리기

솔직히 생각보다 코드를 너무 길게 쓴것만 같은 기분이 있긴하다. 그래도 내가 문제를 풀면서 좀 고전했던거중 하나는 블록을 지우는 과정, 그리고 점수를 계산하는 과정이었다. 블록이 사라지는것과 블록이 터진 공간을 점수로 환산하는 과정은 다르다. 그렇기때문에 점수판을 따로 만들어줬고 블록이 사라지면 1을 넣어주었다. reshape() 함수는 뿌요뿌요에서 풀었던것과 동일하게 써주었고 다행히 잘되었다. 그런데 내가 쓴 코드를 보자니 좀 더 줄일수 있는 방법이 있을까 찾아보던중에 내가 썼던 reshape 부분이 좀 너무 과하다 라는 생각도 들었고 굳이 matrix와 scoreBoard 도 써야하나 라는 생각이 들어서 다른 풀이들을 좀 봤다.

확실히 훨씬 짧은 코드가 나왔다. visited 라는 벡터를 이용해가지고 4가지 블록을 확인한후 내가 scoreBoard 를 했던것처럼 표시를 해주었다. 그리고 여기 코드에서 좀 나와 많이 달랐던 점은 바로 밑에 있는 for 룹 부분에서 블록이 터진 공간에서 점수를 환산 함과 동시에 i++ 가 아닌 ++i 를 해주어서 overflow 를 막아주었다. 추가적으로 세번째 for 룹을 이용해가지고 블록을 계속 내려주었다, 저 부분은 내가 썼던 reshape() 과 동일한 동작을 했지만 훨씬 더 짧고 이해하기 편했다. 전에 풀었던 뿌요뿌요도 만약에 이런 방식으로 풀었다면, dfs를 이용해서 처음에 뿌요를 모두 터트려주고 visited 에 적힌 정보를 바탕으로 블록을 계쏙 내려줬다면 훨씬 더 짧은 코드가 나왔을거같다.

배운점:
1. Matrix 를 기반으로 하는 블록 옮기기
2. 다른 사람의 코드 활용하기

profile
성장하는 사람

0개의 댓글