[Python] 백준 #10026- 적록색약

2023. 9. 7. 17:11·코딩테스트/백준[Python]

문제


 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

코드


My answer (bfs 통과)

import sys
from collections import deque
input= sys.stdin.readline

def bfs(x,y):
        Q=deque()
        Q.append((x,y))
        visit[x][y]=1
        while Q:
            x,y=Q.popleft()
            for i in range(4):
                n_x,n_y=x+direct[i][0],y+direct[i][1]
                if(0<=n_x<n and 0<=n_y<n):
                    if(visit[n_x][n_y]==0 and graph[n_x][n_y]==graph[x][y]):
                        visit[n_x][n_y]=1
                        Q.append((n_x,n_y))  
        return 0

n=int(input())
direct=[[1,0],[-1,0],[0,1],[0,-1]]
graph = [list(input()) for _ in range(n)]
answer=[]

visit=[[0]*n for _ in range(n)]
cnt=0
for i in range(n):
    for j in range(n):
        if(visit[i][j]==0):
            
            bfs(i,j)
            cnt+=1
answer.append(cnt)

visit=[[0]*n for _ in range(n)]
cnt=0

for i in range(n):
    for j in range(n):
        if graph[i][j]=='G':
            graph[i][j]='R'

for i in range(n):
    for j in range(n):
        if(visit[i][j]==0):
            bfs(i,j)
            cnt+=1
answer.append(cnt)

print(*answer)
import sys
from collections import deque

input = sys.stdin.readline

def mainS(t):
    global visit
    visit = [[0] * n for _ in range(n)]
    cnt = 0
    for i in range(n):
        for j in range(n):
            if visit[i][j] == 0:
                if graph[i][j] in ['R','G'] and t == 1:
                    check=['R','G']
                else:check = [graph[i][j]]  
                bfs(i, j, check)
                cnt += 1
    return cnt

def bfs(x, y, check):
    Q = deque()
    Q.append((x, y))
    visit[x][y] = 1

    while Q:
        x, y = Q.popleft()
        for i in range(4):
            n_x, n_y = x + direct[i][0], y + direct[i][1]
            if 0 <= n_x < n and 0 <= n_y < n:
                if visit[n_x][n_y] == 0 and graph[n_x][n_y] in check:
                    visit[n_x][n_y] = 1
                    Q.append((n_x, n_y))

n = int(input())
direct = [[1, 0], [-1, 0], [0, 1], [0, -1]]
graph = [input().rstrip() for _ in range(n)]
answer = []

for i in range(2):
    answer.append(mainS(i))

print(answer[0], answer[1])

Another answer

import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline

n = int(input().rstrip())
matrix = [list(input().rstrip()) for _ in range(n)]
visited = [[False] * n for _ in range(n)]

three_cnt, two_cnt = 0, 0
dx = [-1,1,0,0]
dy = [0,0,-1,1]

def dfs(x,y):
    visited[x][y] = True
    current_color = matrix[x][y]

    for k in range(4):
        nx = x + dx[k]
        ny = y + dy[k]
        if (0 <= nx < n) and (0 <= ny < n):
            if visited[nx][ny]==False:
                if matrix[nx][ny] == current_color:
                    dfs(nx,ny)

for i in range(n):
    for j in range(n):
        if visited[i][j]==False:
            dfs(i,j)
            three_cnt += 1
for i in range(n):
    for j in range(n):
        if matrix[i][j]=='R':
            matrix[i][j]='G'

visited = [[False] * n for _ in range(n)]

for i in range(n):
    for j in range(n):
        if visited[i][j] == False:
            dfs(i,j)
            two_cnt += 1

print(three_cnt,two_cnt)

풀이


우선 이 문제는 일반적인 그래프 탐색 문제에서 1혹은 0으로 갈수있는길 없는길을 확인하는걸 여기서는 단순히 R,G,B로 바꿔놓은 문제다. 우선 나는 2가지 방법으로 풀어봤다. (2가지 모두 bfs)

1. 단순하게 적록색맹이 아닌사람걸 계산하고, 그래프자체를 돌면서 R->G로 바꿔준 다음 적록색맹인 사람껄 계산하기. 이 때 visit을 초기화해주는 걸 잊지말기

2. 두번째 따로 계산하는것은 맞지만 코드를 좀 깔끔하게 쓰고 싶어서,(시간은 더 걸릴수도) 적록색맹자를 계산할 때 그래프를 따로 바꾸지않고 R과 G를 동일시하여 check라는 리스트에 넣고 in함수를 써서 해결해봤다~

 

728x90

'코딩테스트 > 백준[Python]' 카테고리의 다른 글

[Python] 백준 #1697- 숨바꼭질  (3) 2023.09.08
[Python] 백준 #2668- 숫자고르기  (0) 2023.09.08
[Python] 백준 #4963- 섬의 개수  (0) 2023.09.07
[Python] 백준 #2667- 단지번호붙이기  (0) 2023.09.07
[Python] 백준 #2178- 미로 탐색  (0) 2023.09.07
'코딩테스트/백준[Python]' 카테고리의 다른 글
  • [Python] 백준 #1697- 숨바꼭질
  • [Python] 백준 #2668- 숫자고르기
  • [Python] 백준 #4963- 섬의 개수
  • [Python] 백준 #2667- 단지번호붙이기
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (481)
      • 알쓸신잡 (88)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Blog

    • 🏠 Home

    ✏️글쓰기
    💻 관리

    Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    BFS
    이코테
    이것이취업을위한코딩테스트다
    백준
    DFS
    파이썬
    dp
    그리디
    나동빈
    이분탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상단으로

티스토리툴바