[백준] 17144번: 미세먼지 안녕! (Python)

2023. 3. 28. 15:22·코딩테스트/백준

 

 

 

 

 

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

 

 

 

 

✅  Solution

  • 단순한 구현 문제이다. 그런데 공기청정기 동작 구현이 좀 어려워서 찾아봤다. 
  • 먼저 확산의 경우, 상하좌우를 체크해서 범위 내에 있고 공기청정기의 위치가 아닐 때 확산되는 양을 더해준다.
  • 그리고 그만큼의 양을 원래 양에서 빼준다.
  • 다음으로 공기청정기 동작은 시계방향, 반시계방향을 따로 처리해 줬다. 
  • 방향대로 쭉 밀어서 위치하도록 한다.
  • 위의 과정을 t번만큼 반복하고 미세먼지의 양을 모두 더해주면 된다.

 

 

 

 

 

✅ Code

import sys
input = sys.stdin.readline

def diffuse():
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
	
    # 확산은 동시에 일어나기 때문에 따로 배열은 선언 후 마지막에 한번에 처리해준다.
    diffused = [[0] * c for _ in range(r)]

    for x in range(r):
        for y in range(c):
            if data[x][y] <= 0:
                continue

            dust = data[x][y] // 5

            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                
                # 범위 내에 있고 공기 청정기의 위치가 아닐 때 
                if 0 <= nx < r and 0 <= ny < c and data[nx][ny] != -1:
                    diffused[nx][ny] += dust
                    diffused[x][y] -= dust
    
    # 확산된 양 반영  
    for x in range(r):
        for y in range(c):
            data[x][y] += diffused[x][y]

# 시계 방향
def clean_dust_up():
    dx = [0, -1, 0, 1]
    dy = [1, 0, -1, 0]

    x, y, direction = m1, 1, 0
    prev = 0

    while True:
        nx = x + dx[direction]
        ny = y + dy[direction]
        
        # 방향대로 모두 한칸씩 미뤘을 때 
        if x == m1 and y == 0:
            break

        if 0 > nx or nx >= r or 0 > ny or ny >= c:
            direction += 1
            continue

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

# 반시계 방향
def clean_dust_down():
    dx = [0, 1, 0, -1]
    dy = [1, 0, -1, 0]

    x, y, direction = m2, 1, 0
    prev = 0

    while True:
        nx = x + dx[direction]
        ny = y + dy[direction]

        # 방향대로 모두 한칸씩 미뤘을 때 
        if x == m2 and y == 0:
            break

        if 0 > nx or nx >= r or 0 > ny or ny >= c:
            direction += 1
            continue

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


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

# 공기청정기의 위치 
for i in range(r):
    if data[i][0] == -1:
        m1 = i
        m2 = i + 1
        break

for _ in range(t):
    diffuse()
    clean_dust_up()
    clean_dust_down()

for i in range(r):
    for j in range(c):
        if data[i][j] > 0:
            answer += data[i][j]

print(answer)

 

저작자표시 (새창열림)

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

[백준] 21608번: 상어 초등학교 (Python)  (2) 2023.04.05
[백준] 14499번: 주사위 굴리기 (Python)  (0) 2023.04.03
[백준] 15685번: 드래곤 커브 (Python)  (0) 2023.03.27
[백준] 14891번: 톱니바퀴 (Python)  (0) 2023.03.27
[백준] 11404번: 플로이드  (0) 2023.03.07
'코딩테스트/백준' 카테고리의 다른 글
  • [백준] 21608번: 상어 초등학교 (Python)
  • [백준] 14499번: 주사위 굴리기 (Python)
  • [백준] 15685번: 드래곤 커브 (Python)
  • [백준] 14891번: 톱니바퀴 (Python)
ye0nn
ye0nn
프론트엔드 개발자의 개발기록
  • ye0nn
    영차영차
    ye0nn
  • 전체
    오늘
    어제
    • 분류 전체보기 (61)
      • CS (0)
        • 운영체제 (0)
        • 네트워크 (0)
        • 알고리즘 & 자료구조 (0)
      • 코딩테스트 (48)
        • 프로그래머스 (40)
        • 백준 (8)
      • 프로그래밍 (11)
        • 프론트엔드 (3)
        • 자바스크립트 (0)
        • 스위프트 (7)
        • 파이썬 (1)
      • 취준기록 (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
ye0nn
[백준] 17144번: 미세먼지 안녕! (Python)
상단으로

티스토리툴바