코딩테스트/BOJ

[백준][구현] 1913. 달팽이

박소민 2023. 4. 19. 09:48
1913. 달팽이
 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

 

  • 내 풀이
    • dx, dy생성해서 벽이나 값이 있을 경우 방향 전환
    • n*n에서 시작해서 -1 
n=int(input())
k=int(input())
graph=[[0 for _ in range(n)] for _ in range(n)]
cnt=n*n
dx=[1,0,-1,0]
dy=[0,1,0,-1]
x,y=-1,0
i=0
resultX=0
resultY=0
while cnt>0:
    nx=x+dx[i]
    ny=y+dy[i]
    if nx<0 or nx>=n or ny<0 or ny>=n or graph[nx][ny]!=0:
        i=(i+1)%4
        nx = x + dx[i]
        ny = y + dy[i]

    x=nx
    y=ny
    graph[x][y] = cnt
    if cnt==k:
        resultX=x+1
        resultY=y+1
    cnt-=1

for i in range(n):
    for j in range(n):
        print(graph[i][j], end=" ")
    print()

print(resultX, resultY)

 

  • 다른 사람 풀이
    • r, c=n//2 로 설정해서 1로 시작
      • r-1, c-1로 대각선 방향으로 옮긴 뒤에 4방향을 돌려가면서 길이 2,4,6,8.. 동안 출력
    • 2차원 배열 출력 시 for문 행만 돌면서 *board[i] 로 출력
import sys

input = sys.stdin.readline
n = int(input())
m = int(input())
board = [[0 for _ in range(n)] for _ in range(n)]

dr = [0, 1, 0, -1] # 오른쪽, 아래쪽, 왼쪽, 위쪽 순서
dc = [1, 0, -1, 0]

r = n//2  # 시작 row
c = n//2  # 시작 column
num = 1  # 해당 위치에 들어갈 숫자 1씩 증가 예정
len = 0  # 특정 방향으로 이동할 길이 얼마나 더할 것인가. for 문으로 동일 작업 수행 가능.

board[r][c] = num

while True:
    for i in range(4):
        for _ in range(len):  # 특정 방향으로 한칸씩 이동하며 숫자 입력
            r+=dr[i]
            c+=dc[i]
            num+=1
            board[r][c]=num
            if num==m:  # 찾을 번호의 인덱스 저장
                ans = [r+1, c+1]

    if r==c==0:
        break
    r -= 1
    c -= 1
    len += 2

for i in range(n):
    print(*board[i])
print(*ans)