[BOJ] 1799 λΉμ
λ¬Έμ
λ¬Έμ μ€λͺ
Baekjoon Online Judge - 1799λ² λΉμ
μμ μ₯κΈ°μΈ μ²΄μ€μλ λκ°μ λ°©ν₯μΌλ‘ μμ§μΌ μ μλ λΉμ(bishop)μ΄ μλ€. < κ·Έλ¦Ό 1 >κ³Ό κ°μ μ μ¬κ°ν 체μ€ν μμ BλΌκ³ νμλ κ³³μ λΉμμ΄ μμ λ λΉμμ λκ°μ λ°©ν₯μΌλ‘ μμ§μ¬ Oλ‘ νμλ μΉΈμ μλ λ€λ₯Έ λ§μ μ‘μ μ μλ€.
κ·Έλ°λ° 체μ€ν μμλ λΉμμ΄ λμΌ μ μλ κ³³μ΄ μλ€. < κ·Έλ¦Ό 2 >μμ 체μ€νμ μμΉ λ λΆλΆμ λΉμμ΄ λμΌ μ μλ€κ³ νμ. μ΄μ κ°μ 체μ€νμ μλ‘κ° μλ‘λ₯Ό μ‘μ μ μλλ‘ νλ©΄μ λΉμμ λλλ€λ©΄ < κ·Έλ¦Ό 3 >κ³Ό κ°μ΄ μ΅λ 7κ°μ λΉμμ λμ μ μλ€. μμΉ λ λΆλΆμλ λΉμμ΄ λμΌ μ μμ§λ§ μ§λκ° μλ μλ€.
μ μ¬κ°ν 체μ€νμ ν λ³μ λμΈ μΉΈμ κ°μλ₯Ό 체μ€νμ ν¬κΈ°λΌκ³ νλ€. 체μ€νμ ν¬κΈ°μ 체μ€ν κ° μΉΈμ λΉμμ λμ μ μλμ§ μλμ§μ λν μ λ³΄κ° μ£Όμ΄μ§ λ, μλ‘κ° μλ‘λ₯Ό μ‘μ μ μλ μμΉμ λμ μ μλ λΉμμ μ΅λ κ°μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ 체μ€νμ ν¬κΈ°κ° μ£Όμ΄μ§λ€. 체μ€νμ ν¬κΈ°λ 10μ΄νμ μμ°μμ΄λ€. λμ§Έ μ€λΆν° μλμ μμ κ°μ΄ 체μ€νμ κ° μΉΈμ λΉμμ λμ μ μλμ§ μλμ§μ λν μ λ³΄κ° μ²΄μ€ν ν μ€ λ¨μλ‘ ν μ€μ© μ£Όμ΄μ§λ€. λΉμμ λμ μ μλ κ³³μλ 1, λΉμμ λμ μ μλ κ³³μλ 0μ΄ λΉμΉΈμ μ¬μ΄μ λκ³ μ£Όμ΄μ§λ€.
μΆλ ₯
첫째 μ€μ μ£Όμ΄μ§ 체μ€ν μμ λμ μ μλ λΉμμ μ΅λ κ°μλ₯Ό μΆλ ₯νλ€.
νμ΄
ν΄μ€
λ°±νΈλνΉμ μ°μ΅νκΈ°μ μ’μ λ¬Έμ , μ리λ₯Ό μ΄ν΄νκΈ° λ§€μ° μ΄λ €μ λ λ¬Έμ .
- 체μ€νμ ν, λ°±μΌλ‘ λλμ΄ κ°κ° 2λ²μ 체ν¬ν΄μ€λ€.
-
ν, λ°± κ° κ²½μ°μ λν΄μλ νμ¬ μ’νκ° μν λκ°μ μ΄ μ μ λμΌλ©΄(μ’, μ° μ€ νλλΌλ) μΉ΄μ΄νΈ λ³μλ₯Ό μ¦κ°νμ§ μκ³ μ¬κ·νκ³ , μ μ λμ§ μμμΌλ©΄ μΉ΄μ΄νΈ λ³μλ₯Ό μ¦κ°νμ¬ μ¬κ·λ₯Ό νμ΄λ€.
- λκ°μ μ μ μ¬λΆλ μ’, μ° λκ°μ μ κΈ°μ€μ μ keyλ‘ νκ³ , μ μ μ¬λΆλ₯Ό valueλ‘ νλ 맡μΌλ‘ κ΄λ¦¬.
- λκ°μ κΈ°μ€μ μ νμ¬ μ’νμ λκ°μ μ’ν κ°μ μ°¨μ΄κ° (N-1)κ³Ό (N+1)μμμ μ°©μν¨.
- μ’λ‘ ν₯νλ λκ°μ () κΈ°μ€μ μ νμ¬ μ’νμμ (N+1)λ§νΌμ μ΅λλ‘ μ°¨κ°ν μ μΈλ°, νμ’ν * (N+1)λ§νΌμ λΊ μ μΌλ‘ μ€μ ν¨.
- λ§μ°¬κ°μ§λ‘ μ°λ‘ ν₯νλ λκ°μ (/) κΈ°μ€μ μ νμ¬ μ’νμμ (N-1)λ§νΌμ μ΅λλ‘ μ°¨κ°ν μ μΈλ°, νμ’ν * (N-1)λ§νΌμ λΊ μ μΌλ‘ μ€μ ν¨.
- μ¬κ·λ₯Ό ν λλ μ΄μ΄ κ²½κ³λ₯Ό λμ΄κ° κ²½μ° νμ μ¦κ°μν¨λ€.
- κΈ°μ μ‘°κ±΄μΈ ν κ²½κ³μ λλ¬νλ©΄ ν, λ°± μ¬λΆμ λ°λΌ μΉ΄μ΄νΈ λ³μλ₯Ό μ΅λκ°μΌλ‘ κ°±μ νλ€.
μνμ°©μ€
- μ²μμ 그리λμ²λΌ λͺ¨λ μ’νμ λν΄ λκ°μ μ μμΉν λΉμμ μν₯μ μ£Όλ κ°μλ₯Ό μΈ κ·Έ μκ° μ μ μ’νλ₯Ό μ°μ μ μΌλ‘ ν¬ν¨νλ λ°©μμΌλ‘ νμ΄ νλ¦Ό. κ·Έλ°λ° μ 그리λλ‘ νλ©΄ μλλμ§λ μ λͺ¨λ₯΄κ² λ€.. μλ§ κ·Έλ¦¬λλ‘ νμμ λ λ―Έμ² ν¬ν¨νμ§ λͺ»νλ μ’νκ° μμ κ² κ°λ€.
- λͺ¨λ κ°λ₯ν μ’νμ λν΄ λΉμμ²λ¦¬ νλ€, μνλ€ νλ λ°©μμΌλ‘ νμμΌλ 2^(NxN)μ μκ° λ³΅μ‘λλ‘ μΈν΄ μκ°μ΄κ³Ό λΈ.
-
νμ¬ μ’νλ₯Ό ν¬ν¨νλ λκ°μ μ΄ μ μ λμλμ§ μ¬λΆλ‘ νμλλ°λ μκ°μ΄κ³Ό.. λκ°μ + νλ°±μμΉλ‘ ν΄κ²°ν¨. μ΄ νμ΄μμλ λͺλ²μ μνμ°©μ€κ° μμλλ°β¦
- νμ¬ μ’νμ λν΄ λΉμ μ²λ¦¬λ₯Ό ν λ€ μ¬κ· νκ³ λ€μμΌλ‘ λμ΄κ° λ λ€μ (0,0) μμΉλΆν° νμνλ€λ³΄λ μ¬μ ν μκ°μ΄κ³Όκ° λ΄λ€.
- (0,0) λΆν°κ° μλλΌ νμ¬ μ’ν μ΄νλΆν° νμνμ΄μΌ νλ€.
- λ°±νΈλνΉμ΄λΌλ κ²μ΄ νμ¬ λλ¬νκΈ°κΉμ§λ λ¬Έμ κ° μμλ€λ μλ―Έμ΄κ³ , μ¬κ·λ₯Ό νκ³ λμ΄κ°μ λ λ¬Έμ κ° μκΈ°λ©΄ λ νμΈν νμκ° μμ΄ λλμκ°λ κ²μ΄κΈ°λλ¬Έμ μ²μλΆν° νμΈνλ©΄ μλλ κ²μ΄μλλ° μμ§κΉμ§ λ°±νΈλνΉ κ΅¬νμ μ΅μμΉ μμ νλ¦° κ² κ°λ€β¦
- λ°±νΈλνΉ λΆλΆμμ μ΄ κ²½κ³μ²΄ν¬ λ¨Όμ νκ³ ν κ²½κ³μ²΄ν¬λ₯Ό ν΄μΌ κΈ°μ 쑰건μ λλ¬ν μ μλλ°(μ΄ κ²½κ³μ²΄ν¬μμ μ΄μ΄ κ²½κ³λ₯Ό λμ΄κ°λ©΄ ν++ ν΄μ£Όλ―λ‘) λ°λλ‘ νλ€κ° κΈ°μ 쑰건μ λλ¬νμ§ μμ κ³μ λ΅μ΄ 0μ΄ λμμ.
μ½λ
import java.io.*;
import java.util.*;
public class BOJ_1799_λΉμ {
static int N, blackScore, whiteScore;
static int[][] map;
static Map<Integer, Boolean> left = new HashMap<Integer, Boolean>(); // μ’λ‘ ν₯νλ λκ°μ μ μ μ¬λΆ
static Map<Integer, Boolean> right = new HashMap<Integer, Boolean>(); // μ°λ‘ ν₯νλ λκ°μ μ μ μ¬λΆ
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
// μ
λ ₯
map = new int[N][N];
for (int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j=0; j<N; j++) map[i][j] = Integer.parseInt(st.nextToken());
}
// μ’, μ° λκ°μ μ μ μ¬λΆ μ΄κΈ°ν
for (int i=(-1)*(N-1); i<N; i++) left.put(i, false); // μ’λ‘ ν₯νλ λκ°μ
for (int range=N+(N-1), i=0; i<range; i++) right.put(i, false); // μ°λ‘ ν₯νλ λκ°μ
playBishop(0, 0, true, 0); // ν
playBishop(0, 1, false, 0); // λ°±
System.out.println(blackScore + whiteScore);
}
// ν, λ°± 체μ€ν κ°κ°μ λΉμ μν
private static void playBishop(int x, int y, boolean isBlack, int cnt) {
// μ΄κ²½κ³ 체ν¬
if (y >= N) {
x++; // μ΄ κ²½κ³ λμ΄κ°λ©΄ νμ μ¦κ°
y = y % 2 == 0 ? 1 : 0; // μ΄μ μ΄ μΈλ±μ€κ° μ§μμ΄λ©΄ νμλ‘, νμμ΄λ©΄ μ§μλ‘
}
// κΈ°μ 쑰건 : νκ²½κ³ μ²΄ν¬
if (x >= N) {
// μΉ΄μ΄νΈ μ΅λκ°μΌλ‘ κ°±μ
if (isBlack) blackScore = Math.max(blackScore, cnt);
else whiteScore = Math.max(whiteScore, cnt);
return;
}
// μ λννΈ : νμ¬ μ’νμ λν΄ λΉμμ μ²λ¦¬νλ€, μνλ€ νλ©° μΉ΄μ΄νΈ μΈκΈ°
int curPoint = x*N+y;
int l = curPoint - x * (N+1); // νμ¬ μ’νκ° ν¬ν¨λ λκ°μ κΈ°μ€μ (μ’)
int r = curPoint - x * (N-1); // νμ¬ μ’νκ° ν¬ν¨λ λκ°μ κΈ°μ€μ (μ°)
// κ°λ₯ν μ’νμ΄λ©° μ’, μ° λκ°μ μ΄ μ μ λμ§ μμμΌλ©΄
if (map[x][y]==1 && !left.get(l) && !right.get(r)) {
left.put(l, true); // λκ°μ μ μ νμνκ³
right.put(r, true);
playBishop(x, y+2, isBlack, cnt+1); // μΉ΄μ΄νΈ μ¦κ°νμ¬ μ¬κ·ν
left.put(l, false); // λκ°μ μ μ ν΄μ νκ³
right.put(r, false);
}
playBishop(x, y+2, isBlack, cnt); // μΉ΄μ΄νΈ μ¦κ°νμ§ μμ μ± μ¬κ·ν
}
}
π‘
- λ°±νΈλνΉ λ무 μ΄λ €μ΄ κ² κ°λ€. λ°±νΈλνΉμ΄λ κ°μ§μΉκΈ° μ°μ΅νλ λ¬Έμ λ§μ΄ νμ΄μΌκ² λ€ μ§μ§β¦