프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
1. 주어진 String[] board 를 2차원배열 char[][] 에 입력.

2. 카카오프렌즈 블록이 2x2 형태로 4개가 붙어있는이 확인하며, 조건에 만족하면 4개의 블록 중 좌측위 블록의 x,y좌표를 Stack에 저장

3. Stack을 꺼내면서 저장된 좌표를 기준으로 우측, 하단, 우측하단 블록을 제거.

4. 제거 후 빈 공간을 채우고, 다시 2 ( 체크 ) , 3 ( 삭제 ) , 4 ( 채우기) 를 반복하는데, 2번의 체크하기 과정에서 체크되는 좌표가 하나도 없 을때까지 반복.

5. 4번의 ( 채우기 ) 과정에서 Queue를 사용해 '0' 을 맨위로 올리고 알파벳을 아래로 채움

나의풀이 ( 코드 )
import java.util.*;
class Solution {
static char[][] newBoard ;
static Stack<Integer> stack = new Stack<>();
public int solution(int m, int n, String[] board) {
int answer = 0;
newBoard = new char[board.length][board[0].length()];
// 2차원배열에 board 저장
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length(); j++) {
newBoard[i][j] = board[i].charAt(j);
}
}
// 2x2 블록이 체크가 하나도 안될때까지 반복
while (check()) {
remove();
fill();
}
// 빈 공간 (지워진 블록) 이 있으면 answer++
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length(); j++) {
if (newBoard[i][j] == '0') {
answer++;
}
}
}
return answer;
}
// 좌표체크
static boolean check() {
for (int i = 0; i < newBoard.length - 1; i++) {
for (int j = 0; j < newBoard[0].length - 1; j++) {
// x 좌표 = j , y 좌표 = i
if (newBoard[i][j] != '0') { // 빈 블록이 아니면
if ((newBoard[i][j] == newBoard[i][j + 1])
&& (newBoard[i][j + 1] == newBoard[i + 1][j])
&& (newBoard[i + 1][j] == newBoard[i + 1][j + 1])) {
stack.add(j);
stack.add(i);
}
}
}
}
// 좌표체크가 하나도 안되었다면 false
if(stack.isEmpty()){
return false;
}else {
return true;
}
}
// 체크된 좌표 확인하며 좌표를 기준으로 2x2 블록 제거 ('0'으로 변경)
static void remove() {
while (!stack.isEmpty()) {
int a = stack.pop();
int b = stack.pop();
newBoard[a][b] = '0';
newBoard[a][b + 1] = '0';
newBoard[a + 1][b] = '0';
newBoard[a + 1][b + 1] = '0';
}
}
// 블록이 지워진 후 위에있는 블록을 아래로 내림
static void fill() {
Queue<Character> queue=new LinkedList<>();
for (int i = 0; i < newBoard[0].length; i++) {
for (int j = newBoard.length - 1; j >= 0; j--) {
if(newBoard[j][i]!='0') {
queue.add(newBoard[j][i]);
}
}
while (queue.size()!=newBoard.length){
queue.add('0');
}
for (int j = newBoard.length - 1; j >= 0; j--) {
newBoard[j][i] = queue.poll();
}
}
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/JAVA 자바] 2 x n 타일링 (0) | 2023.11.24 |
|---|---|
| [프로그래머스/JAVA 자바] 숫자 변환하기 (1) | 2023.11.23 |
| [프로그래머스/JAVA 자바] 롤케이크 자르기 (0) | 2023.11.21 |
| [프로그래머스/JAVA 자바] [3차] 파일명 정렬 (1) | 2023.11.20 |
| [프로그래머스/JAVA 자바] 뒤에 있는 큰 수 찾기 (0) | 2023.11.20 |