20056.마법사 상어와 파이어볼

Updated:

Intro

  • 오늘은 삼성 SW 역량 모의 테스트를 대비해서 20056번 마법사 상어와 파이어볼 문제를 풀어보았습니다.


마법사 상어와 파이어볼

문제 설명
  • N: NxN격자크기, M: 파이어볼 갯수, K: 명령 횟수
  • 위치:r,c 질량:m 속력:s 방향:d
  • 명령
    1. 모든 파이어볼이 방향과 속력만큼 이동한다. (이동후 같은 칸에 파이어볼 중복 가능)
    2. 이동이 모든 끝난후, 같은칸의 파이어볼은 1개로 합쳐진다.
    3. 파이어볼은 4개로 나뉜다.
      • 질량: 질량합/5
      • 속력: 속력합/합쳐진갯수
      • 방향: 모두 홀수 or 짝수이면 0,2,4,6 or 1,3,5,7
      • 질량0인 파이어볼은 소멸


문제 접근 방식
  • dictionary를 이용해 key로는 해당 좌표, 그리고 value로는 질량, 속력, 방향을 저장하였습니다.
    • 좌표를 저장할때는 “행/열” 형태로 string으로 저장하였습니다.

    • 좌표가 이미 존재한다면, 질량, 속력, 방향을 추가하고, 존재하지 않는다면 새로운 key-value pair를 추가하는 방식으로 진행했습니다.


문제 답안
  • N, M, K = map(int, input().split())
    directions = {
        0: (-1, 0), 
        1: (-1, 1), 
        2: (0, 1), 
        3: (1, 1), 
        4: (1, 0), 
        5: (1, -1), 
        6: (0, -1), 
        7: (-1, -1)
    }
    fireballs = [list(map(int, input().split())) for _ in range(M)]
    for _ in range(K):
        info = dict()
        coordinates = set()
        for fireball in fireballs:
            r, c, m, s, d = fireball
            # 방향대로 이동하기 
            # 방향 구하기
            r = (r + directions[d][0]*s) % N
            c = (c + directions[d][1]*s) % N
      
            # hash로 처리하기 
            hashed= str(r) + "/" + str(c)
            if hashed in info:
                info[hashed].append([m, s, d])
            else:
                info[hashed] = [[m, s, d]]
                coordinates.add((r, c))
      
        # 파이어볼 합치기
        fireballs =[]
        for coord in coordinates:
            r, c = coord
            hashed = str(r) + "/" + str(c)
            # 만약 겹치는 좌표가 없다면 
            if len(info[hashed]) == 1:
                m, s, d = info[hashed][0]
                fireballs.append([r, c, m, s, d])
            # 만약 겹치는 좌표가 있다면 
            else:
                tot_mass = 0
                tot_velocity = 0
                direction = 99999
                direction_changed = False
                odd = 0
                even = 0
                # 해당 좌표의 각 파이어볼마다 
                for each in info[hashed]:
                    m, s, d = each
                    tot_mass += m
                    tot_velocity += s
                    # 방향이 바뀌는지 안바뀌는지 확인한다.
                    if d % 2 == 0:
                        even += 1
                    else:
                        odd += 1
      
                # 질량 구하기
                m = int(tot_mass/5)
                s = int(tot_velocity/len(info[hashed]))
                #방향이 바뀌었다면 
                if even and odd:
                    d = [1, 3, 5, 7]
                # 방향이 바뀌지 않았다면 
                else:
                    d = [0, 2, 4, 6]
                # 만약 질량이 0 이 아니면 fireballs 배열에 추가한다.
                if m != 0:
                    for i in range(4):
                        fireballs.append([r, c, m, s, d[i]])
    #총 질량 구하기
    ans = 0
    for coord in fireballs:
        ans += coord[2]
    print(ans)
    


Leave a comment