DevKim

[Python] 삼성 sw 기출 문제 - 마법사 상어와 비바라기 본문

알고리즘 PS

[Python] 삼성 sw 기출 문제 - 마법사 상어와 비바라기

on_doing 2021. 7. 3. 11:48
728x90

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

 

21610번: 마법사 상어와 비바라기

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기

www.acmicpc.net

 

[ 알고리즘 ]

단순구현

 

[ 접근 방법 ]

역시 삼성 문제는 문제 이해가 최우선이다.

조건이 복잡하고 길고 조건이 왔다갔다해서 조건 하나라도 빼먹으면 무한 디버깅에 빠지게 된다 (=나^^)

 

이 문제는 이동하는걸 어렵게 생각해서 시간을 많이 잡아먹었다.

(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
Comments