본문 바로가기

RUST

[ 백준 | RUST ] 2480 :: 주사위 세개

728x90
문제 : 1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다. 

같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다. 
같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다. 
모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.  
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

이 문제는 판별을 해야 하기 때문에 for 문을 사용을 해야 한다.
 

use std::io;

fn main() {
    let mut arr = String::new();
    io::stdin()
        .read_line(&mut arr)
        .expect("입력을 읽을 수 없습니다.");
    let arr: Vec<u32> = arr
        .trim()
        .split_whitespace()
        .map(|x| x.parse().expect("잘못된 입력입니다."))
        .collect();

    let max_value = arr.iter().max();

    let mut c = 0;
    let mut s = 0;
    let mut n = 0;

    for i in 0..arr.len() {
        for j in (i + 1)..arr.len() {
            if arr[i] == arr[j] {
                c += 1;
                n = arr[j];
            }
        }
    }

    if c == 3 {
        s = 10000 + (arr[0] * 1000);
        println!("{}", s);
    } else if c == 1 {
        s = 1000 + (n * 100);
        println!("{}", s);
    } else if c == 0 {
        match max_value {
            Some(&max) => println!("{}", max * 100),
            None => println!("빈 배열입니다."),
        }
    }
}

    let max_value = arr.iter(). max(); 이 문장에서 arr에 주사위 숫자를 받은 것을. iter() <- 배열을 순화하며 호출하는 메서드이고,. max()는 각각의 요소에 접근하면서 최댓값을 찾게 해주는 메서드이다. 그러므로 가장 큰 값을 max_value에 넣어준다.
 
 
for i in 0.. arr.len() 반복문은 0을 i에 대입한다고 생각하면 된다... arr.len()은 arr배열의 길이까지 반복한다고 생각하면 된다.
arr.len() = 3이라면 0,1,2  3번 반복한다고 생각하면 된다. (끝 값 -1)
 
 
그다음 똑같은 숫자가 있는지 c(count)에 따라 if문을 작성하면 된다. 
마지막 c == 0에서 match라는 표현식을 볼 수 있는데 이 것은 밑에 조건을 달아서 조건이 참일 때 => 코드를 실행할 수 있다.
굳이 match를 사용해야 되냐고 생각을 할 수 있는데 iter()을 사용하면 [1,2,3] 이렇게 백터 값으로 변환이 되고. max() 메서드를 추가하면 
Some(3)으로 옵션값 Option <&u32>으로 바꾸어지는 것을 확인할 수 있다. match를 사용하면 잘 못된 값에 대하여 반환을 설정할 수 있다. 
무엇인지 잘 모르겠다 하면

//변경 전
else if c == 0 {
        match max_value {
            Some(&max) => println!("{}", max * 100),
            None => println!("빈 배열입니다."),
        }
//변경 후        
else if c == 0 {
    println!("{}", max_value.unwrap() * 100)
    }

Option 또는 Result와 같은 결과 타입에서 값을 추출하는 메서드 unwrap()을 사용해서 바꾸어서 사용하면 된다.