장 준
씨포유
장 준
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • 프로그래밍언어 (15)
      • c언어 (10)
      • 파이썬 (0)
      • 자바스크립트 (5)
    • PS (58)
      • 알고리즘 이론 (18)
      • 프로그래머스 (5)
      • 백준 (35)
    • CS (16)
      • 자료구조 (5)
      • 운영체제 (3)
      • 네트워크 (5)
      • 데이터베이스 (0)
      • 기초 지식 (3)
    • 브랜드 (1)

블로그 메뉴

  • 태그

인기 글

태그

  • Kruskal algorithm
  • JS
  • PS
  • 씨포유
  • bitmask
  • Visual Studio
  • Network
  • DFS
  • 자바스크립트
  • 파이썬
  • CS
  • 프로그래밍언어
  • nodejs
  • 백준
  • codesandbox
  • BFS
  • 알고리즘
  • Stack
  • pypy3
  • python3
  • Priority Queue
  • recursion
  • 코딩테스트
  • C
  • 자료구조
  • 프로그래머스
  • Implementation
  • DP
  • 기초 지식
  • JavaScript

최근 댓글

최근 글

hELLO · Designed By 정상우.
장 준

씨포유

[백준(BOJ)] #17144- 미세먼지 안녕! (파이썬, PyPy3)
PS/백준

[백준(BOJ)] #17144- 미세먼지 안녕! (파이썬, PyPy3)

2022. 7. 11. 14:37
728x90

문제

 

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 


문제 풀이

 

우선 이 문제는 구현 문제로 문제 이해를 이해하고, 문제를 어떻게 코드로 작성할 수 있는지를 확인하는 것으로 느껴졌습니다. 조건을 조금이라도 놓치고 문제를 풀게 되면, 원치 않은 결과를 얻을 수 있으므로 문제를 꼼꼼하게 읽어보는 것이 필수입니다!

 

미세먼지 확산 과정

미세먼지의 확산은 미세먼지가 있는 모든 칸에서 동시에 일어나기 때문에 2차원 리스트를 순차적으로 돌면서 무턱대고 확산을 적용하면 안 됩니다.

그러면 위와 같이 (0,1) 자리에 있는 미세먼지 값 30이 확산되면서 오른쪽에 있는 (0,2) 미세먼지에 영향을 끼치고 이 자리에 있는 값은 더해진 값으로 확산이 되기 때문입니다. 따라서 먼저 미세먼지가 있는 자리들을 현재 값과 같이 리스트에 저장을 하고, 그 리스트를 순차적으로 돌면서 확산을 시켜줍니다. 이때 확산 시킬 때는 영향받은 값은 확산할 때 제외시키기 위해서 저장했던 현재 값으로 확산을 시켜나가면 됩니다. 이 리스트를 순차적으로 돌면서 확산을 시켜주면 1초 동안의 확산은 마무리 됩니다.

 

 

공기청정기 작동 과정

 

공기청정기의 작동 과정은 바람이 위에서 나오는 위치 위 그림에서는 (2, 0), 아래에서 나오는 위치 (3, 0)을 기준으로 리스트를 위 그림과 같이 조정해줍니다. 위 그림은 1초 동안 공기청정기가 작동된 결과입니다.

 


구현

코드

import sys
input = sys.stdin.readline

# 미세먼지 상하좌우 확산
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 미세먼지 확산 함수
def inc(xx, yy, orgv):
    cnt = 0
    # 원래 값으로 확산하기 위해 값을 빼줌
    board[xx][yy] -= orgv
    for h in range(4):
        x = xx + dx[h]
        y = yy + dy[h]
        if 0 <= x < r and 0 <= y < c and board[x][y] != -1:
            cnt += 1
            board[x][y] += orgv // 5
    orgv -= (orgv // 5) * cnt
    # 확산시킨 다음 값을 다시 더해줌
    board[xx][yy] += orgv

# 공기청정기 위에서 나오는 바람으로 순환시키는 함수(반시계 방향)
def top_rot(s_i):
    for i in range(s_i-1, 0, -1):
        board[i][0] = board[i-1][0]

    board[0] = board[0][1:] + [0]

    for i in range(1, s_i+1):
        board[i-1][c-1] = board[i][c-1]

    board[s_i] = [-1, 0] + board[s_i][1:c-1]

# 공기청정기 아래에서 나오는 바람으로 순환시키는 함수(시계 방향)
def bottom_rot(s_i):
    for i in range(s_i + 1, r-1):
        board[i][0] = board[i+1][0]

    board[r-1] = board[r-1][1:] + [0]

    for i in range(r-1, s_i, -1):
        board[i][c-1] = board[i-1][c-1]

    board[s_i] = [-1, 0] + board[s_i][1:c-1]

if __name__ == "__main__":
    r, c, t = map(int, input().split())
    board = [list(map(int, input().split())) for _ in range(r)]
    d_list = list()
    top_s_pos = None
    bottom_s_pos = None

    # 공기청정기 위치
    for i in range(r):
        if board[i][0] == -1:
            top_s_row = i
            bottom_s_row = i+1
            break
    # t초 동안
    for _ in range(t):
        for i in range(r):
            for j in range(c):
            	# 미세먼지가 있는 위치를 값과 같이 저장
                if board[i][j] != 0 and board[i][j] != -1:
                    d_list.append((i, j, board[i][j]))

        # 확산
        for d in d_list:
            x, y, ov = d
            inc(x, y, ov)
        d_list.clear()
        # 공기청정기 작동
        top_rot(top_s_row)
        bottom_rot(bottom_s_row)
    cnt = 0
    # t초가 끝난뒤 미세먼지의 양
    for i in range(r):
        for j in range(c):
            if board[i][j] != 0 and board[i][j] != -1:
                cnt += board[i][j]
    print(cnt)

 

결과


 

728x90
반응형
저작자표시

'PS > 백준' 카테고리의 다른 글

[백준(BOJ)] #1717- 집합의 표현 (파이썬, Python3)  (0) 2022.07.25
[백준(BOJ)] #11000- 강의실 배정 (파이썬, Python3)  (2) 2022.07.23
[백준(BOJ)] #2263- 트리의 순회 (파이썬, Python3)  (0) 2022.07.20
[백준(BOJ)] #1285- 동전 뒤집기 (파이썬, PyPy3)  (0) 2022.07.18
[백준(BOJ)] #19236- 청소년 상어 (파이썬, PyPy3)  (0) 2022.07.13
    'PS/백준' 카테고리의 다른 글
    • [백준(BOJ)] #11000- 강의실 배정 (파이썬, Python3)
    • [백준(BOJ)] #2263- 트리의 순회 (파이썬, Python3)
    • [백준(BOJ)] #1285- 동전 뒤집기 (파이썬, PyPy3)
    • [백준(BOJ)] #19236- 청소년 상어 (파이썬, PyPy3)
    장 준
    장 준
    C4U(Computer For You)

    티스토리툴바