[Python] 2636 - 치즈 (골드4)

2022. 6. 26. 10:39·Coding Test/Solution

1. 문제 설명

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

 

2636번: 치즈

첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다. 세로와 가로의 길이는 최대 100이다. 판의 각 가로줄의 모양이 윗 줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진

www.acmicpc.net

 


2. 아이디어

너비 우선 탐색(BFS, Breadth-First Search)를 처음으로 사용해본 문제였다.

해당 알고리즘을 알면 매우 쉽게 해결할 수 있는 문제이지만,

BFS를 모르면 이해가 안 갈 수 있다.

알고리즘에 대한 설명은 Algorithm 탭에서 한 번에 다루도록 하고

bfs를 사용하여 어떻게 문제를 해결할 수 있는가에 대한 아이디어만 다루도록 하겠다.

 

우선 가장 테두리는 언제나 공기 영역이므로 (0, 0)을 queue에 넣어 이동시킨다.

이때 visited의 역할이 굉장히 중요한데, 방문 처리하는 경우는 두 가지이다.

  • 현재 위치가 방문처리 되어 있지 않다면 1로 바꿈
  • 현재 위치에서 다음 위치로 이동했는데 치즈 영역이면 1로 바꿈
  • 현재 위치에서 다음 위치가 공기 영역이면 1로 바꾸면 안 됨

다른 건 전형적인 bfs 문제인데, 마지막 방문 처리 조건을 나누는 것이 살짝 까다롭다.

 

1. 공기 -> 공기

    : 그냥 다음 공기를 큐에 넣어주면 알아서 반복문을 돌면서 알아서 방문처리하고 할 거 다 한다.

2. 공기 -> 치즈

     : 치즈 위치를 큐에 넣지 않는다는 건 생각해보면 너무 당연한 이야기이다.

       애초에 치즈를 큐에 넣고 이동한다는 건 이 알고리즘 목적과 부합하지 않는다.

       따라서 방문처리를 함으로써 재접근이 불가능하도록 막고 cnt를 1 증가시키고 넘어간다.

 

이번 회차에 녹인 치즈의 개수 cnt는 두 가지 용도로 쓸 수 있는데,

우선 최종적으로 출력해야할 결과값 때문에 필요하고

bfs 반복문 탈출조건으로도 사용할 수 있다.

cnt가 0은 곧 더이상 녹일 치즈가 존재하지 않았다는 의미이므로 누적된 결과를 return하고 출력하면 끝난다.

 


3. 코드

move = [(-1, 0), (0, 1), (1, 0), (0, -1)]

def bfs(table, row, col):
    queue = [(0, 0)]
    time = 0

    while queue:
        visited = [[0]*col for _ in range(row)]
        cnt = 0
        for y, x in queue:
            if not visited[y][x]:
                visited[y][x] = 1
                for q, p in move:
                    m_y = y + q
                    m_x = x + p
                    if 0 <= m_y < row and 0 <= m_x < col:
                        if table[m_y][m_x] == 0:
                            queue.append((m_y, m_x))
                        else:
                            table[m_y][m_x] = 0
                            visited[m_y][m_x] = 1
                            cnt += 1
        if cnt == 0:
            return time, result
        else:
            result = cnt
            time += 1
            queue.clear()
            queue = [(0, 0)]

def solution():
    row, col = map(int, input().split())
    table = [list(map(int, input().split())) for _ in range(row)]
    
    time, cnt = bfs(table, row, col)
    print(time)
    print(cnt)

solution()
저작자표시 비영리 (새창열림)
'Coding Test/Solution' 카테고리의 다른 글
  • [Python] 2133 - 타일 채우기 (골드4)
  • [Python] 1788 - 피보나치 수의 확장 (실버3)
  • [Python] 1912 - 연속합 (실버2)
  • [Python] 1058 - 토너먼트 (실버3)
나죽못고나강뿐
나죽못고나강뿐
싱클레어, 대부분의 사람들이 가는 길은 쉽고, 우리가 가는 길은 어려워요. 우리 함께 이 길을 가봅시다.
  • 나죽못고나강뿐
    코드를 찢다
    나죽못고나강뿐
  • 전체
    오늘
    어제
    • 분류 전체보기 (458)
      • Computer Science (60)
        • Git & Github (4)
        • Network (17)
        • Computer Structure & OS (13)
        • Software Engineering (5)
        • Database (9)
        • Security (5)
        • Concept (7)
      • Frontend (21)
        • React (13)
        • Android (4)
        • iOS (4)
      • Backend (77)
        • Spring Boot & JPA (50)
        • Django REST Framework (14)
        • MySQL (8)
        • Nginx (1)
        • FastAPI (4)
      • DevOps (24)
        • Docker & Kubernetes (11)
        • Naver Cloud Platform (1)
        • AWS (2)
        • Linux (6)
        • Jenkins (0)
        • GoCD (3)
      • Coding Test (112)
        • Solution (104)
        • Algorithm (7)
        • Data structure (0)
      • Reference (134)
        • Effective-Java (90)
        • Pragmatic Programmer (0)
        • CleanCode (11)
        • Clean Architecture (2)
        • Test-Driven Development (4)
        • Relational Data Modeling No.. (0)
        • Microservice Architecture (2)
        • 알고리즘 문제 해결 전략 (9)
        • Modern Java in Action (0)
        • Spring in Action (0)
        • DDD start (0)
        • Design Pattern (6)
        • 대규모 시스템 설계 (6)
        • JVM 밑바닥까지 파헤치기 (4)
      • Service Planning (2)
      • Side Project (5)
      • AI (0)
      • MATLAB & Math Concept & Pro.. (1)
      • Review (18)
      • Interview (2)
      • IT News (2)
  • 블로그 메뉴

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

    • 깃
  • 공지사항

    • 한동안 포스팅은 어려울 것 같습니다. 🥲
    • N Tech Service 풀스택 신입 개발자가 되었습니다⋯
    • 취업 전 계획 재조정
    • 취업 전까지 공부 계획
    • 앞으로의 일정에 대하여..
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
나죽못고나강뿐
[Python] 2636 - 치즈 (골드4)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.