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

김태민·2022년 4월 29일
0

알고리즘

목록 보기
36/77

mingssssss

1. 문제



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

2. 코드

import java.util.*;

class Solution {
    
    // 전역 변수 설정
    static boolean[][] visited;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public int[] solution(int m, int n, int[][] picture) {
        
        int[][] map = new int[m][n];
        
        visited = new boolean[m][n];
        int[] answer = new int[2];
        int max_Area = 0;
        int cnt = 0;
        int temp = 0;
        
        for (int i  = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                map[i][j] = picture[i][j];
            }
        }
        

        for (int i  = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (visited[i][j] == false && map[i][j] != 0){
                    temp = map[i][j];
                    visited[i][j] = true;                   
                    int current_size = BFS(i, j, m, n, temp, map);
                    if (cnt < current_size) {
                        cnt = current_size;
                    }
                    max_Area++;
                }
            }
        }
        
        answer[0] = max_Area;
        answer[1] = cnt;
        
        return answer;
    }
    
    public static int BFS(int x, int y, int m, int n, int temp, int[][] map) {
        
        Queue<int[]> q = new LinkedList<>();
        q.add(new int[] {x, y});
		
        int cnt = 1;
        
        while (!q.isEmpty()) {

            int now[] = q.poll();

            for (int i = 0; i < 4; i++) {
                
                int nextX = now[0] + dx[i];
                int nextY = now[1] + dy[i];
                
                if (nextX < 0 || nextY < 0 || nextX >= m || nextY >= n) { 
					continue;
				}
				if (visited[nextX][nextY] == true || map[nextX][nextY] != temp) { 
                    continue;
				}
                
                cnt++;
                q.add(new int [] {nextX, nextY});					
				map[nextX][nextY] = map[now[0]][now[1]] +1;         
				visited[nextX][nextY] = true;                
            }
        }
        
        return cnt;
    } 
}

3. 리뷰

처음에 로직 완성하고 예제와 테스트케이스 모두 성공이라고 나왔는데도 제출하면 실패가 나왔다.

로직에는 이상이 없어서 질문 검색과 구글링을 해봤더니 전역변수 설정에 문제가 있었다.

문제가 2017년에 나온 옛날 문제라 전역변수 설정하고 초기화를 하지 않으면 오류가 발생하여

실패가 나온다고 한다. 전역변수를 따로 빼서 메인 함수에서 초기화하고, 필요한 변수를

함수 안에 인자로 넣어서 새로 했다.

또 picture[][] 배열을 그대로 사용하면 또 오류가 발생한다고 해서 map[][] 배열을

따로 만들어서 복사해서 사용했다. picture[][] 배열을 0으로 바꾼 코드도 실행이 안 됐다..

로직 자체는 bfs로 탐색하면서 탐색하는 숫자와 인접한 숫자와 비교를 해서

다르면(0이거나 다른 숫자이거나) 방문 체크를 하지 않고 진행했다.

이클립스에서 디버깅하기가 힘들어 홈페이지에서 바로 했더니 시간이 오래 걸렸다.

하지만 이클립스의 도움을 받지 않고 직접 시험 보는 것 처럼 디버깅하니 실력이 많이 는 것 같다.

bfs 구조를 잘 익혀두어서 언제 어디서든 어떤 문제든 써먹을 수 있게 연습해야겠다.

profile
어제보다 성장하는 개발자

0개의 댓글