백준 :: 달팽이 <1913번>

혜 콩·2022년 7월 11일
0

알고리즘

목록 보기
34/61

> 문제 <

https://www.acmicpc.net/problem/1913

> 풀이 <

내림차순으로 (N^2 ~ 1) 숫자 리스트를 생성해주고(nums), 들어갈 배열 순서를 (x, y) 좌표값 형태로 result 리스트에 저장해주었다.
정가운데 좌표에서부터 시계 반대 순서로 돌아가며 숫자를 채워주는 형식이다.
하지만 본인은 큰 둘레(겉 정사각형)부분부터 돌아가며 숫자를 넣어주는 형태로 코드를 짰다.

위의 순서로 배열 위치 = 해당 숫자가 들어갈 수 있도록
nums = [9, 8, 7, 6, 5, 4, 3, 2]         #1은 따로 지정했으므로 뺌
result = [ (0,0), (1,0), (2,0), (2,1), (2,2), (1,2), (0,2), (0,1), (1,1) ]

enumerate를 이용해서 result의 index --> nums[index]
순서대로 for문을 돌려 거꾸로 배열에 맞는 숫자를 삽입해준다.


> 코드 <

N = int(input())
find_num = int(input())

deep = N // 2

snail = [[0]*N for _ in range(N)]
nums = [x for x in range(N**2, 0, -1)]
snail[N//2][N//2] = 1                        # 정가운데 좌표값은 무조건 1

result = []

for k in range(deep):
    for i in range(k, N-k):
        result.append((i, k))
    for i in range(k+1, N-k):
        result.append((N-k-1, i))
    for i in range(N-k-2, k-1, -1):
        result.append((i, N-k-1))
    for i in range(N-k-2, k, -1):
        result.append((k, i))


for x, y in enumerate(result):
    snail[y[0]][y[1]] = nums[x]
    if nums[x] == find_num:
        find_xy = (y[0]+1, y[1]+1)

if find_num == 1:   find_xy = (N//2+1, N//2+1)

for x in snail:
    print(*x, sep=' ')
print(*find_xy)





> 다른 풀이 <

# someone's code

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)
profile
배우고 싶은게 많은 개발자📚

0개의 댓글