Coding/알고리즘
[알고리즘 TIL] Q1074(백트래킹)
kangplay
2025. 5. 5. 17:28
문제
https://www.acmicpc.net/problem/1074

트러블 슈팅
1. 완전탐색 구현
처음에는 완전 탐색+재귀 함수로 구현하려고 했다. 하지만, 다음 재귀함수에 어떤 값을 넘겨야할지 매우 헷갈렸다. Z 탐색은 (row, col)이 좌측 위 꼭짓점이고, 각 사분면마다 차이가 한 변의 길이/2만큼 난다. 따라서 n은 한 변의 길이여야 한다.
private static void backtracking(int row, int col, int size) throws IOException{
if(size==1) {
count++;
if(row==r && col==c) {
finishSystem();
}
return;
}
backtracking(row,col,size/2);
backtracking(row,col+size/2,size/2);
backtracking(row+size/2,col,size/2);
backtracking(row+size/2,col+size/2,size/2);
}
2. 백트래킹 구현
완전 탐색으로는 시간 초과가 났다. 이 문제는 (r,c) 좌표가 어떤 사분면에 있는지 파악해서, 해당 재귀만 돌도록 해야한다.
private static void backtracking(int row, int col, int size) {
if (size == 1) return;
int half = size / 2;
if (r < row + half && c < col + half) {
// 1사분면
backtracking(row, col, half);
} else if (r < row + half && c >= col + half) {
// 2사분면
count += half * half;
backtracking(row, col + half, half);
} else if (r >= row + half && c < col + half) {
// 3사분면
count += 2 * half * half;
backtracking(row + half, col, half);
} else {
// 4사분면
count += 3 * half * half;
backtracking(row + half, col + half, half);
}
}
구현
import java.io.*;
public class Main {
static int N;
static int r;
static int c;
static int count = 0;
static BufferedWriter bw;
static BufferedReader br;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] inputStrArr = br.readLine().split(" ");
N = Integer.parseInt(inputStrArr[0]);
r = Integer.parseInt(inputStrArr[1]);
c = Integer.parseInt(inputStrArr[2]);
backtracking(0,0, (int) Math.pow(2, N));
bw.write(count+" ");
bw.flush();
bw.close();
br.close();
}
private static void backtracking(int row, int col, int size) {
if (size == 1) return;
int half = size / 2;
if (r < row + half && c < col + half) {
// 1사분면
backtracking(row, col, half);
} else if (r < row + half && c >= col + half) {
// 2사분면
count += half * half;
backtracking(row, col + half, half);
} else if (r >= row + half && c < col + half) {
// 3사분면
count += 2 * half * half;
backtracking(row + half, col, half);
} else {
// 4사분면
count += 3 * half * half;
backtracking(row + half, col + half, half);
}
}
}