본문 바로가기

끄적끄적

[끄적끄적] Rust로 PS 후기

 

Rust로 PS 후기 😣

 
원래는 자바, C++로 PS를 했었는데, 요즘 핫한 Rust에 익숙해질 겸, Rust로 PS를 시작했다.
이 글을 쓰는 시점에서 4-5문제 정도 푼 거 같은데.. 후기를 쓰기에는 좀 이르나 어쨌든 적어보려고 한다.
 
Rust로 푼 문제
https://dlwnsdud205.tistory.com/347

[백준 / BOJ] 14575 뒤풀이 (Rust)

문제 출처 : https://www.acmicpc.net/problem/14575 14575번: 뒤풀이 첫째 줄에 대회 참가자의 수 N과 술의 총량 T가 주어진다. (1 ≤ N ≤ 1000, 1 ≤ T ≤ 109) 둘째 줄부터 N개의 줄에 걸쳐, 각 사람에 대한 Li와 Ri

dlwnsdud205.tistory.com

 
장점
1. 생각보다 빠른 코딩 속도...!
PS를 할때, 중요한것 중 하나가 문제를 풀고 코드로 옮기는 코딩 속도라 생각하는데.. Rust에 익숙치 않음에도 불구하고 Java로 풀때랑 비슷한 속도가 나온다. (아마 익숙해지면 더 빨리지지 않을까..?)
 
2. 사용자 편의 함수
아래 코드는 버퍼로 부터 한 줄을 입력받고, 공백을 기준으로 끊은다음 string을 i64형으로 변환해, Vector에 넣는 코드다. 

let split: Vec<_> = input.split_whitespace().filter_map(|s| i64::from_str(s).ok()).collect();

내가 작성해야하는 코드는 거의 없고, 그저 선언적으로 작성하기만 하면 된다.
Rust에는 이런 편의 함수가 많은것 같다. 예를 들어, match와 같은..?
 
불편했던 점
(아직 잘 몰라서 불편한 것일 수도 있음)
불편한 점은 하나로 소유권으로 발생하는 문제들 이다.
Rust에서 가변 정적 변수를 사용하면 PS시 전역 변수 느낌을 흉내낼수는 있는데.. 그러면 값 변경시마다 unsafe문을 달아줘야 한다. 하지만, 이 방법은 불편하고, 이쁘지 않다. 따라서, 가변 정적 변수를 사용하기 보다는.. 주솟값을 전달하는 방식(Rust에서는 빌림 방식)으로 코드를 짜고 있는데, 이러면 다음과 같은 문제가 발생한다.
 
성공하는 코드 - 4가 출력된다.

fn main() {
    let mut s = &mut 3;
    is_call_able(s);
    print!("{}", s);
}

fn is_call_able(first: &mut i32){
    let a = first;
    *a += 1;
}

 
만약, 이렇게 바꾼다면?

fn main() {
    let mut s = &mut 3;
    is_call_able(s);
    print!("{}", s);
}

fn is_call_able(first: &mut i32){
    let a = first;
    let b = first;
    *a += *b;
}

실패한다. 
Rust 공식문서에 따르면, 한 스코프 내에서 가변참조자 &mut data 는 하나만 생성이 가능하다고 한다.

결론
Rust.. 장점은 분명히 있지만, PS를 하며 신경 써야 할 부수적인 것들이 많아서, 실전에서 써먹기는 아직 부담되는것 같다.
(자바로 처음 PS를 할때도 이런 생각을 갖고 있었으니 미래에 익숙해 진다면 Rust를 쓸수도..?)
 
Rust로 PS는 계속할 생각이다. 하지만.. 어디까지나 공부의 목적이고, 실전에서는 (빠른)c++ 혹은 (익숙한)Java로 풀 거 같다.