[백준] 2636번 치즈 - python 파이썬

2025. 3. 4. 17:12·코딩테스트/백준

문제

 

 

이 문제를 처음 풀려고 했을 때는 너무 어렵게 느껴졌다. BFS로 풀어야되는 건 금방 알겠는데 어떻게 테두리 영역만 따로 구하고 테두리 영역중에서 구멍이랑 맞닿은 테두리 부분은 제외 해줘야할 지 감이 잘 안잡혔다.

 

 

하지만 이 문제는 생각을 조금만 다르게 해주면 금방 풀린다. 처음에는 치즈의 영역에 너무 집착 했는데 반대로 공기의 영역을 먼저 구해주면된다.

 

 

공기의 영역을 어떻게 구해주냐하면 가장자리는 항상 공기 부분이 되기 때문에 0,0 지점부터 BFS를 시작하여 인접한 부분중에 0인 부분만 방문해주면 된다. 그렇게 되면 구멍 부분을 제외한 공기부분이 전부 방문 처리 된다.

 

 

 

위 내용에 대한 그림 예시이다. 빨간색으로 칠한 부분이 전부 방문 처리 되게 된다.

 

이렇게 방문처리 해준 후 치즈가 있는 좌표가 방문 처리된 좌표와 맞닿아있다면 공기로 바꾸어 주면 된다.

 

정답 코드

from collections import deque
r,c = map(int,input().split())
graph = []
for _ in range(r):
    row = list(map(int,input().split()))
    graph.append(row)
dx = [0,0,1,-1]
dy = [1,-1,0,0]


#구멍이 아닌 공기만 방문
def bfs():
    #0,0은 판의 가장자리이므로 항상 0임
    q=deque([(0,0)])
    visited[0][0] = 1

    while(q):
        x,y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0<= nx<r and 0<=ny<c and visited[nx][ny] == 0 and graph[nx][ny] == 0:
                visited[nx][ny] = 1
                q.append((nx,ny))
pre = 0
cnt = 0
t = 0
for g in graph:
    cnt += g.count(1)

while True:
    #치즈가 사라지면 종료
    cnt = 0
    for g in graph:
        cnt += g.count(1)
    if cnt == 0:
        break
    visited = [[0]*c for _  in range(r)]
    #구멍을 제외한 공기만 방문하는 함수
    bfs()
    for i in range(r):
        for j in range(c):
            if graph[i][j] == 1:
                #공기와 맞닿은 테두리 부분인지 체크
                check = False
                for k in range(4):
                    nx = i + dx[k]
                    ny = j + dy[k]
                    if 0<= nx<r and 0<=ny<c and visited[nx][ny] == 1:
                        check = True
                        break
                #테두리면 삭제 진행
                if check:
                    graph[i][j] = 0
    pre = cnt
    t += 1


print(t)
print(pre)

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

[백준] 10942 팰린드롬? - python 파이썬  (0) 2025.03.06
[백준] 1043번 거짓말 - python 파이썬  (0) 2025.03.05
[백준] 1339번 단위수학 -python 파이썬  (0) 2025.03.04
[백준] 3055 탈출 - python 파이썬  (0) 2025.02.26
[백준] 1976번 여행가자 - python파이썬  (0) 2025.02.17
'코딩테스트/백준' 카테고리의 다른 글
  • [백준] 10942 팰린드롬? - python 파이썬
  • [백준] 1043번 거짓말 - python 파이썬
  • [백준] 1339번 단위수학 -python 파이썬
  • [백준] 3055 탈출 - python 파이썬
hiwon
hiwon
천천히 굴러가는 코딩일기
  • hiwon
    하이원의 코딩 일기
    hiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (83)
      • 프론트엔드 (0)
        • react (0)
      • 백엔드 (13)
        • node.js (1)
        • spring (6)
      • 코딩테스트 (57)
        • 백준 (41)
        • 프로그래머스 (15)
      • 프로디지털아카데미 (9)
        • 클라우드 (1)
        • JavaScript (1)
      • github (1)
      • AWS (2)
      • Infra (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BFS
    프로디지털아카데미
    github
    MSA
    UnionFind
    bastion host
    프디아
    kdt교육
    알파코
    깃허브
    신한투자증권
    파이썬
    AWS
    코딩테스트
    그리디
    다익스트라
    알고리즘
    백트래킹
    투포인터
    프로그래머스
    코테
    Java
    spring
    EC2
    python
    IT기획
    K디지털트레이닝
    알파코캠퍼스
    백엔드
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hiwon
[백준] 2636번 치즈 - python 파이썬
상단으로

티스토리툴바