만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/programmers&bj

[JAVA] 카카오프렌즈 컬러링북

D36choi 2022. 3. 6. 14:34
728x90

 

문제

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

내 풀이

import java.util.LinkedList;
import java.util.Queue;

class Solution {
  public static int[][] arrow = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

  public int[] solution(int m, int n, int[][] picture) {
    int[] answer = new int[2];
    int[][] copiedPic = new int[m + 2][n + 2];
    for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= n; j++) {
        copiedPic[i][j] = picture[i - 1][j - 1];
      }
    }
    for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= n; j++) {
        final int color = copiedPic[i][j];
        if (color != 0) {
          answer[0]++;
          answer[1] = Math.max(answer[1], dfs(copiedPic, color, i, j));
        }
      }
    }
    return answer;
  }

  public int dfs(int[][] picture, int color, int row, int col) {
    int count = 0;
    Queue<Coordinate> q = new LinkedList<>();
    q.add(new Coordinate(row, col));
    picture[row][col] = 0;
    while (!q.isEmpty()) {
      count++;
      final Coordinate now = q.poll();
      for (int i = 0; i < 4; i++) {
        int nextRow = now.row + arrow[i][0];
        int nextCol = now.col + arrow[i][1];
        if (picture[nextRow][nextCol] == color) {
          picture[nextRow][nextCol] = 0;
          q.add(new Coordinate(nextRow, nextCol));
        }
      }
    }
    return count;
  }

  class Coordinate {

    public int row;
    public int col;

    Coordinate(int row, int col) {
      this.row = row;
      this.col = col;
    }
  }
}

알게 된 것

1. Queue를 이용한 BFS 구현을 자바버전으로 이젠 맘편히 해낼 수 있게 된 듯 하다.

2. 2d array (여기서는 arrow) 를 선언 및 초기화 시에 중괄호를 이용해 쉽게 만들 수 있다.

public static int[][] arrow = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

3. 배열복사의 훨씬 효율적인 메서드를 발견했다.

System.arraycopy(Object var0, int var1, Object var2, int var3, int var4);
// (소스 객체, 소스 객체 복사의 출발 인덱스, 대상 객체, 대상 객체의 출발 인덱스, 총 길이)
    for (int i = 1; i <= m; i++) {
      if (n >= 0)
        System.arraycopy(picture[i - 1], 0, copiedPic[i], 1, n);
    }

조금 인덱스때문에 헷갈려보이겠지만 그건 IndexBoundException을 막기 위해 피복사배열의 크기를 row + 2, col + 2 하였기 때문이다.

i=1일 때 해석하면, picture[0] 행의 0열부터 모든 값들은 copiedPic[1] 의 1열부터 복사가 되며, 이 때 열의 길이는 n이다.

피드백

inner class 선언 또한 기존의 클래스 정의처럼 그대로 하면 되는 듯 하다.

 

'프로그래밍 > programmers&bj' 카테고리의 다른 글

[JAVA] 뉴스 클러스터링  (0) 2022.03.18
[python] 메뉴 리뉴얼  (0) 2022.03.13
[JAVA] 문자열 압축  (0) 2022.02.21
[JAVA] K번째 수  (0) 2022.02.10
[JAVA] 기능개발  (0) 2022.02.09