카카오 1차 코딩 테스트 6번 문제풀이
6. 프렌즈4블록(난이도: 상)
입출력 예제
m |
n |
board |
answer |
4 |
5 |
CCBDE AAADE AAABF CCBBF |
14 |
6 |
6 |
TTTANT RRFACC RRRFCC TRRRAA TTMMMF TMMTTJ |
15 |
C++ 소스코드
#include <iostream> #include <string> using namespace std; int main() { // m: 높이, n: 넓이 2이상 30이하 int m, n; cin >> m >> n; string board[30]; for (int i = 0; i < m; i++) cin >> board[i]; int nBoard[30][30]; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) nBoard[i][j] = 1; int answer = 0; while (true) { bool isFind = false; // 모든 블럭 돌면서 2 x 2 같은블럭 찾으면 nBoard에 2 표시하기 for (int i = 0; i < m - 1; i++) { for (int j = 0; j < n - 1; j++) { char block = board[i][j]; if (block != ' ' && block == board[i][j + 1] && block == board[i + 1][j] && block == board[i + 1][j + 1]) { nBoard[i][j] = 2; nBoard[i][j + 1] = 2; nBoard[i + 1][j] = 2; nBoard[i + 1][j + 1] = 2; isFind = true; } } } if (!isFind) break; // nBoard가 2인 board의 동일한 위치값을 지운다(' '로 채운다) // 결과 값(지워진 개수) 추가 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (nBoard[i][j] == 2) { nBoard[i][j] = 0; board[i][j] = ' '; answer++; } } } // 블럭 내리기 for (int i = m - 2; i >= 0; i--) { for (int j = 0; j < n; j++) { if (nBoard[i][j] == 1) { int k = i; while (k < m - 1) { if (nBoard[k + 1][j] == 1) break; k++; } if (k != i) { nBoard[k][j] = 1; nBoard[i][j] = 0; board[k][j] = board[i][j]; board[i][j] = ' '; } } } } // 현재 board 출력 cout << endl; for (int i = 0; i < m; i++) cout << board[i] << endl; } // 결과 출력 cout << "Answer: " << answer << endl; system("pause"); return 0; }
반응형
'코딩테스트 > 카카오' 카테고리의 다른 글
카카오 1차 코딩테스트 5번 뉴스 클러스터링 문제풀이 (2) | 2018.06.03 |
---|---|
카카오 1차 코딩테스트 4번 셔틀버스 문제풀이 (0) | 2018.05.31 |
카카오 1차 코딩테스트 3번 캐시 문제풀이 (0) | 2018.05.24 |
카카오 1차 코딩테스트 2번 다트게임 문제풀이 (0) | 2018.05.22 |
카카오 1차 코딩테스트 1번 비밀지도 문제풀이 (0) | 2018.05.22 |