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๊ฐ ์๋์ด์๋ ํธ์ด๋ผ ์ด๊ฒ ํ์คํ ๋์ํธ์ธ๊ฒ๊ฐ๋ค