Coding Test/백준(Python)

[백준/Python] 21610번(구현)_마법사 상어와 비바라기

syunze 2024. 3. 13. 15:23

📌문제 유형

구현, 시뮬레이션 (골드 5, 삼성기출)

 

📌문제

 

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

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

www.acmicpc.net

 

 

📌나의 문제풀이

- 주의사항

  • 2) 구름 비 내리고 물의 양 다 증가한 다음, 4) 대각선 관련 구현해야 함 (for문 2중으로 하면 틀림)
  • 구름 위치가 -이거나 n 넘어가는 경우 
    • - 인 경우 : n * ceil(move / n)
    • n 넘어가는 경우 : (- 인 경우 조정해도 n 넘어갈 수 있음, 그래서 if문 사용) groom[i][0] % n
from math import ceil
n,m = map(int, input().split())

maps = []
for _ in range(n):
    list_ = list(map(int,input().split()))
    maps.append(list_)

# 방향 원래 숫자 넘어가는거 조정해야 함
dirs = {1:[0,-1], 2:[-1,-1], 3:[-1,0], 4:[-1,1],
       5:[0,1], 6:[1,1], 7:[1,0], 8:[1,-1]}


groom = [[n-1,0], [n-1,1], [n-2,0], [n-2,1]]
for _ in range(m):
    dir, move = map(int,input().split())
    visited = [[0 for _ in range(n)] for _ in range(n)]

    # 1) 구름 이동, 2) 구름에서 비 내림
    for i in range(len(groom)):
        groom[i][0] = groom[i][0] + (dirs[dir][0] * move)
        groom[i][1] = groom[i][1] + (dirs[dir][1] * move)


        if groom[i][0] < 0:
            groom[i][0] += (n * ceil(move / n))
        if groom[i][0] >= n:
            groom[i][0] = groom[i][0] % n

        if groom[i][1] < 0:
            groom[i][1] += (n * ceil(move / n))
        if groom[i][1] >= n:
            groom[i][1] = groom[i][1] % n

        maps[groom[i][0]][groom[i][1]] += 1
        visited[groom[i][0]][groom[i][1]] = 1

    # 4) 물복사버그 마법
    for i in range(len(groom)):    
        cnt = 0
        dia = [[-1,-1], [-1,1], [1,1], [1,-1]]

        for k in range(4):
            nx = groom[i][0] + dia[k][0]
            ny = groom[i][1] + dia[k][1]
            if 0 <= nx < n and 0 <= ny < n:
                if maps[nx][ny] > 0:
                    cnt += 1
        maps[groom[i][0]][groom[i][1]] += cnt

    # 5) 바구니 물양 2 이상     
    groom = []
    for x in range(n):
        for y in range(n):
            if visited[x][y] == 0 and maps[x][y] >= 2:
                maps[x][y] -= 2
                groom.append([x,y])

ans = 0
for line in maps:
    ans += sum(line)
print(ans)

 

📌다른사람의 문제풀이

 

[백준 21610] 마법사 상어와 비바라기(Python 풀이)

https://www.acmicpc.net/problem/21610 21610번: 마법사 상어와 비바라기 마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를

kimjingo.tistory.com

 

📌리뷰

- 삼성문제는 조건 꼼꼼히! 하나라도 놓치면 틀림

728x90