코딩테스트연습/프로그래머스

[프로그래머스 - JAVA] 카카오프렌즈 컬러링북

:)jun 2021. 12. 17. 23:01

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

 

코딩테스트 연습 - 카카오프렌즈 컬러링북

6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5]

programmers.co.kr

// 기본 dfs,bfs 문제에서 기준값에 해당하는 것들만 방문하기로 조건이 추가된 것

//테스트코드
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class KakaoFriendsColoringBookTest {

    KakaoFriendsColoringBook q;

    @BeforeEach
    void beforeEach() {
        q = new KakaoFriendsColoringBook();
    }

    @Test
    void test1() {
        assertArrayEquals(new int[]{4, 5}, q.solution(6, 4, new int[][]{{1, 1, 1, 0}, {1, 2, 2, 0}, {1, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 3}, {0, 0, 0, 3}}));
    }
}

//프로덕션코드
public class KakaoFriendsColoringBook {

    int numberOfArea = 0;
    int maxSizeOfOneArea = 0;
    int sizeOfOneArea = 0;
    boolean[][] visited;
    int[] dx = {1, -1, 0, 0};
    int[] dy = {0, 0, -1, 1};


    public int[] solution(int m, int n, int[][] picture) {
        visited = new boolean[m][n];


        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (picture[i][j] != 0 && visited[i][j] == false) {
                    dfs(i, j, picture, m, n, picture[i][j]);
                    numberOfArea++;
                    maxSizeOfOneArea = Math.max(maxSizeOfOneArea, sizeOfOneArea);
                    sizeOfOneArea = 0;
                }
            }
        }
        
        return new int[]{numberOfArea, maxSizeOfOneArea};
    }

    void dfs(int i, int j, int[][] picture, int m, int n, int pivotnumber) {
        if (i < 0 || m <= i || j < 0 || n <= j) {
            return;
        }
        if (visited[i][j]) {
            return;
        }
        if (picture[i][j] != pivotnumber) {
            return;
        }
        visited[i][j] = true;
        sizeOfOneArea++;

        for (int k = 0; k < 4; k++) {
            dfs(i + dx[k], j + dy[k], picture, m, n, pivotnumber);
        }
    }
}

// 성공! 리팩토링하자.

public class KakaoFriendsColoringBook {

    int numberOfArea = 0;
    int maxSizeOfOneArea = 0;
    int sizeOfOneArea = 0;
    boolean[][] visited;
    int[] dx = {1, -1, 0, 0};
    int[] dy = {0, 0, -1, 1};


    public int[] solution(int m, int n, int[][] picture) {
        visited = new boolean[m][n];
        checkAllpoints(m, n, picture);
        return new int[]{numberOfArea, maxSizeOfOneArea};
    }

    private void checkAllpoints(int m, int n, int[][] picture) {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                checkAPoint(m, n, picture, i, j);
            }
        }
    }

    private void checkAPoint(int m, int n, int[][] picture, int i, int j) {
        if (picture[i][j] != 0 && visited[i][j] == false) {
            dfs(i, j, picture, m, n, picture[i][j]);
            numberOfArea++;
            maxSizeOfOneArea = Math.max(maxSizeOfOneArea, sizeOfOneArea);
            sizeOfOneArea = 0;
        }
    }

    void dfs(int i, int j, int[][] picture, int m, int n, int pivotnumber) {
        if (i < 0 || m <= i || j < 0 || n <= j) {
            return;
        }
        if (visited[i][j]) {
            return;
        }
        if (picture[i][j] != pivotnumber) {
            return;
        }
        visited[i][j] = true;
        sizeOfOneArea++;

        for (int k = 0; k < 4; k++) {
            dfs(i + dx[k], j + dy[k], picture, m, n, pivotnumber);
        }
    }
}

// 굿!
// 다 좋긴한데 매개변수를 좀 더 깔끔하게 처리할 수 있는 방법이 없을까?...
// 그리고 전형적인 문제인데 구현하는데 생각보다 시간이 오래걸렸다. dfs, bfs 코드 다시 확인해보고 연습하자.