Day9 폭탄 구현하기 (2) - 구름LEVEL (goorm.io)
내 풀이 과정
땅 크기를 입력받은 뒤 '#' 영역이 영향을 받지 않는 상태라는걸 이요하여 폭탄의 영향을 받을 수 있는 테두리까지를 땅으로 생성해 두고
피폭량을 계산하기 위해 폭탄의 영향력을 계산하기 위한 영역은 별도로 생성 했다. 생성할땐 포문을 사용하지 않고 numpy로 생성해줬다.
이후 땅의 상태를 입력받아 기존에 있던 땅의 상태를 업데이트 해 주고 땅의 상태를 이용해 폭탄값을 계산하여 출력해줬다.
# -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
import numpy as np
N, K = map(int, input().split())
field = np.full((N+2, N+2),'#')
bomb = np.zeros((N+2, N+2))
for x in range(1,N+1):
field[x] = list(('# '+input()+' #').split())
Kyx = [list(map(int, input().split())) for _ in range(K) ]
max_bomb = 0
for y, x in Kyx:
for dy in [-1, 1]:
if field[y+dy][x] =='0' : bomb[y+dy][x] +=1
if field[y+dy][x] =='@' : bomb[y+dy][x] +=2
if bomb[y+dy][x] > max_bomb : max_bomb = bomb[y+dy][x]
for dx in [-1, 1]:
if field[y][x+dx] =='0' :bomb[y][x+dx] +=1
if field[y][x+dx] =='@' :bomb[y][x+dx] +=2
if bomb[y][x+dx] > max_bomb : max_bomb = bomb[y][x+dx]
if field[y][x] =='0' :bomb[y][x] +=1
if field[y][x] =='@' :bomb[y][x] +=2
if bomb[y][x] > max_bomb : max_bomb = bomb[y][x]
print(int(max_bomb))
정해 코드
폭탄의 영향을 주는 범위 조합을 dy, dx 로 먼저 초기화 해 준뒤에 폭탄값 계산을 해주는게 훨씬 깔끔해 보인다.
N, K = map(int, input().split())
arr = [list(input().split()) for _ in range(N)]
score = [[0] * N for _ in range(N)]
dy = [0, 1, -1, 0, 0]
dx = [0, 0, 0, 1, -1]
for _ in range(K):
y, x = map(int, input().split())
y -= 1
x -= 1
for k in range(5):
ny = y + dy[k]
nx = x + dx[k]
if ny < 0 or ny >= N or nx < 0 or nx >= N or arr[ny][nx] == "#":
continue
if arr[ny][nx] == "@":
score[ny][nx] += 2
else:
score[ny][nx] += 1
result = 0
for i in range(N):
for j in range(N):
result = max(result, score[i][j])
print(result)
Day10 GameJam - 구름LEVEL (goorm.io)
내 풀이 과정
문제를 읽고나서 쉽게생각했지만 한참을 고민했다.
먼저 입력받은 R, C 를 바로 활용하기 위해 입력받은 수에서 1을뺀 수를 사용할 수 있도록 함수를 만들고 map으로 받아줬다.
numpy를 이용해 자취를 남기기 위한 영역을 선언해 주고 실제 입력받은 게임판을 참고하여 이동하는 칸 유무를 확인하기 위해 1로 초기화 해주었다. 지나가기 전 도착지가 1이되어 있는경우는 이미 지나간 칸임을 인식하여 이동을 멈추고 현재까지 이동한 칸을 점수로 계산한다.
플레이어와 구름이를 각각 실행해야 하기에 이 부분을 함수로 만들어 주었다.
상 하 좌 우 이동 방향을 좀더 간략하게 표현하기위해 이동방향을 사전으로 선언하여 작성 해 두고 이동방향을 참고하도록 했다.
# -*- coding: utf-8 -*-
# UTF-8 encoding when using korean
import numpy as np
def input2int_and_minus1(a):
return int(a)-1
def cal(Rg, Cg, N) :
trace = np.zeros((N,N), dtype=int)
count = -1
command = -1
score, noteg = 1, True
while noteg:
trace[Rg][Cg] = 1
dr, dc = direction[board[Rg][Cg][command]]
cc = int(board[Rg][Cg][:count])+1
for c in range(1,cc):
if Rg+c*dr >=N or Cg+c*dc >=N or Rg+c*dr <0 or Cg+c*dc <0: c -=N
if trace[Rg+c*dr][Cg+c*dc] == 1 :
noteg = False
break
else :
trace[Rg+c*dr][Cg+c*dc] = 1
score +=1
Rg, Cg = Rg+c*dr, Cg+c*dc
return score
N = int(input())
Rg, Cg = map(input2int_and_minus1, input().split())
Rp, Cp = map(input2int_and_minus1, input().split())
board = np.array([list(input().split()) for _ in range(N)])
direction = {"L" : [0, -1], "R" : [0, 1], "U" : [-1, 0], "D" : [1, 0]}
goorm = cal(Rg, Cg, N)
player = cal(Rp, Cp, N)
if goorm > player : print('goorm',goorm)
else : print('player',player)
정해 코드
비슷하게 작성되었지만 범위를 벗어나는경우를 나머지를 통해 구현했다. 재능인가 ? 너무 똑똑한것 같다 이렇게 또한명의포기자를 만드는것인가.
def play(sy, sx, N):
y, x = sy, sx
visited = [[0] * N for _ in range(N)]
visited[y][x] = 1
notEnd = True
while notEnd:
cnt = count[y][x]
dy, dx = command[y][x]
for _ in range(cnt):
y = (y + dy) % N
x = (x + dx) % N
if visited[y][x]:
notEnd = False
break
visited[y][x] = 1
return sum([sum(i) for i in visited])
N = int(input())
Rg, Cg = map(int, input().split())
Rp, Cp = map(int, input().split())
Rg -= 1
Cg -= 1
Rp -= 1
Cp -= 1
arr = [list(input().split()) for _ in range(N)]
count = [[0] * N for _ in range(N)]
command = [[None] * N for _ in range(N)]
direction = {"L" : [0, -1], "R" : [0, 1], "U" : [-1, 0], "D" : [1, 0]}
for i in range(N):
for j in range(N):
temp = arr[i][j]
count[i][j] = int(temp[:-1])
key = temp[-1]
command[i][j] = direction[key]
scoreG = play(Rg, Cg, N)
scoreP = play(Rp, Cp, N)
if scoreG > scoreP:
print("goorm", scoreG)
else:
print("player", scoreP)