Solution

Memo

  • ๋ฌธ์ œ ์ž์ฒด๋Š” ๋ธŒ๋ฃจํŠธํฌ์Šค์˜ ๋А๋‚Œ์ด ๋‚ฌ๊ณ  ๊ตฌํ˜„๋งŒ ์‹ ๊ฒฝ์“ฐ๋ฉด ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.
  • O((N-7) * (M-7) * 128), n,m ์ƒํ•œ์ด 50์ด๋‹ค
// Baekjoon - 1018
// https://www.acmicpc.net/problem/1018

use std::{
    cmp::min,
    io::{self, Read, Write},
};

fn main() {
    let mut stdin = io::stdin().lock();
    let mut stdout = io::stdout().lock();
    let mut input = String::new();
    stdin.read_to_string(&mut input).unwrap();
    let mut lines = input.lines();

    let mut iter = lines.next().unwrap().split_whitespace();
    let m: usize = iter.next().unwrap().parse().unwrap();
    let n: usize = iter.next().unwrap().parse().unwrap();

    let board: Vec<Vec<char>> = lines.take(m).map(|line| line.chars().collect()).collect();

    let mut min_repaints = 8 * 8;

    for start_row in 0..=m - 8 {
        for start_col in 0..=n - 8 {
            let start_white = count_repaints(&board, start_row, start_col, 'W');
            let start_black = count_repaints(&board, start_row, start_col, 'B');

            min_repaints = min(min_repaints, min(start_white, start_black));
        }
    }

    write!(stdout, "{}", min_repaints).unwrap();
}

fn count_repaints(
    board: &[Vec<char>],
    start_row: usize,
    start_col: usize,
    start_color: char,
) -> usize {
    let mut count = 0;
    let other_color = if start_color == 'W' { 'B' } else { 'W' };

    for i in 0..8 {
        for j in 0..8 {
            let expected_color = if (i + j) % 2 == 0 {
                start_color
            } else {
                other_color
            };
            if board[start_row + i][start_col + j] != expected_color {
                count += 1;
            }
        }
    }
    count
}

ํด๋ฆฌํ”ผ ๋ฆฐํŠธ์—์„œ ์•Œ๊ฒŒ๋œ๊ฒƒ :

  • ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ &Vec<T> ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฐํŠธ ์žกํžŒ๋‹ค.
  • ์ด๊ฑด ๋ฒกํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ๋ฐ,
  • Rust์—์„œ๋Š” ์ด๋ณด๋‹ค ๋” ์ผ๋ฐ˜์ ์ธ &[T] ์Šฌ๋ผ์ด์Šค ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.
  • &Vec<T>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ๊ฐ„์ ‘ ์ฐธ์กฐ ๋ ˆ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ.
  • Vec<T>๋Š” ์ด๋ฏธ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ฒด์ธ๋ฐ,
  • ์—ฌ๊ธฐ์— ๋‹ค์‹œ ์ฐธ์กฐ(&)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฌ์ธํ„ฐ์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋˜์–ด ์„ฑ๋Šฅ์ƒ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ ์Šฌ๋ผ์ด์Šค(&[T])๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜์˜ ์œ ์—ฐ์„ฑ์ด ๋†’์•„์ง„๋‹ค.
  • ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋“œ์‹œ Vec๋งŒ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š๊ณ ,
  • ์Šฌ๋ผ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ์ปฌ๋ ‰์…˜ ํƒ€์ž…(์˜ˆ: ๋ฐฐ์—ด, Vec, VecDeque ๋“ฑ)๋„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
// Vec<T>์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜
fn sum_vec(numbers: &Vec<i32>) -> i32 {
    numbers.iter().sum()
}

// ์Šฌ๋ผ์ด์Šค &[T]๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜
fn sum_slice(numbers: &[i32]) -> i32 {
    numbers.iter().sum()
}

fn main() {
    // Vec ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ
    let vec_numbers = vec![1, 2, 3, 4, 5];
    
    // ๋ฐฐ์—ด ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ
    let array_numbers = [6, 7, 8, 9, 10];
    
    // VecDeque ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ
    use std::collections::VecDeque;
    let mut deque_numbers = VecDeque::new();
    deque_numbers.push_back(11);
    deque_numbers.push_back(12);
    
    // Vec ์ฐธ์กฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ - Vec๋งŒ ์ง์ ‘ ์ „๋‹ฌ ๊ฐ€๋Šฅ
    println!("Vec ํ•ฉ๊ณ„: {}", sum_vec(&vec_numbers));
    
    // ๋‹ค์Œ ํ˜ธ์ถœ์€ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ
    // println!("๋ฐฐ์—ด ํ•ฉ๊ณ„: {}", sum_vec(&array_numbers));
    // println!("Deque ํ•ฉ๊ณ„: {}", sum_vec(&deque_numbers));
    
    // ์Šฌ๋ผ์ด์Šค ํ•จ์ˆ˜ ํ˜ธ์ถœ - ๋‹ค์–‘ํ•œ ์ปฌ๋ ‰์…˜ ํƒ€์ž… ์ „๋‹ฌ ๊ฐ€๋Šฅ
    println!("Vec ์Šฌ๋ผ์ด์Šค ํ•ฉ๊ณ„: {}", sum_slice(&vec_numbers));
    println!("๋ฐฐ์—ด ์Šฌ๋ผ์ด์Šค ํ•ฉ๊ณ„: {}", sum_slice(&array_numbers));
    println!("Deque ์Šฌ๋ผ์ด์Šค ํ•ฉ๊ณ„: {}", sum_slice(&deque_numbers.make_contiguous()));
    
    // Vec์˜ ์ผ๋ถ€๋ถ„๋งŒ ์ „๋‹ฌ๋„ ๊ฐ€๋Šฅ
    println!("Vec ๋ถ€๋ถ„ ํ•ฉ๊ณ„: {}", sum_slice(&vec_numbers[1..4]));
}
  • ์ด๋Ÿฌ๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€๊ฐ€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋กœ ๋„ˆ์ €๋ถ„ํ•ด์งˆ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, iter๊ฐ€ ์ž˜๋˜์–ด์žˆ๋Š” ํŽธ์ด๋ผ ์ด๊ฒŒ ํ™•์‹คํžˆ ๋‚˜์€ํŽธ์ธ๊ฒƒ๊ฐ™๋‹ค