알고리즘

[Programmers] 프렌즈4블록

Lahezy 2022. 9. 20.
728x90

[문제 링크]

 

프로그래머스

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

programmers.co.kr

 

[생각 흐름]

dfs를 이용하여 각 좌표에서 사각형기준을 깊이 선탐색으로 진행함 --> 시간 초과(TC 4, 8, 11)

메인에서 그냥 모든 경우 비교하기, stack or queue 이용해서 삭제된 칸 정리 (삭제된 칸은 ' . ' 으로 정리하고 다음 진행시에는 ' . '는 무시하고 지나가기 ) 

state는 방문 처리 노드로 만약 이전에 방문된 노드라면 cnt 증가시키지 않고, 방문이 되지 않은 경우에만 cnt++

종료 시점은 while 을 한번더 반복하였을때 이전값과 같은경우 return 하도록 함 

 

[코드]

import java.util.Stack;

class Solution {
    private static boolean[][] state;
    private static void move(char arr[][]) {
        Stack<Character> s = new Stack<>();

        for (int j = 0; j < arr[0].length; j++) {
            for (int i = 0; i< arr.length; i++) {
                if (!state[i][j]) {
                    s.push(arr[i][j]);
                }
                arr[i][j] ='.';
            }

            int size = s.size();
            for(int i=0;i<size;i++){
                arr[arr.length-i-1][j]=s.pop();
            }
        }
    }

    public int solution(int m, int n, String[] board) {
        int cnt =0;
        int answer = 0;
        char[][] arr = new char[m][n];
        for (int i = 0; i < m; i++) arr[i] = board[i].toCharArray();

        while (true) {
            answer = cnt;
            state = new boolean[m][n];
            for (int i = 0; i < m - 1; i++) {
                for (int j = 0; j < n - 1; j++) {
                    if (arr[i][j]=='.') continue;
                    if (arr[i][j] == arr[i][j + 1] && arr[i][j] == arr[i + 1][j] && arr[i][j] == arr[i + 1][j + 1]) {
                        int[] tempx = {0,0,1,1};
                        int[] tempy ={1,0,1,0};
                        for(int k=0;k<4;k++){
                            if(!state[i+tempx[k]][j+tempy[k]]){
                                cnt++;
                                state[i+tempx[k]][j+tempy[k]] = true;
                            }
                        }
                    }
                }
            }
            
            
            if (answer == cnt) break;
            move(arr);

        }

        return cnt;
    }

}
728x90

'알고리즘' 카테고리의 다른 글

[백준]10830_행렬 제곱_분할  (0) 2022.09.27
[백준]14503_로봇청소기  (0) 2022.09.26
[백준]9935_문자열폭발_Stack  (0) 2022.09.25
[백준]9465_스티커_dp  (0) 2022.09.25
[Programmers]합승 택시 요금  (1) 2022.09.23

댓글