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] 로 출력
- r, c=n//2 로 설정해서 1로 시작
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)
'코딩테스트 > BOJ' 카테고리의 다른 글
| [백준] [BFS] 16954. 움직이는 미로 탈출 (0) | 2023.04.20 |
|---|---|
| [백준][구현] 17276. 배열 돌리기 (0) | 2023.04.19 |
| [백준] [BFS][위상정렬] 14567. 선수과목 (0) | 2023.04.18 |
| [백준] [BFS] [위상정렬] 2056. 작업 (0) | 2023.04.18 |
| [백준] [BFS] 9019. DSLR (0) | 2023.04.15 |