본문 바로가기

코딩/Rust

[Rust] 백준 10250 ACM 호텔

use std::io;
use std::io::stdin;
use std::io::Read;

fn main() {
    let mut n = String::new();
    stdin().read_line(&mut n).unwrap();
    let n: usize = n.trim().parse().expect("Fail");
    let mut input = String::new(); //입력 받는 부분 아님
    io::stdin().read_to_string(&mut input).unwrap();
    let mut inp = input.split_ascii_whitespace().map(str::parse).flatten(); 
    for _ in 0..n {
        let h: i32 = inp.next().unwrap();
        let w: i32 = inp.next().unwrap();
        let k: i32 = inp.next().unwrap();
        let mut floor: i32 = k%h;
        let mut num: i32 = (k/h)+1 ;
        if floor==0 {
            floor=h;
        }
        print!("{}",floor);
        if k%h==0 {
            num=num-1;
        }
        if num<10 {
            print!("{}",0);
        }
        print!("{}",num);
        print!("\n");
    }
}

 

문제는 정말 쉬운 브론즈3 문제지만, 코드가 제법 길다.

 

let n은 불변인 변수 n을 선언하는 키워드이고, let mut n은 가변 변수 n을 선언하는 키워드이다.

 

let mut n = String::new(); 부분은 변수를 선언만 하는 것이고, 입력은 stdin이나 io::stdin을 통해서 받는다.

(내 코드의 경우에는 한 줄만 읽을 때 stdin을, 읽지 않은 나머지를 다 읽을 때 io::stdin을 사용했다. 이거 말고도 다른 방법이 있는 지는 잘 모르겠다.)

 

숫자 자료형이 i32이기도 하고 usize이기도 한 이유는, 문자열을 숫자로 변환할 때 usize를 사용할 수 없는 TryInto라는 명령어를 써야 하는(정확하게는, 써야 한다고 생각하는) 경우가 있기 때문이다. (여기서는 상관없다)

 

 

입력 방식은 다른 블로그를 참고했는데, input.split_ascii_whitespace() 는 말 그대로 입력을 받아 공백을 기준으로 나눠서 저장하는 키워드이다. (flatten은 문자열을 숫자로 바꿔주는 부분이 아닌데, 이 경우는 Rust가 자체적으로 타입을 추론해서 i32가 되는 거 같다.)

 

 

이렇게 inp 변수에 공백과 줄바꿈과 함께 입력받은 여러 숫자들을 모두 저장하고,  변수 이름.next().unwrap(); 으로 원소를 하나씩 뽑아서 쓴다. 

 

원래는 println!("{}",num); 을 주로 사용하지만, 이러면 개행문자도 출력되어 버리기 때문에 대신 print!를 사용했다.