Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- 알기쉬운 알고리즘
- 이것이 자바다
- R
- 혼자 공부하는 C언어
- list 컬렉션
- datastructure
- s
- 메모리구조
- Serialization
- Algorithm
- Graph
- Stack
- JSON
- 윤성우 열혈자료구조
- stream
- insertion sort
- 이스케이프 문자
- Selection Sorting
- coding test
- C programming
- buffer
- 윤성우의 열혈 자료구조
- C 언어 코딩 도장
Archives
- Today
- Total
Engineering Note
[BOJ:1913] 달팽이 본문
Link : https://www.acmicpc.net/problem/1913
Note
숫자 입력 방식에서 규칙이 없을지 직접해보면서 방향 전환에서 규칙을 발견했다.
N이 3일 경우 1:(상, 우) 2:(하,하 좌,좌, 상,상)
N이 5일 경우 1:(상, 우) 2:(하,하, 좌,좌) 3:(상,상,상, 우,우,우) 4:(하,하,하,하, 좌,좌,좌,좌, 상,상,상,상)
N이 7일 경우 1:(상. 우) 2:(하,하, 좌,좌) 3:(상,상,상, 우,우,우) 4(하,하,하,하, 좌,좌,좌,좌) 5:(상,상,상,상,상, 우,우,우,우,우) 6:(하,하,하,하,하,하, 좌,좌,좌,좌,좌,좌, 상,상,상,상,상,상,상) 으로 변화한다.
i가 1부터 N-2 까지는 증가할 때 방향회전 방식은 다음과 같다. 상,우,하,좌가 둘 씩 짝지어서 각 방향을 i번 만큼 진행하고 양의방향으로 90도만큼 방향을 회전해서 다시 i번 진행한다. 그리고 다음 방향에서는 직전 방향에서 90도만큼 회전한 방향으로 i+1만큼 진행하고 다시 90도 회전하고 다시 i+1만큼 진행한다. i가 N-2까지는 각 i 번째에서 한 번만 방향회전을 하지만 N-1이 됐을 때는 두 번의 방향 회전을 한다.
그림으로 표현하면 아래와 같다.


여기서 주의할 점이 있다. 방향회전전에 테이블의 위치에 값을 넣고 이동을 하는데 이 규칙 대로라면 제일 마지막 위치 (0,0)은 도착만하고 값을 대입하지 않기 때문에 방향을 다 돌고 난 이후에 따로 값을 넣어 주어야한다.
정리하면 (값입력), (행,열 이동) 방향 전환을 반복문을 이용해서 적절히 코드를 구현하는 되는 문제였다.
Code
import sys
n = int(input())
find_num = int(input())
table = [[0]*n for _ in range(n)]
dir_row = [-1,0,1,0]
dir_col = [0,1,0,-1]
whar_dir = 0
move_cnt = 1
cur_row = n//2
cur_col = cur_row
cur_num = 1
while cur_num < n**2:
for move_cnt in range(1,n):
if move_cnt == n-1:
for _ in range(3):
for _ in range(move_cnt):
table[cur_row][cur_col] = cur_num
if cur_num == find_num:
answer = (cur_row,cur_col)
cur_num += 1
cur_row += dir_row[whar_dir]
cur_col += dir_col[whar_dir]
whar_dir = (whar_dir+1)%4
else:
table[cur_row][cur_col] = cur_num
if cur_num == find_num:
answer = (cur_row,cur_col)
else:
for _ in range(2):
for _ in range(move_cnt):
table[cur_row][cur_col] = cur_num
if cur_num == find_num:
answer = (cur_row,cur_col)
cur_num += 1
cur_row += dir_row[whar_dir]
cur_col += dir_col[whar_dir]
whar_dir = (whar_dir+1)%4
move_cnt += 1
for row in table:
print(*row)
print(answer[0]+1,end=" ")
print(answer[1]+1)
'Problem Solving > BOJ' 카테고리의 다른 글
| [BOJ:1010] 다리놓기 (0) | 2022.05.13 |
|---|---|
| [BOJ:1018] 체스판 다시 칠하기 (0) | 2022.05.13 |
| [BOJ:1444] 별찍기 - 7 (0) | 2022.05.10 |
| [BOJ:1748] 수 이어 쓰기1 (0) | 2022.05.09 |
| [BOJ:1316] 그룹 단어 체커 (0) | 2022.05.09 |
Comments
