삼성 SW 역량 테스트 기출 문제

[Python](시뮬) 백준 20056번 : 마법사 상어와 파이어볼

Algomalgo 2024. 3. 11. 20:24
728x90


<접근 방법>

  1. 파이어볼의 정보를 담을 리스트 fireballs를 만들고 각각의 파이어볼 정보를 fireballs에 저장하고 파이어볼들을 arr에 위치시킨다.
  2. fireballs에 담겨있는 파이어볼의 정보를 pop으로 하나씩 꺼내 다음 좌표를 구한다. 이때 좌표의 양끝, 즉 위와 아래, 오른쪽과 왼쪽이 이어지는 좌표 특성이 있음에 유의한다. 따라서 파이어볼의 위치를 N으로 나눠준다.
    (모든 fireballs의 다음 좌표를 구하고 나면, fireballs는 빈 리스트 상태가 된다.)
  3. 모든 좌표를 돌면서
    하나의 파이어볼만 있는 좌표는 fireballs 리스트에 그대로 넣어준다.
    2개 이상의 파이어볼이 있는 좌표는 문제에 따라 총질량, 총속력 등을 구해 생성될 파이어볼들의 질량과 속력을 구한다. 이때 총질량//5 == 0 이 된다면, continue를 통해 다음 파이어볼 정보에 저장될 일이 없도록 만든다.
    0, 2, 4, 6 방향 및 1, 3, 5, 7 방향을 결정하기 위해 odd라는 하나의 변수를 만들어주고 각 파이어볼들의 방향이 홀수라면 odd + 1을 해준다. 만일 odd가 0이거나(모두 짝수) odd가 파이어볼 개수와 같다(모두 홀수)면 0, 2, 4, 6 방향의 파이어볼을 생성하고 아닐 경우 1, 3, 5, 7 방향의 파이어볼을 생성한다.
  4. 남아있는 파이어볼들의 총 질량을 구하기 위해 fireballs를 순회하며 m값을 모두 더해준다.
N, M, K = map(int, input().split())	# N*N좌표, M개의 파이어볼, K번의 명령
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)}
arr = [[[] for _ in range(N)] for _ in range(N)]	# 3차원 배열
fireballs = []	# 파이어볼들의 정보를 저장할 리스트
for _ in range(M):	# M개의 파이어볼
    r, c, m, s, d = map(int, input().split())
    fireballs.append([r-1, c-1, m, s, d])
    
for _ in range(K):	# K번의 명령
    arr = [[[] for _ in range(N)] for _ in range(N)]
    while fireballs:	# 모든 파이어볼의 정보
        r, c, m, s, d = fireballs.pop()
        nr = (r + s*directions[d][0])%N	# 파이어볼의 다음 r좌표
        nc = (c + s*directions[d][1])%N	# 파이어볼의 다음 c좌표
        arr[nr][nc].append([m, s, d])	# 좌표에 추가

	# 모든 좌표를 돌며 파이어볼의 유무 체크
    for i in range(N):
        for j in range(N):
            if not arr[i][j]: continue	# 파이어볼이 없다면 continue
            if len(arr[i][j]) == 1:	# 파이어볼이 1개라면 그대로 저장
                fireballs.append([i, j, arr[i][j][0][0], arr[i][j][0][1], arr[i][j][0][2]])
            elif len(arr[i][j]) > 1:	# 파이어볼이 2개 이상이라면
                total_m, total_s = 0, 0	# 총 질량, 총 속력
                odd = 0	# 새로운 파이어볼들의 방향 정하기 위함
                for m, s, d in arr[i][j]:
                    total_m += m
                    total_s += s
                    if d % 2 == 1: odd += 1
                final_m = total_m // 5
                if final_m == 0:	# 파이어볼의 질량이 0이 된다면 삭제되므로 continue
                    continue
                final_s = total_s // len(arr[i][j])
                if odd == 0 or odd == len(arr[i][j]):	# 방향이 모두 홀수거나 짝수이면
                    for k in range(0, 7, 2):
                        fireballs.append([i, j, final_m, final_s, k])
                else:
                    for k in range(1, 8, 2):	# 그 외의 경우
                        fireballs.append([i, j, final_m, final_s, k])

answer = 0
for _, _, m, _, _ in fireballs:
    answer += m
print(answer)

예제 3의 결과 도출 과정

이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90