본문 바로가기

PS

[Programmers] LV2- 프렌즈4블록

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

 

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

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

programmers.co.kr

 

 

문제 파악

문제의 의도는 아래의 사진과 같다.

 

애니팡 게임과 비슷하게

1. 2X2칸의 이모티콘이 모두 같으면 해당 칸을 지운다.

2. 지운 칸의 개수를 센다.

3. 지워진 이모티콘의 칸을 위에 있던 이모티콘이 내려와 빈자리를 채운다.

 

아마 비워진 칸으로 이모티콘을 이동시키는 부분을 깔끔하게 코딩 하고 싶어서 시간을 많이 쓴 거 같다

가독성 높은 코딩을 하려고 노력해야 되지 않을까

 

더보기
class Solution 
{
    static int answer = 0;
    static char[][] puzzle;
    public int solution(int m, int n, String[] board) {        
		boolean init = true;
        puzzle = new char[m][n];
        
        for(int r = 0; r<m; r++)
        {
            puzzle[r] = board[r].toCharArray();
        }
		
        while(init)
        {
            init = Find(puzzle,m,n);
        }        
        return answer;
    }
    
    public boolean Find(char[][] puzzle,int m , int n)
    {
        int cnt = 0;
        boolean[][] pang = new boolean[m][n];
        for(int r = 0; r < m-1; r++)
        {
            for(int c = 0; c < n-1; c++)
            {
                int r1 = r+1;
                int c1 = c+1;
				
                if(puzzle[r][c] == 'X') continue;
                
                if(puzzle[r][c] == puzzle[r1][c] && puzzle[r][c] == puzzle[r][c1] && puzzle[r][c] == puzzle[r1][c1])
				{
                    pang[r][c]   = true;
                    pang[r1][c]  = true;
                    pang[r][c1]  = true;
                    pang[r1][c1] = true;
                }
            }
        }        
        for(int r = 0; r < m; r++)
        {
            for(int c = 0; c < n; c++){
                if(pang[r][c])
				{
                    puzzle[r][c] = 'X';
                    cnt++;
                }
            }
        }
                
        if(cnt == 0){
            return false;
        }
        else {
            answer+=cnt;
            ArrayBatch(puzzle,m,n);
            return true;
        }        
    }
    
    public void ArrayBatch(char[][] puzzle,int m , int n)
    {        
        for(int c = 0; c < n; c++)
        {
            for(int r = m-2; r >= 0;r--)
            {
                moving(puzzle,r,c);
            }            
        }
    }    
    
    public void moving(char[][] puzzle , int r, int c)
    {                
        while(true)
        {            
            if(r+1>= puzzle.length || puzzle[r+1][c]!= 'X'){
                break;
            }
            
            if(puzzle[r+1][c] == 'X'){
                char ch = puzzle[r][c];
                puzzle[r][c] = 'X';
                puzzle[r+1][c] = ch;
            }
            r++;
        }
    }
}

 

 

 

'PS' 카테고리의 다른 글

[Programmers] LV2 - 스킬 트리  (0) 2021.06.25
[BOJ] 1022번: 소용돌이 예쁘게 출력하기  (0) 2021.06.23
[BOJ]2638번 : 치즈  (0) 2021.06.22
[BOJ]9328번 : 열쇠  (0) 2021.06.21
[BOJ]14719번 : 빗물  (0) 2021.06.20