백준 2588) 곱셈

성욱김·2022년 5월 19일
0
use std::io;


fn main() {
    let mut str_input_a = String::new();
    let mut str_input_b = String::new();

    io::stdin().read_line(&mut str_input_a).unwrap();
    io::stdin().read_line(&mut str_input_b).unwrap();

    let some_a:String = str_input_a.split_whitespace().collect();
    let some_b:String = str_input_b.split_whitespace().collect();
   

    let number_a:i32 = some_a.parse().unwrap();
    let number_b_one = some_b.chars().nth(2).unwrap();
    let n_one = number_b_one as i32 - 0x30;
    let number_b_ten = some_b.chars().nth(1).unwrap();
    let n_ten = number_b_ten as i32 - 0x30;
    let number_b_hund = some_b.chars().nth(0).unwrap();
    let n_hund = number_b_hund as i32 - 0x30;

    let mut number_vec = Vec::new();
    number_vec.push(n_one);
    number_vec.push(n_ten);
    number_vec.push(n_hund);
    let mut result_vec = Vec::new();
    for (index,i) in number_vec.iter().enumerate(){
        println!("{}",number_a*i );
        result_vec.push(number_a*i);
    }

    println!("{} " , result_vec[0]+result_vec[1]*10+result_vec[2]*100);

}

상당히 문제가 많아 보이는 코드다. 다른 언어였다면 쉽게 풀었을것 같지만 개선할 수 있는지 한번 살펴보자.

let mut str_input_a = String::new();
let mut str_input_b = String::new();

io::stdin().read_line(&mut str_input_a).unwrap();
io::stdin().read_line(&mut str_input_b).unwrap();

let some_a:String = str_input_a.split_whitespace().collect();
let some_b:String = str_input_b.split_whitespace().collect();

이 부분은 입력을 문자열로 받기 위해 만들어준 부분이다.

str_input_a 와 str_input_b에 '472' , '385' 라는 문자열을 받은 후에 다시 some_a , some_b 라는 변수에 다시 넣어줬는데

이렇게 하지 않으면 '\r\n'이 생존해서 int형변환이 안된다.

	let number_a:i32 = some_a.parse().unwrap();
    let number_b_one = some_b.chars().nth(2).unwrap();
    let n_one = number_b_one as i32 - 0x30;
    let number_b_ten = some_b.chars().nth(1).unwrap();
    let n_ten = number_b_ten as i32 - 0x30;
    let number_b_hund = some_b.chars().nth(0).unwrap();
    let n_hund = number_b_hund as i32 - 0x30;

각각의 자리수를 얻기 위해서 .chars().nth()함수를 사용했다.
some_b라는 string에 index로 접근해서 하나씩 숫자로 바꿔준 것이다.

여기까지만 보더라도 , 처음부터 숫자로 입력을 받았다면 상당히 많은 양을 줄일 수 있는 것을 알 수 있다.

    let mut str_input_a = String::new();
    let mut str_input_b = String::new();

    io::stdin().read_line(&mut str_input_a).unwrap();
    io::stdin().read_line(&mut str_input_b).unwrap();

    let number_a:i32 = str_input_a.trim().parse().unwrap();
    let number_b:i32 = str_input_a.trim().parse().unwrap();

    let number_b_one = str_input_b.chars().nth(2).unwrap();
    let n_one = number_b_one as i32 - 0x30;
    let number_b_ten = str_input_b.chars().nth(1).unwrap();
    let n_ten = number_b_ten as i32 - 0x30;
    let number_b_hund = str_input_b.chars().nth(0).unwrap();
    let n_hund = number_b_hund as i32 - 0x30;

    let mut number_vec = Vec::new();
    number_vec.push(n_one);
    number_vec.push(n_ten);
    number_vec.push(n_hund);
    let mut result_vec = Vec::new();
    for (index,i) in number_vec.iter().enumerate(){
        println!("{}",number_a*i );
        result_vec.push(number_a*i);
    }

    println!("{} " , result_vec[0]+result_vec[1]*10+result_vec[2]*100);

}

하지만 숫자를 직접 받는 방법은 존재하지 않아서 지저분한 코드만 정리했다.

    let number_b_one = str_input_b.chars().nth(2).unwrap();
    let n_one = number_b_one as i32 - 0x30;
    let number_b_ten = str_input_b.chars().nth(1).unwrap();
    let n_ten = number_b_ten as i32 - 0x30;
    let number_b_hund = str_input_b.chars().nth(0).unwrap();
    let n_hund = number_b_hund as i32 - 0x30;

그 다음으로 살펴볼 부분은 각자리수를 얻기위해 string에 index로 접근해서 숫자를 얻은 곳이다.

    let n_one: i32 = number_b % 10;
    let n_ten: i32 = (number_b % 100 - n_one) / 10;
    let n_hund: i32 = (number_b - n_ten * 10 - n_one) /100;

인덱스에 굳이 접근해야 하는 상황이 아니라면 위처럼 코딩하는것이 직관적이다.

use std::io;


fn main() {
    let mut str_input_a = String::new();
    let mut str_input_b = String::new();

    io::stdin().read_line(&mut str_input_a).unwrap();
    io::stdin().read_line(&mut str_input_b).unwrap();

    let number_a:i32 = str_input_a.trim().parse().unwrap();
    let number_b:i32 = str_input_b.trim().parse().unwrap();

    let n_one = number_b % 10;
    let n_ten: i32 = (number_b % 100 - n_one) / 10;
    let n_hund: i32 = (number_b - n_ten * 10 - n_one) /100;

    let mut number_vec = Vec::new();
    number_vec.push(n_one);
    number_vec.push(n_ten);
    number_vec.push(n_hund);

    for i in number_vec.iter(){
        println!("{}",number_a*i );
    }

    println!("{} " , number_a*number_b);

}

수정을 완료한 코드는 다음과 같다.

0개의 댓글