https://school.programmers.co.kr/learn/courses/30/lessons/17679
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
프렌즈4블록
블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.

만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다.

블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.

만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.

위 초기 배치를 문자로 표시하면 아래와 같다.
TTTANT
RRFACC
RRRFCC
TRRRAA
TTMMMF
TMMTTJ
각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.
입력 형식
- 입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
- 2 ≦ n, m ≦ 30
- board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.
출력 형식
입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.
입출력 예제
mnboardanswer4 | 5 | ["CCBDE", "AAADE", "AAABF", "CCBBF"] | 14 |
6 | 6 | ["TTTANT", "RRFACC", "RRRFCC", "TRRRAA", "TTMMMF", "TMMTTJ"] | 15 |
예제에 대한 설명
- 입출력 예제 1의 경우, 첫 번째에는 A 블록 6개가 지워지고, 두 번째에는 B 블록 4개와 C 블록 4개가 지워져, 모두 14개의 블록이 지워진다.
- 입출력 예제 2는 본문 설명에 있는 그림을 옮긴 것이다. 11개와 4개의 블록이 차례로 지워지며, 모두 15개의 블록이 지워진다.
문제 이해
- 블록게임을 구현한 문제입니다. 다소 복잡한 구현문제로, 저는 완전탐색을 이용해서 해결했습니다.
- 첨부한 이미지를 보면 이해가 쉽습니다.
문제 풀이
- 먼저, 블록이 제거될 경우 위에서 아래로 내려오는데 이 방향을 배열에서 한 요소가 제거될 때의 방향과 맞추기 위해, 몇 가지 작업이 필요합니다.
- 주어지는 행렬에 대해 전치행렬을 생성 후, 좌우반전을 시켜주면 배열에 요소가 들어가는 방향과 블록이 내려오는 방향이 일치하게 됩니다.
- 이후 사전 작업을 마친 행렬에 대해 완전탐색을 통해 4개의 같은 블록을 찾아 remove 배열에 넣습니다. 탐색시 같은 블록들은 밑의 과정에서 X로 변경하므로 X는 패스합니다.
- 이 과정에서 같은 블록이 없어 remove배열에 비어있으면 종료하게 됩니다.
- remove 배열의 저장된 i,j 좌표를 통해 행렬에서 같은 블록들을 'X'문자로 변경합니다. 이때, 변경되는 X의 개수가 곧 제거되는 블록의 수와 같으므로 갯수를 체크합니다.
- 행렬을 역순으로(인덱스 반대방향부터) 접근하여 X문자를 빼내어 해당 행의 가장 뒤로 넣습니다.
코드
난이도가 있는 구현문제였던 것 같습니다. 카카오에 따르면 코테당시 정답률은 약 48%이며 문제 중 가장 긴 코드를 필요로 했다고 하네요.(자바는 80줄 ㄷㄷ)
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] 멀리 뛰기 (프로그래머스 Lv2 파이썬) (0) | 2023.09.24 |
---|---|
[Python] 전화번호 목록 (프로그래머스 Lv2 파이썬) (0) | 2023.09.22 |
[Python] 피로도 (프로그래머스 Lv2 파이썬) (0) | 2023.09.19 |
[Python] 피로도 (백준 22864번 파이썬) (0) | 2023.09.19 |
[Python] 분해합 (백준 2231번 파이썬) (0) | 2023.09.18 |