삼성 SW 역량 테스트 기출 문제
[Python](시뮬) 백준 20056번 : 마법사 상어와 파이어볼
Algomalgo
2024. 3. 11. 20:24
728x90

<접근 방법>
- 파이어볼의 정보를 담을 리스트 fireballs를 만들고 각각의 파이어볼 정보를 fireballs에 저장하고 파이어볼들을 arr에 위치시킨다.
- fireballs에 담겨있는 파이어볼의 정보를 pop으로 하나씩 꺼내 다음 좌표를 구한다. 이때 좌표의 양끝, 즉 위와 아래, 오른쪽과 왼쪽이 이어지는 좌표 특성이 있음에 유의한다. 따라서 파이어볼의 위치를 N으로 나눠준다.
(모든 fireballs의 다음 좌표를 구하고 나면, fireballs는 빈 리스트 상태가 된다.) - 모든 좌표를 돌면서
하나의 파이어볼만 있는 좌표는 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 방향의 파이어볼을 생성한다. - 남아있는 파이어볼들의 총 질량을 구하기 위해 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)


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