Notice
Recent Posts
Recent Comments
Link
DevKim
[Python] 삼성 sw 기출 문제 - 마법사 상어와 비바라기 본문
728x90
https://www.acmicpc.net/problem/21610
[ 알고리즘 ]
단순구현
[ 접근 방법 ]
역시 삼성 문제는 문제 이해가 최우선이다.
조건이 복잡하고 길고 조건이 왔다갔다해서 조건 하나라도 빼먹으면 무한 디버깅에 빠지게 된다 (=나^^)
이 문제는 이동하는걸 어렵게 생각해서 시간을 많이 잡아먹었다.
(x,y) 라고 놓고 생각하면 x가 음수방향으로 움직일 때, 양수방향일 때.. 생각으로 빠지게된다.
각 행과 열을 연결했으므로 동그랗게 연결되어있다고 생각하면
x,y모두 어느 방향으로 가던지간에 (x+x방향*이동거리)%n ,(y+y방향*이동거리)%n 으로 끝낼 수 있다.
파이썬에서 -1/5 은 몫이 -1이고 나머지가 4로 나오는 로직을 다시 한번 기억하자
그 후로는 조건을 하나하나 차근차근 생각하며 구현하면된다.
[ 코드 ]
import copy
n, m = map(int, input().split()) # n*n,m번 이동
graph = []
dic={
1:(0,-1),
2: (-1,-1),
3:(-1,0),
4:(-1,1),
5:(0,1),
6:(1,1),
7:(1,0),
8:(1,-1)
}
for _ in range(n):
graph.append(list(map(int, input().split())))
cloud_pre=[(n-1,0),(n-1,1),(n-2,0),(n-2,1)]
for k in range(m):
cloud_now = []
d, move = map(int, input().split()) # d방향으로 move칸 이동
#1. 모든 구름 d방향으로 s칸 이동
for cloud in cloud_pre:
x=cloud[0]
y=cloud[1]
xx,yy=dic[d]
move_x=(x+xx*move)%n
move_y=(y+yy*move)%n
cloud_now.append((move_x,move_y))
#2단계
for x,y in cloud_now:
graph[x][y]+=1
#대각선 체크
dx=[-1,-1,1,1]
dy=[-1,1,1,-1]
#4단계
for cloud in cloud_now:
x=cloud[0]
y=cloud[1]
for i in range(4):
xx=dx[i]
yy=dy[i]
if x+xx<0 or x+xx>=n or y+yy<0 or y+yy>=n:
continue
if graph[x+xx][y+yy]>0:
graph[x][y]+=1
#5단계
List = set(copy.deepcopy(cloud_now))
cloud_pre=[]
for i in range(n):
for j in range(n):
if (i,j) not in List and graph[i][j]>=2:
graph[i][j] -= 2
cloud_pre.append((i,j))
print(sum([sum(i) for i in graph]))
728x90
'알고리즘 PS' 카테고리의 다른 글
[Python] 2021 카카오 인턴십 기출문제 - 거리두기 확인하기 (0) | 2021.07.20 |
---|---|
[Python] 프로그래머스 LV.03 - 이중우선순위큐 (0) | 2021.07.13 |
[Python] 프로그래머스 LV.02 - 2개 이하로 다른 비트 (0) | 2021.07.01 |
[Python] LV.02 - 행렬 테두리 회전하기 (0) | 2021.06.30 |
[Python] 프로그래머스 LV.02 - 괄호 회전 (0) | 2021.06.30 |
Comments