[Python] BOJ / 17144번 / 미세먼지 안녕!

2022. 6. 26. 11:33·🥇 Problem Solving/Simulation
 

17144번: 미세먼지 안녕!

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

www.acmicpc.net


📝 풀이

  • T초 동안 미세먼지의 확산과 순환이 반복적으로 일어나며 T초가 지난 후에 방에 남아있는 미세먼지의 양을 출력하는 문제
  • 미세먼지 확산 알고리즘의 경우 확산과 동시에 원래 해당 칸에 있던 값이 덮어씌워지는 것을 방지하기 위해 임시로 리스트를 하나 더 생성하여 구현하였음
  • 미세먼지 순환 알고리즘의 경우 공기청정기에 따른 순환 방향을 미리 정의해놓고 하나의 함수를 통해 해당 방향에 따라 미세먼지가 순환할 수 있도록 구현하였음

💻 소스코드

import sys

sys.stdin.readline

def spread():
    dy = (1, -1, 0, 0)
    dx = (0, 0, 1, -1)

    tmp_room = [[0] * c for _ in range(r)]
    for y in range(r):
        for x in range(c):
            if room[y][x] > 0:
                tmp = 0
                for k in range(4):
                    ny = y + dy[k]
                    nx = x + dx[k]
                    if 0 <= ny < r and 0 <= nx < c and room[ny][nx] != -1:
                        tmp_room[ny][nx] += room[y][x] // 5
                        tmp += room[y][x] // 5
                room[y][x] -= tmp

    for i in range(r):
        for j in range(c):
            room[i][j] += tmp_room[i][j]

def rotate(move, cleaner):
    dir = prev = 0
    y, x = cleaner, 1
    while True:
        ny = y + move[dir][0]
        nx = x + move[dir][1]

        if room[y][x] == -1:
            break
        if not 0 <= ny < r or not 0 <= nx < c:  #맵 끝에 다다를 시 방향을 바꿈
            dir += 1
            continue

        room[y][x], prev = prev, room[y][x]
        y, x = ny, nx

def count():
    result = 0
    for i in range(r):
        for j in range(c):
            if room[i][j] > 0:
                result += room[i][j]

    return result

r, c, t = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(r)]

up_move = ((0, 1), (-1, 0), (0, -1), (1, 0))    #위쪽 공기청정기 순환
down_move = ((0, 1), (1, 0), (0, -1), (-1, 0))  #아래쪽 공기청정기 순환

# 공기청정기 위치 확인
up = down = 0
for i in range(r):
    if room[i][0] == -1:
        up = i
        down = i + 1
        break

for _ in range(t):
    spread()    #미세먼지 확산
    rotate(up_move, up) #시계방향 회전
    rotate(down_move, down) #반시계방향 회전

print(count())
저작자표시 (새창열림)

'🥇 Problem Solving > Simulation' 카테고리의 다른 글

[Python] BOJ / 1158번 / 요세푸스 문제  (0) 2023.04.29
[Python] BOJ / 1193번 / 분수찾기  (0) 2023.04.28
[Python] BOJ / 15683번 / 감시  (0) 2022.06.02
[Python] BOJ / 14891번 / 톱니바퀴  (0) 2022.05.20
[Python] BOJ / 14499번 / 주사위 굴리기  (0) 2022.05.05
'🥇 Problem Solving/Simulation' 카테고리의 다른 글
  • [Python] BOJ / 1158번 / 요세푸스 문제
  • [Python] BOJ / 1193번 / 분수찾기
  • [Python] BOJ / 15683번 / 감시
  • [Python] BOJ / 14891번 / 톱니바퀴
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[Python] BOJ / 17144번 / 미세먼지 안녕!
상단으로

티스토리툴바