역시 rust에 익숙해지고자 백준 구현 문제를 풀어봤습니다.
실버4 치고는 생각보다 꽤 까다로운 문제였습니다.
문제 링크
https://www.acmicpc.net/problem/12933
풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
use std::io::{self};
use std::process;
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
let mut visited = vec![0; input.len()];
let mut cnt = 0;
let mut is_true = false;
let mut answer = 0;
while cnt < input.len()-1 {
is_true = check(&mut input, &mut visited, &mut cnt);
// 중간에 틀리면 즉시 프로그램 종료
if !is_true {
println!("{}", -1);
process::exit(0);
} else {
answer += 1;
}
}
println!("{}", answer);
}
fn check(input: &mut String, visited: &mut Vec<i32>, cnt: &mut usize) -> bool {
// q, u, a, c, k 순서대로 찾아야하므로 순서에 맞게 바뀜
let target_list = ['q', 'u', 'a', 'c', 'k'];
let mut target_idx: usize = 0;
let mut idx = 0;
// cnt가 바뀌지 않았어도 false를 return해야하므로
let prev_cnt: usize = *cnt;
for ch in input.chars() {
// rust 특성상 마지막에 줄바꿈 들어감
if ch == '\n' {
idx += 1;
continue;
}
// 이미 방문햇으면 넘어감
if visited[idx] == 1 {
idx += 1;
continue;
}
if ch == target_list[target_idx] {
visited[idx] = 1;
target_idx = (target_idx+1) % 5;
// cnt는 for문이 끝나면 5의 배수여야 한다. (quack이 5글자니까)
*cnt += 1;
}
idx += 1;
}
if *cnt % 5 != 0 {
return false;
}
// cnt가 바뀌지 않은 경우
if *cnt == prev_cnt {
return false;
}
return true;
}
|
cs |
'알고리즘' 카테고리의 다른 글
백준 17413번 Rust 풀이 (0) | 2021.10.11 |
---|---|
백준 14467번 Rust 풀이 (0) | 2021.10.10 |
백준 1913번 달팽이 Rust 풀이 (0) | 2021.10.10 |
카카오 인턴십 표 편집 (Python) (0) | 2021.08.21 |
백준 사회망 서비스(Python/Go) (0) | 2021.04.15 |