본문 바로가기

알고리즘

[Rust] 백준 2630번 색종이 만들기

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로 쓰는 것이 더 깔끔해보인다

남들 코드가 너무 어려워서 아직 봐도 뭐가 깔끔한 코드인지 잘 모르겠다....