[Baekjoon/๋ฐฑ์ค][1913][C/C++] ๋ฌํฝ์ด
ใ๋ชฉ์ฐจใ
0. ๊ฐ์
1. ๋ฌธ์
2. ํ์ด
3. ์ฝ๋
0. ๊ฐ์
2์ฐจ์ ๋ฐฐ์ด ๋ฌธ์ ์ค์ ๊ฐ์ฅ ํ์ด๋ณด๊ณ ์ถ์๋ ๋ฌธ์ . ์ฒ์ ์ฝ๋ฉ ๋ฐฐ์ธ ๋ ์ด ๋ฌธ์ ๋ฅผ ๋ดค์๋๋ฐ, ๊ทธ๋ ๋ชป ํ์ด๋ณด๊ณ ์ด์ ์ผ ์๊ฐ๋์ ํ์ด๋ณธ๋ค.
1. ๋ฌธ์
https://www.acmicpc.net/problem/1913
[๋ฌธ์ ]
ํ์์ธ ์์ฐ์ N์ด ์ฃผ์ด์ง๋ฉด, ๋ค์๊ณผ ๊ฐ์ด 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(3 ≤ N ≤ 999)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ์์น๋ฅผ ์ฐพ๊ณ ์ ํ๋ N2 ์ดํ์ ์์ฐ์๊ฐ ํ๋ ์ฃผ์ด์ง๋ค.
[์ถ๋ ฅ]
N๊ฐ์ ์ค์ ๊ฑธ์ณ ํ๋ฅผ ์ถ๋ ฅํ๋ค. ๊ฐ ์ค์ N๊ฐ์ ์์ฐ์๋ฅผ ํ ์นธ์ฉ ๋์ด์ ์ถ๋ ฅํ๋ฉด ๋๋ฉฐ, ์๋ฆฟ์๋ฅผ ๋ง์ถ ํ์๊ฐ ์๋ค. N+1๋ฒ์งธ ์ค์๋ ์ ๋ ฅ๋ฐ์ ์์ฐ์์ ์ขํ๋ฅผ ๋ํ๋ด๋ ๋ ์ ์๋ฅผ ํ ์นธ ๋์ด์ ์ถ๋ ฅํ๋ค.
[์์ ์ ๋ ฅ 1]
7
35
[์์ ์ถ๋ ฅ 1]
49 26 27 28 29 30 31
48 25 10 11 12 13 32
47 24 9 2 3 14 33
46 23 8 1 4 15 34
45 22 7 6 5 16 35
44 21 20 19 18 17 36
43 42 41 40 39 38 37
5 7
2. ํ์ด
์ฝ๋ ์์๋๋ก ํ์ด๋ฅผ ํด๋ณด๊ฒ ๋ค.
[n, key๊ฐ ์ ๋ ฅ ๋ฐ์]
N์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์์ฐ์.
key๋ ์์น๋ฅผ ์ฐพ๊ณ ์ ํ๋ ์์ฐ์.
[2์ฐจ์ ๋์ ๋ฐฐ์ด ํ ๋น]
C์์๋ 2์ฐจ์ ๋์ ๋ฐฐ์ด ํ ๋น์ ์ํด ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ๋ค. ๊ธฐ๋ณธ ํํ๋ ์๋ ์ฝ๋์์ ๋ํ๋๋ ๊ฒ๊ณผ ๊ฐ๋ค.
(์ฌ๊ธฐ์ ์ฝ๊ฐ์ ๋ณํ์ ๊ฑฐ์น๋ฉด, ๋์ ํ ๋น์ ํด์ ํ๊ธฐ ์ข ๋ ํธ๋ฆฌํ๊ฒ ๋ง๋ค ์๋ ์๋ค. ํ๋จ ๋งํฌ ์ฐธ์กฐ.)
[๋ฌํฝ์ด ์ฑ์ ๋ฃ๊ธฐ]
์ค๋ ์ฝ๋ฉ์ ํต์ฌ ๋ถ๋ถ.
๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ด๊ธฐํ ํ ๊ฐ๋ถํฐ ์ดํด๋ณด์. ์ฒ์ ๋ฐฐ์ด ์ธ๋ฑ์ค์ ์์์ ์ ๋ฐฐ์ด์ ์ค์ฌ์ด๋ฏ๋ก, ์ธ๋ก๊ฐ์ ํด๋นํ๋ col๊ณผ, ๊ฐ๋ก๊ฐ์ ํด๋นํ๋ row์, ๊ฐ๊ฐ N/2๊ฐ์ ๋์ ํ๋ค. num๊ฐ์ ๋ฐฐ์ด ์์ ์ ๋ ฅ๋ ์ซ์์ด๋ค. (1, 2, 3, ... $N^2$๊น์ง ์ฆ๊ฐํ๋ค.)
๋ฌํฝ์ด์ ์๋ฆฌ๋ฅผ ์ดํด๋ณด๋ฉด, 'โ ๋ฐฐ์ด์ ๊ฐ์ ์ ๋ ฅํ๋ค. -> โก๋ฐฐ์ด ์ธ๋ฑ์ค ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค.' ์ด 2๊ฐ์ง ํ์์ ๋ฐ๋ณต์ด๋ค. 'โ ๋ฐฐ์ด์ ๊ฐ์ ์ ๋ ฅํ๋ค.' ๋ถ๋ถ์ ๋ณ๋ก ์ด๋ ค์ธ ๊ฒ ์์ง๋ง, 'โก๋ฐฐ์ด ์ธ๋ฑ์ค ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค.' ํํธ๊ฐ ๋จธ๋ฆฌ ์ํ๋ค. ์ธ๋ฑ์ค ์์น๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ 'โก-โด์,์ค๋ฅธ์ชฝ,์๋,์ผ์ชฝ ๋ฐฉํฅ ์ค ํ๋๋ก โก-โต1์นธ, 2์นธ, 3์นธ, ... ์ค ์ํฉ์ ๋ง๊ฒ ํด๋น ์นธ์๋ฅผ ์ด๋ํ๋ค.' ๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
U=Up, R=Right, D=Down, L=Left๋ผ ํ์. ๋ฌํฝ์ด์ ์ด๋ ๋ฐฉํฅ ์๋ฆฌ๋ฅผ ์ดํด๋ณด๋ฉด, U - R - D - D - L - L - U - U - U - R - R - R - D - D -D -D - ... ํด์ U๊ฐ 1๋ฒ, R์ด 1๋ฒ, D๊ฐ 2๋ฒ, L์ด 2๋ฒ, U๊ฐ 3๋ฒ, R์ด 3๋ฒ, D๊ฐ 4๋ฒ, ... ์์๋๋ก ์งํ๋จ์ ์ ์ ์๋ค. ∴ URDL ์์๋๋ก U1๋ฒ, R1๋ฒ, D2๋ฒ, L2๋ฒ, U3๋ฒ, R3๋ฒ, D4๋ฒ, L4๋ฒ, ... ์ฉ ์ด๋ํ๊ฒ ์ค๊ณํ๋ฉด ๋๋ค. (๊ฐ์ ์ซ์๋ฅผ 2๋ฒ ๋ฐ๋ณตํ๊ธฐ ์ํด์, 2๋ฒ์งธ for๋ฌธ์ (URDL + 1) / 2 ๋ฅผ ์ด์ฉํ๋ค.)
์ดํ ํ๋จ์ for๋ฌธ 2๊ฐ๋ฅผ ์ ๋ง๋ฌผ๋ฆฌ๊ฒ ์ค๊ณํด ์ฃผ๋ฉด, ์ ์๋๋๋ค. (์ฌ์ค ์ด ๋ถ๋ถ์ ๋ง๋ก ์์ธํ ์ค๋ช ํ๊ธฐ๊ฐ ์ด๋ ต๋ค...ใ )
[์ถ๋ ฅ_๋ฌํฝ์ด] & [์ถ๋ ฅ_Key์ ์์น]
๋ฌธ์ ์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๊ฐ์ ์ถ๋ ฅํ๋ ๊ณผ์ ์ด๋ค.
[๋ง๋ฌด๋ฆฌ]
๋์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ผ๋ฏ๋ก, ๋ง์ง๋ง์๋ ๋ฐ๋์ ๋์ ํ ๋น์ ํด์ ํด์ฃผ์ด์ผ ํ๋ค.
3. ์ฝ๋
#pragma warning (disable:4996)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
/* N, key๊ฐ ์
๋ ฅ ๋ฐ์ */
int N; scanf("%d", &N);
int key; scanf("%d", &key);
/* 2์ฐจ์ ๋์ ๋ฐฐ์ด ํ ๋น */
int** arr = (int**)calloc(N, sizeof(int*));
for (int i = 0; i < N; i++)
arr[i] = (int*)calloc(N, sizeof(int));
/* ๋ฌํฝ์ด ์ฑ์๋ฃ๊ธฐ */
int col = N / 2;
int row = N / 2;
int num = 1;
for (int URDL = 1; num <= N * N; URDL++) { //URDL์ Up Right Down Left๋ฅผ ์๋ฏธ
for (int i = 1; i <= (URDL + 1) / 2; i++) {
/* part1. ์ฐ๊ธฐ */
arr[col][row] = num++;
/* part2. ์์น */
/* UP */
if (URDL % 4 == 1)
col--;
/* RIGHT */
else if (URDL % 4 == 2)
row++;
/* DOWN */
else if (URDL % 4 == 3)
col++;
/* LEFT */
else if (URDL % 4 == 0)
row--;
}
}
/* ์ถ๋ ฅ_๋ฌํฝ์ด */
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
/* ์ถ๋ ฅ_key๊ฐ ์์น */
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
if (key == arr[i][j])
printf("%d %d", i + 1, j + 1);
/* ๋ง๋ฌด๋ฆฌ */
for (int i = 0; i < N; i++)
free(arr[i]);
free(arr);
return 0;
}