티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/17679
난이도 : 레벨 2
구현만 잘한다면 무리 없이 풀 수 있는 문제입니다. 인접한 4개의 블록을 검사하고 이 블록들을 삭제하며 밑으로 내린 후 다시 검사하면 되는 문제입니다.
여기서 주의할 점은 4개의 블록을 검사하자마자 삭제 후 다음 블록을 검사한다면 부분 겹치는 블록이 있을 경우에 문제가 생깁니다. 저는 이 부분을 큐를 이용하여 모든 블록을 검사한 후에 한 번에 삭제할 수 있도록 처리했습니다.
전역 변수
boolean change = 블록판에서 변경이 있었는지 확인하는 변수
Queue<Integer> sameBlockX, sameBlockY = 삭제할 블록의 x, y 좌표 값
int answer = 출력해야 하는 정답을 저장하는 변수
함수
int solution
수월하게 처리를 하기 위해 String 1차원 배열을 char 2차원 배열로 변경했습니다.
블록에 변경이 있는지 확인하며 while문을 돌립니다. 모든 블록을 검사하며 4개의 인접한 블록이 같은지 확인합니다.
그 후 같은 블록들을 모두 제거합니다. 제거한 블록으로 인한 공백을 처리합니다.
(check4Block, remove, setting 호출)
void check4Block
인접한 4개의 블록을 확인합니다. 만약 이 4개의 블록이 같다면 전역 변수 Queue에 좌표값을 넣어줍니다.
void remove
Queue에 있는 제거해야 할 블록의 좌표값을 꺼내서 모두 제거합니다. 제거할 때 answer, change의 값을 변경해줍니다.
void setting
remove 함수를 통해 생성된 공백을 채웁니다. 1줄씩 확인하여 값들을 Stack에 모은 후 밑에서부터 채워 넣어 블록 사이에 있을 공백을 제거해줍니다.
'문제풀이 > 백준 && 프로그래머스' 카테고리의 다른 글
[백준 20949] 효정과 새 모니터 (자바) (4) | 2021.04.21 |
---|---|
[백준 5052] 전화번호 목록 (자바) (0) | 2021.01.09 |
[백준 14725] 개미굴 (자바) (0) | 2021.01.07 |
[백준 1937] 욕심쟁이 판다 (자바) (0) | 2021.01.04 |
[백준 3860] 할로윈 묘지 (자바) (0) | 2020.12.01 |