알고리즘/프로그래머스 Level2

[프로그래머스,자바] Level2: 프렌즈4블록

류창 2022. 1. 23. 22:55
반응형

https://programmers.co.kr/learn/courses/30/lessons/17679

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

 

문제가길어서 링크로 대체합니다.

문제분석

 

 

구현을 해야할것은 딱 3가지입니다.

 

1. 제거할 4블록을 확인하는 로직

 

2. 제거할 4블록을 삭제하는 로직

 

3.제거한 공간을 아래로 내리는 로직

 

 

이 3가지로직을 While 반복문에 넣으면 우리가 원하는 기능이 만들어집니다.

 

1. 제거할 4블록을 확인하는건  i행 j열 블록을 남은 3블록과 같은지를 체크하는 로직으로 구현했다.

 

2. 블록삭제로직은 체크된 블록을 "-" 로 만들어둔다.

 

3.블록을 내리는 로직은 "-"를 윗블록과 교체하는식으로 구현했다.

 

윗블록과 교체를하면, 블록은 내려고가 "-"는 위로 올라가기때문이다.

 

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.util.*;
class Solution {
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        char[][] table = new char[m][n];
        for(int i=0;i<m;i++){
            table[i]=board[m-i-1].toCharArray();
        }
        //몇번 지워질지 모르니 무한반복
        while(true){
        boolean flag=true;
        boolean[][] check =new boolean[m][n];
        //블록체크
        for(int i=0;i<m-1;i++){
            for(int j=0;j<n-1;j++){
                if(table[i][j]=='-'){
                    continue;
                }
                char a =table[i][j];
                if(table[i][j+1]==a&&table[i+1][j]==a&&table[i+1][j+1]==a){
                    check[i][j]=true;
                    check[i][j+1]=true;
                    check[i+1][j]=true;
                    check[i+1][j+1]=true;
                    flag=false;
                }
            }
        }
            
         //블록체크가 안됬으면 == 지울 블록이없으면 반복문 종료
        if(flag){
            break;
        }
        //체크된 블록 삭제("-"으로 변환)
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(check[i][j]){
                    table[i][j]='-';
                    answer++;
                }
            }
        }
        //블록 내리기 (윗블록과 스왑하기)
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(table[i][j]=='-'){
                   for(int k=i;k<m;k++){
                       if(table[k][j]=='-'){
                           continue;
                       }
                       table[i][j]=table[k][j];
                       table[k][j]='-';
                       break;
                   }
                }
            }
        }
    }   
        return answer;
    }
}
cs
반응형