본문 바로가기
Algorithm/Problem_프로그래머스

프로그래머스([1차] 프렌즈 4블록) - Java

by uyoo 2020. 5. 12.

[프렌즈 4블록]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

* 로직

  • (0,0)부터 기준점을 한 칸씩 이동하며 2*2만큼의 크기만큼을 비교한다
  • 모두 같은 캐릭터라면 캐릭터들의 좌표 정보를 리스트에 담는다(removeInfo)
  • 기준점을 모두 돌고난 뒤에, 삭제할 캐릭터들의 정보가 존재한다면
    • 각각의 위치를 지워준다
    • 캐릭터들을 재배치한다
  • 만약 존재하지 않는다면 -> 반복을 종료한다

 

import java.util.LinkedList;

class Position_17679 {
    public int y,x;

    public Position_17679(int y, int x) {
        this.y = y;
        this.x = x;
    }
}

class Solution {
    static int M, N;
    static int DivideSize = 2;
    static String[][] Map;
    
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        M = m;
        N = n;
        Map = new String[M][N];
        for(int i=0; i<M; ++i) {
            String input = board[i];
            for(int j=0; j<N; ++j) {
                Map[i][j] = input.substring(j, j+1);
            }
        }

        while (true) {
            LinkedList<Position_17679> removeInfo = new LinkedList<>();   // 지울 캐릭터들의 정보
            for(int i=0; i<M-DivideSize+1; ++i) {
                for(int j=0; j<N-DivideSize+1; ++j) {
                    if(!Map[i][j].equals("")) {
                        doProcess(i, j, removeInfo);
                    }
                }
            }

            if(removeInfo.isEmpty()) break;

            // 지울 수 있는 목록들을 모두 지우기
            for(Position_17679 list : removeInfo) {
                Map[list.y][list.x] = "";
            }

            // 재배치
            int remainCnt = reArrange();
            answer = (M*N) - remainCnt;
        }

        return answer;
    }
    
    private static int reArrange() {
        int cnt = 0;
        // String[][] tmpArr = new String[M][N];
        // for(int i=0; i<M; ++i) {
        //     for(int j=0; j<N; ++j) {
        //         tmpArr[i][j] = "";
        //     }
        // }

        for(int j=0; j<N; ++j) {
            int idx=M-1;
            for(int i=M-1; i>=0; --i) {
                if(!Map[i][j].equals("")) {
                    //tmpArr[idx--][j] = Map[i][j];
                    Map[idx--][j] = Map[i][j];
                    Map[i][j] = "";
                    cnt++;
                }
            }
        }

        //Map = tmpArr;
        return cnt;
    }

    private static void doProcess(int y, int x, LinkedList<Position_17679> removeInfo) {
        String base = Map[y][x];
        for(int i=0; i<DivideSize; ++i) {
            for(int j=0; j<DivideSize; ++j) {

                // 캐릭터가 같지 않다면 break
                if(!Map[y+i][x+j].equals(base)) {
                    return;
                }
            }
        }

        // 모두 같다면 -> 지울 수 있음
        for(int i=0; i<DivideSize; ++i) {
            for(int j=0; j<DivideSize; ++j) {
                removeInfo.add(new Position_17679(y+i, x+j));
            }
        }
    }
}