happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/Python 문제풀이

[백준] 미세먼지 안녕!

2022. 9. 7. 00:07

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

구현 문제입니다.

 

우선 문제부터 간단하게 요약하면, 방에 미세먼지와 공기 청정기가 있고, 매 1초마다 두가지 과정이 진행됩니다.

1. 미세먼지의 확산

2. 공기청정기로 인한 공기 정화와 순환

이러한 과정이 T 초간 일어난 후 방안의 전체 미세먼지의 수를 출력해야 하는 문제입니다. 

 

<Solution>

특별한 알고리즘이 사용되지 않고, 말 그대로 1,2의 과정을 정확하게 구현하면 됩니다. 

for loop 내부에 step1, step2과정을 넣어 T초 만큼 진행 될 수 있게 구현하였습니다.

 

실제 구현은 아래와 같습니다.

import sys
import copy
dir_r = [-1,1,0,0]
dir_c = [0,0,1,-1]
R, C, T = list(map(int,sys.stdin.readline().rstrip().split()))

array = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(R)]

for _ in range(T):
    # step 1
    new_array = [[0 for _ in range(C)] for _ in range(R)]

    for r in range(R):
        for c in range(C):
            if array[r][c] >0:
                # spread
                dust = array[r][c]
                cnt = 0
                for i in range(4):
                    new_r = r+dir_r[i]
                    new_c = c+dir_c[i]
                    
                    if 0<=new_r<R and 0<=new_c<C: # not out of range
                        if array[new_r][new_c] == -1:
                            continue
                        new_array[new_r][new_c] += dust//5
                        cnt+=1
                array[r][c] -= dust//5 * cnt


    cleaner = []
    for r in range(R):
        for c in range(C):
            if array[r][c] == -1:
                cleaner.append(r)
                continue
            array[r][c] += new_array[r][c]
    
    # print("after step1")        
    # for e in array:
    #     print(e)
    # print("-------------------------------------")
    
    # step 2
    new_array = copy.deepcopy(array)
    # up rotate
    r = cleaner[0]
    for i in range(1,r+1):
        new_array[i][0] = array[i-1][0]
        new_array[i-1][C-1] = array[i][C-1]
    new_array[0] = array[0][1:] + [array[1][C-1]]
    new_array[r] = [-1,0] + array[r][1:-1]
    # down rotate
    r = cleaner[1]
    for i in range(r+1,R-1):
        new_array[i][0] = array[i+1][0]
        new_array[i][C-1] = array[i-1][C-1]
    new_array[R-1] = array[R-1][1:] + [array[R-2][C-1]]
    new_array[r] = [-1,0] + array[r][1:-1]
    # print("after step2")        
    # for e in new_array:
    #     print(e)
    # print("-------------------------------------")
    
    array = new_array
print(sum(list(map(sum,new_array)))+2)
반응형

'코딩테스트 > Python 문제풀이' 카테고리의 다른 글

[백준] 치킨 배달  (0) 2022.09.09
[백준] 서강그라운드  (4) 2022.09.08
[백준] 숨바꼭질 2  (0) 2022.09.06
[백준] 최소비용 구하기 2  (0) 2022.09.06
[백준] 감시  (0) 2022.07.28
    '코딩테스트/Python 문제풀이' 카테고리의 다른 글
    • [백준] 치킨 배달
    • [백준] 서강그라운드
    • [백준] 숨바꼭질 2
    • [백준] 최소비용 구하기 2
    happy318
    happy318

    티스토리툴바