[백준][Python] 17144 - 미세먼지 안녕

2024. 4. 11. 16:59· 코딩테스트/백준

문제 링크

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net


문제 풀이 과정

T 초 후에 방에 미세먼지가 얼마나 남았는지 총합을 계산하는 문제.

  • 미세먼지와 공기청정기 파트로 나눠서 생각하고 구현
  • 미세먼지
    • 미세먼지는 인접한 4개(상하좌우) 방향으로 확산
    • 확산할 공간에 공기청정기가 있거나 공간의 끝이면 확산되지 않음.
    • 확산되는 양은 A(기존에 미세먼지가 있었던 칸의 양) // 5
    • 확산되면 기존 칸의 양은 A - ((A // 5) * 확산된 방향 수)
  • 공기청정기
    • 1열에 2칸에 -1의 형태로 존재.
    • 상부와 하부에 따라 바람 방향이 반대로 순환(상부 : 반시계, 하부 : 시계)
    • 미세먼지는 공기청정기의 바람 방향에 따라 이동함.(바람이 닿는 곳만)
    • 순환하다가 공기청정기와 닿으면 미세먼지는 사라짐.

from sys import stdin
input = stdin.readline

# 입력을 받는 부분
R, C, T = map(int, input().rstrip().split())

# 이차원 그래프를 만드는 부분
graph = [list(map(int, input().rstrip().split())) for _ in range(R)]

# 공기청정기 위아래 행 위치
down = 0
up = 0
for i in range(R):
    if graph[i][0] == -1:
        up = i
        down = i + 1
        break

# 미세먼지를 확산시키는 함수
# 필요한 값 : 공기청정기 위치, 4 방향에 대한 값, 전체 순회하며 값 수정.
def spread_dust():
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]

    new_graph = [[0] * C for _ in range(R)]
    new_graph[up][0] = -1
    new_graph[down][0] = -1

    for i in range(R):
        for j in range(C):
            if graph[i][j] > 0:
                new_graph[i][j] += graph[i][j]
                for k in range(4):
                    nx = i + dx[k]
                    ny = j + dy[k]

                    # 확산되는 공간이 공기청정기거나 공간의 끝이면 확산 X
                    if 0 <= nx < R and 0 <= ny < C and graph[nx][ny] != -1:
                        new_graph[nx][ny] += graph[i][j] // 5
                        new_graph[i][j] -= graph[i][j] // 5
    return new_graph


# 공기청정기 바람을 이동시키는 함수
def clean():
    # 공기청정기를 진행 방향에 따라 한 줄 씩 진행
    # 반시계면 아래 => 오른쪽 => 위 => 왼쪽 순

    # 위쪽 공기청정기 작동 (반시계 방향 순환)
    for i in range(up - 1, 0, -1): # 상단에서 아래로
        graph[i][0] = graph[i - 1][0]
    for i in range(C - 1): # 왼쪽에서 오른쪽으로
        graph[0][i] = graph[0][i + 1]
    for i in range(up): # 위에서 아래로
        graph[i][C - 1] = graph[i + 1][C - 1]
    for i in range(C - 1, 1, -1): # 오른쪽에서 왼쪽으로
        graph[up][i] = graph[up][i - 1]
    graph[up][1] = 0  # 공기청정기 바로 옆은 항상 0

    # 아래쪽 공기청정기 작동 (시계 방향 순환)
    for i in range(down + 1, R - 1):  # 하단에서 위로
        graph[i][0] = graph[i + 1][0]
    for i in range(C - 1): # 왼쪽에서 오른쪽으로
        graph[R - 1][i] = graph[R - 1][i + 1]
    for i in range(R - 1, down, -1): # 아래에서 위로
        graph[i][C - 1] = graph[i - 1][C - 1]
    for i in range(C - 1, 1, -1): # 오른쪽에서 왼쪽으로
        graph[down][i] = graph[down][i - 1]
    graph[down][1] = 0  # 공기청정기 바로 옆은 항상 0



for _ in range(T):
    graph = spread_dust()
    clean()


print(sum([sum(line) for line in graph]) + 2)
저작자표시 (새창열림)

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

[백준][Java] 2609 - 최대공약수와 최소공배수  (1) 2024.10.23
[백준][Python] 10828 - 스택  (0) 2024.07.10
'코딩테스트/백준' 카테고리의 다른 글
  • [백준][Java] 2609 - 최대공약수와 최소공배수
  • [백준][Python] 10828 - 스택
solitude12
solitude12
solitude12
Digital Agora
solitude12
전체
오늘
어제
  • 분류 전체보기 (54)
    • Programming Language (0)
      • Java (0)
    • Web Programming (2)
      • Spring Boot (3)
    • Computer Science (10)
    • 항해99 (28)
      • 1주차 (6)
      • 2-4주차 (18)
      • 5-8주차 (3)
    • 코딩테스트 (11)
      • 알고리즘 (4)
      • 백준 (3)
      • 프로그래머스 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바
  • spring boot
  • bfs
  • 구현
  • 백준
  • 컴퓨터 구조
  • 그래프
  • 알고리즘
  • 컴퓨터구조
  • Java
  • 다익스트라
  • spring
  • dfs
  • 개발자취준
  • 자료구조
  • 취리코
  • 스택
  • 개발자포트폴리오
  • 프로그래머스
  • 코딩테스트
  • cs
  • 개발자취업
  • 항해99
  • 배열
  • 취업리부트코스
  • Collection
  • 개발자부트캠프
  • Stack
  • 개발자이력서
  • 큐

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
글쓰기 / 관리자
solitude12
[백준][Python] 17144 - 미세먼지 안녕
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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