[ baekjoon ] 1913. 달팽이

애이용·2021년 1월 12일
0

BOJ

목록 보기
17/58
post-thumbnail
post-custom-banner

문제

홀수인 자연수 N(3≤N≤999)이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N*N의 표에 늘어놓을 수 있다.

9 2 3
8 1 4
7 6 5

25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17

N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.

입력

첫째 줄에 홀수인 자연수 N이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.

출력

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

n = int(input())
num = int(input())

# 1의 좌표
x = y = n // 2 
# 2차원 리스트 선언
array = [[0 for col in range(n)] for row in range(n)]
# 상하좌우
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def check_range(x, y): # 배열 범위 체크
  if x >= n or y >= n or x < 0 or y < 0:
    return False
  return True

idx = 0 # 상하좌우 인덱스
for i in range(1, n * n + 1):
  array[x][y] = i
  for _ in range(4):
    if idx == 4: 
      idx = 0
    if check_range(x + dx[idx], y + dy[idx]): # 배열 범위일 때
      if array[x + dx[idx]][y + dy[idx]] == 0: # 0이면 방문하지 않았을 때를 뜻함
        x += dx[idx]
        y += dy[idx]
        idx += 1 
        break
      else: # 이미 방문했다면 idx 를 반대로 
        idx -= 1
        continue
    else: # 배열 범위를 벗어나면
      idx += 1 # 다음 상하좌우 인덱스로
      continue
      
result_x = 0
result_y = 0
for i in range(n):
  for j in range(n):
    if array[i][j] == num: # 입력한 목표값이면 저장
      result_x = i
      result_y = j
    print(array[i][j], end = ' ')
  print()

print(result_x + 1, result_y + 1)

ps. 한방에 통과 ㅎㅎ
2차원 리스트 선언하는 것만 검색했다
아무리 해봐도 익숙해지지 않아ㅠㅠ
array = [[0 for col in range(n)] for row in range(n)] !!!

profile
로그를 남기자 〰️
post-custom-banner

0개의 댓글