삼성 SW 역량 테스트 기출 문제
https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 1번 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼
www.acmicpc.net



Solution
from collections import deque | |
import copy | |
def munji(m, k): | |
after_munji = copy.deepcopy(m) | |
if k == t: | |
ans = 0 | |
for i in range(r): | |
ans += sum(after_munji[i]) | |
print(ans+2) | |
return | |
q = deque() | |
for i in range(r): | |
for j in range(c): | |
if m[i][j] > 0: | |
q.append((i,j)) | |
while q: | |
y, x = q.popleft() | |
cnt = 0 | |
for dx, dy in (-1,0),(1,0),(0,-1),(0,1): | |
nx, ny = x+dx, y+dy | |
if nx < 0 or nx >= c or ny < 0 or ny >= r: | |
continue | |
if m[ny][nx] != -1: | |
after_munji[ny][nx] += m[y][x]//5 | |
cnt += 1 | |
after_munji[y][x] -= ((m[y][x]//5) * cnt) | |
cn = [] | |
for i in range(r): | |
if m[i][0] == -1: | |
cn.append(i) | |
tmp = [after_munji[cn[0]][1]] | |
after_munji[cn[0]][1] = 0 | |
for i in range(2,c-1): | |
tmp.append(after_munji[cn[0]][i]) | |
after_munji[cn[0]][i] = tmp.pop(0) | |
for i in range(cn[0], -1, -1): | |
tmp.append(after_munji[i][c-1]) | |
after_munji[i][c-1] = tmp.pop(0) | |
for i in range(c-2, -1, -1): | |
tmp.append(after_munji[0][i]) | |
after_munji[0][i] = tmp.pop(0) | |
for i in range(1, cn[0]): | |
tmp.append(after_munji[i][0]) | |
after_munji[i][0] = tmp.pop(0) | |
tmp = [after_munji[cn[1]][1]] | |
after_munji[cn[1]][1] = 0 | |
for i in range(2,c-1): | |
tmp.append(after_munji[cn[1]][i]) | |
after_munji[cn[1]][i] = tmp.pop(0) | |
for i in range(cn[1], r): | |
tmp.append(after_munji[i][c-1]) | |
after_munji[i][c-1] = tmp.pop(0) | |
for i in range(c-2, -1, -1): | |
tmp.append(after_munji[r-1][i]) | |
after_munji[r-1][i] = tmp.pop(0) | |
for i in range(r-2, cn[1], -1): | |
tmp.append(after_munji[i][0]) | |
after_munji[i][0] = tmp.pop(0) | |
munji(after_munji,k+1) | |
r, c, t = map(int, input().split(' ')) | |
maps = [list(map(int, input().split(' '))) for _ in range(r)] | |
after_munji = copy.deepcopy(maps) | |
munji(maps,0) |
문제 유형 : 시뮬레이션, BFS/DFS
삼성에는 유독 이런 시뮬레이션 문제가 많은 것 같다.
많은 건 좋지만 내가 좀 어려워하는 경향이 있어서 그게 문제다.
쉽게 말해서 나와있는 문제의 조건들을 구현만 하면 되는 건데 왜 이렇게 까다로운지 모르겠다.
이게 정답률 54%라니 역시 코딩 잘하는 사람이 너무 많다.
구현해야할 것은 크게 두 개.
1. 미세먼지 확산
미세먼지가 확산하는 것은 BFS로 구현했다.
미세먼지가 있는 칸을 큐에 담고 공기 청정기가 있는 인덱스가 아니면 확산시킨다.
2. 공기청정기 작동
공기청정기가 특이하게 작동해서 좀 골치아팠다.
미세먼지를 한 칸씩 밀면서 가로, 세로에 겹치는 칸들이 있어서 주의하면서 구현했다.
초마다 1, 2가 순서대로 일어나므로 T초 뒤의 미세먼지 양을 출력.

'Algorithm > BOJ' 카테고리의 다른 글
[백준/Python] 14502번 연구소 (0) | 2020.04.15 |
---|---|
[백준/Python] 14891번 톱니바퀴 (0) | 2020.04.11 |
[백준/Python] 17822번 원판 돌리기 (0) | 2020.04.09 |
[백준/Python] 2644번 촌수계산 (0) | 2020.04.09 |
[백준/Python] 15686번 치킨 배달 (0) | 2020.04.09 |