본문 바로가기

알고리즘

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


코드

from collections import deque
from copy import deepcopy

def solution(m, n, picture):
    near = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    # visit = [[0 for _ in range(n)] for _ in range(m)]
    pic = deepcopy(picture)
    # print(visit)
    mymax = 0
    q = deque()
    cnt = 0
    result = []
    for i in range(m):
        for j in range(n):
            if picture[i][j] != 0:
                q.append([i, j])
                cnt += 1

                answer = 0
                while q:
                    x, y = q.popleft()
                    temp = pic[x][y]
                    # print(temp)

                    for a, b in near:
                        xi, yi = x + a, y + b
                        if 0 <= xi < m and 0 <= yi < n and picture[xi][yi] == temp:
                            picture[xi][yi] = 0
                            q.append([xi, yi])
                            answer += 1
                    # print(q)

                if mymax < answer:
                    mymax = answer

    result.append(cnt)
    result.append(mymax)
    # print(result)
    
    return result

 

주의할 점

1. 이 문제는 백준의 단지 수 세기와 유사하다. 세주어야하는 것이많다. 하나의 색깔이 시작되면 cnt += 1 그리고 연결되어있는 색깔의 갯수가 몇개인지 세주어야한다.

2. 다른 문제는 보통 숫자로 정확히 주어지는데, 이 문제는 2^31 - 1개가 나올 수 있다고 해서 처음 q에 들어갈 때

   picture의 색깔을 표시해줘야한다.

     - 처음에는 temp = picture[x][y] 라고 지정했더니 계속 while문이 무한루프를 돌았다. 

        why? 내가 지나온 것은 visit을 안쓰고 0으로 바꾸다보니까 숫자가 지정이 되어있어야하는데, 자꾸 바뀐 숫자

                0이랑 다음 값picture[xi][yi]를 비교했다. 그러니까 당연히 안될 수 밖에,,,,

     -> ** 해결책 : picture를 copy해서 그 값만 유효하게 가지고올 수 있게 했더니 잘 돌아갔다(물론 이 문제는 c랑

             javascript로만 풀수있게 되어있어서 정답을 확인할수는 없지만,, 몇개의 예시가 잘 돌아갔다)

 

 

 

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

[programmers] 보석쇼핑  (0) 2020.08.13
[baekjoon] 3190. 뱀  (0) 2020.08.12
[programmers] 가장 큰 수  (0) 2020.08.11
[programmers] 문자열 압축  (0) 2020.08.11
[programmers] 소수찾기(12921)  (0) 2020.07.08