본문 바로가기
구름톤 챌린지

[구름톤 챌린지] 2주차_ 9~ 10일차 학습

by 깁갑수 2023. 8. 27.
목차

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)

 

"갑수야 반갑수"에는 쿠팡파트너스 등 제휴링크가 포함 되어 있으며 수수료를 제공받을 수 있습니다.