프로그래머스[Level2] - 카카오프렌즈 컬러링북 [2017 카카오코드 예선] :: 매운코딩
728x90
300x250

https://programmers.co.kr/learn/courses/30/lessons/1829?language=java#

 

프로그래머스

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

programmers.co.kr

0이아닌 이어진 영역들의 갯수와 영역들 중에서 가장 큰 영역을 return하는 문제.

테케를 다 맞게 잘 짰지만 자꾸 실패가 떠서 찾아보던도중

프로그래머스에서는 전역변수를 지역변수에서 초기화 하지않으면 자꾸 실패가 뜬다고한다.,

그래서 굳이 한번씩 더 값을 넣어주거나 초기화 해주는 작업들을 수행했다.

 

0이 아니면서 처음방문하는 부분을 영역의 첫 start로 봤다. 그리고 이어진 부분들을 전부 count.

 

테케가 적어서 몇개 더 추가했다.

13, 16, [[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0], [0, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 0], [0, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]]
답:[12,120]

 

import java.util.*;

class Solution {
    public static int numberOfArea = 0;
    public static int N=0,M=0,maxSizeOfOneArea = 0;
    public static int cnt = 0;
    public static boolean[][] visit;
    public static int[][] map;
    public static int[] dx = {0,1,0,-1};
    public static int[] dy = {1,0,-1,0};  
  public int[] solution(int m, int n, int[][] picture) {

      numberOfArea = 0;
      maxSizeOfOneArea =0;
      visit = new boolean[m][n];
      map = picture;
      N = n;
      M = m;
      
      for(int i = 0; i< picture.length; i++) {
          for(int j = 0; j<picture[0].length; j++) {
              
              cnt=0;
              
              if(picture[i][j]!=0 && !visit[i][j]) {
                  visit[i][j]=true;
                  dfs(i,j,picture[i][j]);
                  numberOfArea++;
              }
          }
      }
      
      
      
      int[] answer = new int[2];
      answer[0] = numberOfArea;//area.size();
      answer[1] = maxSizeOfOneArea;
     
      return answer;
  }
public static void dfs(int row,int col, int num) {
  
    
    cnt++;
    for(int i =0;i<4;i++) {
        
        int nx = row + dx[i];
        int ny = col + dy[i];
        
        //범위를 벗어나는가?
        if(nx >= M || nx < 0 || ny >= N || ny < 0)
            continue;
        //내가 찾는 영역이 아닌가?
        if(map[nx][ny]!=num)
            continue;
        //이미 들렸던 곳인가?
        if(visit[nx][ny])
            continue;
        
        visit[nx][ny]=true;
        dfs(nx,ny,num);
        
        
    }
    
    maxSizeOfOneArea = Math.max(maxSizeOfOneArea,cnt);

}

}
728x90

+ Recent posts