use std::io;
fn recursive (vec: &Vec<Vec<i32>>, white: &mut i32, blue: &mut i32, r :i32, c :i32, length: i32) {
let start = vec.get(r as usize).unwrap().get(c as usize).unwrap();
for i in r..r+length {
for j in c..c+length {
if vec.get(i as usize).unwrap().get(j as usize).unwrap() != start {
recursive (vec,white,blue,r,c,length/2);
recursive (vec,white,blue,r,c + length/2,length/2);
recursive (vec,white,blue,r + length/2,c,length/2);
recursive (vec,white,blue,r + length/2,c + length/2,length/2);
return;
}
}
}
if *start == 0 {
*white = *white + 1;
}
else {
*blue = *blue + 1;
}
}
fn main() {
let mut s = String::new();
io::stdin().read_line(&mut s).unwrap();
let N: usize = s.trim().parse::<usize>().expect("Invalid input");
let mut vec = vec![vec![0 as i32; N]; N];
for i in 0..N {
let mut s = String::new();
io::stdin().read_line(&mut s).unwrap();
vec[i] = s.as_mut_str()
.split_whitespace()
.map(|s| s.parse().unwrap())
.collect();
}
let mut white = 0;
let mut blue = 0;
recursive(&vec, &mut white, &mut blue, 0, 0, N as i32);
println!("{}\n{}", white, blue);
}
비록 실버긴 하지만 러스트로 처음으로 알고리즘다운 알고리즘 문제를 풀어봤다
재귀적으로 타고 들어가면서 색종이가 더 잘리는지 잘리지 않는지 확인하는 문제
c로 짰으면 전역변수를 썼을 것 같은데 전역 변수가 안되서 mutable한 변수를 넘겨줬다
나중에 다른 사람들 풀이를 찾아보니 인자로 포인터처럼 넘겨주는 것 보다는 return을 pair로 쓰는 것이 더 깔끔해보인다
남들 코드가 너무 어려워서 아직 봐도 뭐가 깔끔한 코드인지 잘 모르겠다....
'알고리즘' 카테고리의 다른 글
[Rust] 백준 2754번 학점계산 (0) | 2023.02.11 |
---|---|
[Rust] 백준 2744 대소문자 바꾸기 (0) | 2023.02.05 |
[Rust] 백준 10807번 개수 세기 (1) | 2023.01.20 |
[C++] 별자리 만들기 (0) | 2021.10.29 |
[C++] 백준 23288 삼성기출 주사위 굴리기 2 (0) | 2021.10.26 |