본문 바로가기

스터디 1일 1커밋

240508 [BOJ/백준] 10026. 적록색약

https://www.acmicpc.net/problem/10026


나의 코드

def check(color):  # 색이 같은 부분의 구역 갯수 구하는 함수
    global cnt
    if not visited[i][j] and arr[i][j] == color:
        q.append([i, j])
        visited[i][j] = 1
        while q:
            x, y = q.pop(0)
            for k in range(4):
                ni = x + di[k]
                nj = y + dj[k]
                if 0 <= ni < N and 0 <= nj < N and visited[ni][nj] == 0 and arr[ni][nj] == color:
                    visited[ni][nj] = 1
                    q.append([ni, nj])
        cnt += 1

N = int(input())
arr = [list(input()) for _ in range(N)]
visited = [[0]*N for _ in range(N)]
q = []
di = [0, 1, 0, -1]
dj = [1, 0, -1, 0]

ans1 = 0
ans2 = 0
for i in range(N):
    for j in range(N):
        cnt = 0
        check('R')
        check('B')
        check('G')
        ans1 += cnt

visited = [[0]*N for _ in range(N)] # 방문리스트 초기화
for i in range(N):
    for j in range(N):
        cnt = 0
        if not visited[i][j] and (arr[i][j] == 'R' or arr[i][j] == 'G'):
            q.append([i, j])
            visited[i][j] = 1
            while q:
                x, y = q.pop(0)
                for k in range(4):
                    ni = x + di[k]
                    nj = y + dj[k]
                    if 0 <= ni < N and 0 <= nj < N and visited[ni][nj] == 0 and (arr[ni][nj] == 'R' or arr[ni][nj] == 'G'):
                        visited[ni][nj] = 1
                        q.append([ni, nj])
            cnt += 1
        check('B')
        ans2 += cnt

print(ans1, ans2)

 

결과


함수를 안쓰는 버릇이 있다보니 함수를 어떻게 써야할지 모르겠어서 일단 반복되는 부분들도 다 함수로 적어서 제출했더니 최종코드의 2배는 되는 길이였다. 그래서 함수를 써봐야겠다고 생각하고 함수를 정의하고 반복되는 부분은 삭제했다. 아래에 color가 R or G 일 때의 함수는 어떻게 적용할지 몰라서 check(R) or check(G)를 썼는데 출력값이 안나와서 or 대신 and를 써봤고 틀릴 것 같지만 그냥 출력값이랑 같길래 제출해봤더니 역시나 틀림...ㅎㅎ 그래서 그 부분만 함수를 안쓰고 원래 코드로 제출해서 통과했다. 다른 사람들은 어떤 함수를 써서 코드를 짰을지 궁금하지만 지금 시간이 늦었으므로 다음에 생각나면 찾아봐야겠다!