https://www.acmicpc.net/problem/1074
โ๏ธ ๋ฌธ์
๐ ๋ฌธ์ ํด๊ฒฐ
์ฃผ์! ์ด ๋ฌธ์ ๋ ํ๋ ํ๋ ํ์ํ์ฌ DFS๋ฅผ ์๋ํ๋ฉด ์๊ฐ์ด๊ณผ๋์ด ํต๊ณผํ ์ ์๊ฒ ๋๋ค.
์๋๋ ์๊ฐ ์ด๊ณผ ๋ฐ์ ํ์ด..ใ
์๊ฐ ์ด๊ณผ ๋ฐ์ ํ์ด์ด๋ค.
import java.util.*;
import java.io.*;
public class Main {
static int N, r, c;
static int count;
static int[][] arr;
static int[] dx, dy;
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
// ๋ณ์ ์ด๊ธฐํ ์์
count = 0;
/**
* dx[], dy[] ์ ์ญํ ๊ฐ์ฅ ์์ 2X2 ๋ฐฐ์ด์ ๋ฐฉ๋ฌธ์ ์ํด
* - ์๋ฅผ๋ค์ด, 2X2 ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
* (0,0) -> (0,1) -> (1,0) -> (1,1)
*/
dx = new int[]{0, 0, 1, 1};
dy = new int[]{0, 1, 0, 1};
// ์
๋ ฅ
int n = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
N = (int) Math.pow(2, n);
// arr = new int[N][N];
// ๊ธธ์ด๊ฐ N์ด๊ณ ์์์ ์ ์ขํ x, y๋ฅผ ๋ฃ์ด์ ์ฌ๊ท ํธ์ถ ์์!
recur(N, 0, 0);
}
static void recur(int len, int x, int y) {
// ์ข
๋ฃ ์กฐ๊ฑด : ๊ฐ์ฅ ์์ ๊ธธ์ด 2X2 ๋ฐฐ์ด์ด ๋์์ ๋!
if (len == 2) {
// ์ด์ ์ ๋ง๋ค์ด๋ dx[], dy[] ๋ฐฐ์ด์ ์ด์ฉํด์ ๋ฐฉ๋ฌธํ์ ๊ธฐ๋ก!
for (int i = 0; i < 4; i++) {
int nX = x + dx[i];
int nY = y + dy[i];
count++;
if(nX == r && nY == c){
System.out.println(count - 1);
System.exit(0);
}
}
return;
}
// ๊ธธ์ด๊ฐ 4๊ฐ ๋๋๋ค๋ฉด, ๊ณ์ ๋ถํ ํ๋๋ก ํ๋ค.
if (len >= 4) {
/**
* ์๋ ์ฌ๊ท ํธ์ถ์ ๋ํด ์ค๋ช
* - 4X4 ๋ฐฐ์ด์ 4๊ฐ์ 2X2 ๋ฐฐ์ด์ ์์์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
* - (0,0) -> (0,2) -> (2,0) -> (2,2)
* - ex) x + len/2 ๋๋ y + len/2
*/
recur(len / 2, x, y);
recur(len / 2, x, y + len / 2);
recur(len / 2, x + len / 2, y);
recur(len / 2, x + len / 2, y + len / 2);
}
}
}
์ผ์ ํ ํจํด์ด ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์ rํ c์ด์ด ์ด๋ ์ฌ๋ถ๋ฉด์ ์์นํ๊ณ ๋ช๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฐฉ๋ฒ์ผ๋ก ํ์ด๋ฅผ ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
์ผ๋จ, ์ด ๋ฌธ์ ๋ ๊ฐ์ฅ ์์ ๋จ์๊ฐ 2X2 ๋ฐฐ์ด์ด๋ค.
์๋ 4X4 ๋ฐฐ์ด์ ์ดํด ๋ณด์
4X4 ๋ฐฐ์ด์ ๋ณด๋ฉด, ๊ฐ์ฅ ์์ ๋จ์์ธ 2X2 ๋ฐฐ์ด์ด ์ด 4๊ฐ๊ฐ ์ฐ์๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๊ฐ 2X2 ๋ฐฐ์ด์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- (0 , 0)
- (0 , 2)
- (2 , 0)
- (2 , 2)
ํ์ฌ ๊ธธ์ด๊ฐ N์ด๊ณ ์์ ์ธ๋ฑ์ค๊ฐ (x , y) ๋ผ๊ณ ํ ๋, ์์ ์ธ๋ฑ์ค๋ฅผ ์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
(x , y)
(x , y + N/2)
(x + N/2 , y)
(x + N/2 , y + N/2)
์ผ์ ํ ํจํด์ด ๋ณด์ด๊ณ ์๋ค.
์ด ์์ ์์น๋ฅผ ์ด์ฉํด์ ํด๋น rํ c์ด์ด ์ด๋ ์ฌ๋ถ๋ฉด์ ์์นํ๋์ง ๋ฒ์๋ฅผ ๊ณ์ํด์ ์ขํ๋๊ฐ๋ฉด์ ์ฐพ์๋ด๋ฉด ๋๋ค!
์๋ฅผ ๋ค์ด, 4X4 ๋ฐฐ์ด์์ (1 , 2) ๊ฐ ์ด๋ ์ฌ๋ถ๋ฉด์ ์๋์ง ํจ๊ป ์ฐพ์๋ณด๋๋ก ํด๋ณด์.
์ฐ๋ฆฌ๊ฐ (2 , 1)์ ์ฐพ๋ ๋ค๋ฉด? ์๋์ ๋ฐฉ๋ฒ์ผ๋ก ์ฐพ์ ์ ์๋ค.
- ์์์ ์ ์ผ์ชฝ ์ ๊ผญ์ง์ (x , y) ๊ณ ๊ธธ์ด๊ฐ len์ผ ๋, ๊ฐ ์ฌ๋ถ๋ฉด์ ์ผ์ชฝ ์ ๊ผญ์ง์ ๊ณผ ์ค๋ฅธ์ชฝ ์๋ ๊ผญ์ง์ ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
- ์ด๋ ์ฌ๋ถ๋ฉด์ธ์ง ์ฐพ์๋ค๋ฉด len์ด 2๊ฐ ๋ ๋๊น์ง ํด๋น ์์ ์ ๋ฐ๋ณตํ๋ฉด ๋๋ค.
int[] dx = {0, 0, 1, 1};
int[] dy = {0, 1, 0, 1};
// ์์์ ์ด (x , y) ๋ผ๊ณ ํ ๋! ๊ฐ ์ฌ๋ถ๋ฉด์ ์์์ ๊ณผ, ๋์ ์ ์๋์ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
for (int i = 0; i < 4; i++) {
int nX1 = x + len / 2 * dx[i];
int nX2 = x + len / 2 * (dx[i] + 1) - 1;
int nY1 = y + len / 2 * dy[i];
int nY2 = y + len / 2 * (dy[i] + 1) - 1;
// ํด๋น ์ฌ๋ถ๋ฉด ๋ฒ์์ ๋ค์ด์จ๋ค๋ฉด? -> ํ์ฌ i๊ฐ r,c๊ฐ ์ํ ์ฌ๋ถ๋ฉด์ด๋ค!
if (r >= nX1 && r <= nX2 && c >= nY1 && c <= nY2) {
count = count + (len / 2 * len / 2 * i); // *๋ฐฉ๋ฌธ ํ์๋ฅผ ์นด์ดํธ!
recur(len/2, nX1, nY1); // ํด๋น ์ฌ๋ถ๋ฉด์ ๊ธธ์ด๋ฅผ ๋ฐ์ผ๋ก ๋๋ ์ ๋ค์ ํ์!
}
}
์ ์ฝ๋์์ count = count + ( len / 2 * len / 2 * i); ๋ผ๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด, ๊ฐ ์ฌ๋ถ๋ฉด์ ๋ฐฉ๋ฌธํ์๋ ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ํ๋ผ ์ ์๋ค.
์ข ๋ฃ ์กฐ๊ฑด์ ๊ธธ์ด๊ฐ 2๊ฐ ๋ ๋ ์ข ๋ฃ์ํค๋ฉด ๋๋ค.
- ํด๋น ์ฌ๋ถ๋ฉด์์ Z ๋ฐฉํฅ์ผ๋ก ํ์
- count 1์ฉ ์ฆ๊ฐ์ํจ๋ค.
- ํ๊ณผ ์ด์ด r, c์ ๊ฐ์์ง๋ ์์ ์์ count๋ฅผ ์ถ๋ ฅ์ํค๋ฉด ๋!
static void recur(int len, int x, int y) {
// ์ข
๋ฃ ์กฐ๊ฑด : ๊ฐ์ฅ ์์ ๊ธธ์ด 2X2 ๋ฐฐ์ด์ด ๋์์ ๋!
if (len == 2) {
// ์ด์ ์ ๋ง๋ค์ด๋ dx[], dy[] ๋ฐฐ์ด์ ์ด์ฉํด์ ๋ฐฉ๋ฌธํ์ ๊ธฐ๋ก!
for (int i = 0; i < 4; i++) {
int nX = x + dx[i];
int nY = y + dy[i];
count++;
if (nX == r && nY == c) {
System.out.print(count - 1); // ์ ๋ต์ 1์ ๋นผ์ฃผ๋๋ก ํ๋ค.
System.exit(0);
}
}
return;
}
...
}
๐ฅ ์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static int N, r, c;
static int count;
static int[][] arr;
static int[] dx, dy;
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
// ๋ณ์ ์ด๊ธฐํ ์์
/**
* dx[], dy[] ์ ์ญํ ๊ฐ์ฅ ์์ 2X2 ๋ฐฐ์ด์ ๋ฐฉ๋ฌธ์ ์ํด
* - ์๋ฅผ๋ค์ด, 2X2 ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
* (0,0) -> (0,1) -> (1,0) -> (1,1)
*/
dx = new int[]{0, 0, 1, 1};
dy = new int[]{0, 1, 0, 1};
// ์
๋ ฅ
int n = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
N = (int) Math.pow(2, n);
// arr = new int[N][N];
// ๊ธธ์ด๊ฐ N์ด๊ณ ์์์ ์ ์ขํ x, y๋ฅผ ๋ฃ์ด์ ์ฌ๊ท ํธ์ถ ์์!
recur(N, 0, 0);
}
static void recur(int len, int x, int y) {
// ์ข
๋ฃ ์กฐ๊ฑด : ๊ฐ์ฅ ์์ ๊ธธ์ด 2X2 ๋ฐฐ์ด์ด ๋์์ ๋!
if (len == 2) {
// System.out.println(x + " , " + y);
// ์ด์ ์ ๋ง๋ค์ด๋ dx[], dy[] ๋ฐฐ์ด์ ์ด์ฉํด์ ๋ฐฉ๋ฌธํ์ ๊ธฐ๋ก!
for (int i = 0; i < 4; i++) {
int nX = x + dx[i];
int nY = y + dy[i];
count++;
if (nX == r && nY == c) {
System.out.print(count - 1);
System.exit(0);
}
}
return;
}
for (int i = 0; i < 4; i++) {
int nX1 = x + len / 2 * dx[i];
int nX2 = x + len / 2 * (dx[i] + 1) - 1;
int nY1 = y + len / 2 * dy[i];
int nY2 = y + len / 2 * (dy[i] + 1) - 1;
if (r >= nX1 && r <= nX2 && c >= nY1 && c <= nY2) {
// System.out.println(nX1 + ", " + nY1);
count = count + (len / 2 * len / 2 * i);
// System.out.println("count : " + count);
recur(len/2, nX1, nY1);
}
}
}
}