본문 바로가기

Algorithm/Implementation

(Rust) - 백준(BOJ) 25286 : 11월 11일

반응형

https://www.acmicpc.net/problem/25286

 

25286번: 11월 11일

11월 11일에는 농업인의 날, 가래떡 데이, 보행자의 날, 대한민국 해군 창설 기념일, 유엔참전용사 추모의 날, 빼빼로 데이 등 다양한 의미를 가진 날이다. 성현이는 11월 11일의 11일 전은 10월 31일,

www.acmicpc.net

구현 문제였습니다. 표준 입출력, 자료구조 선언 및 접근 split을 사용해 볼 수 있는 문제였습니다.

📕 풀이방법

📔 풀이과정

* x월 x일의 x일 전은 항상 x월의 1달 전이며 그 달의 말일 입니다. 그렇게 각 월에 해당하는 말일을 vector변수에 저장하고 읽으며 정답을 매 test case마다 출력합니다.

* rust는 i8, i16, i32 등의 정수형 변수를 index를 접근하기 위해 a[m]으로 표현했을 때 error를 뱉습니다. index로 접근하기 위해 [] 사이에 들어갈 값의 자료형은 usize 뿐이기 때문입니다. 따라서 미리 명시적으로 형변환을 해 vector에 접근해야 합니다.

📔 정답출력

조건에 맞게 출력합니다.


📕 Code

use std::io;

fn main() {
    let mut month = vec![0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    let mut test_case = String::new();
    io::stdin().read_line(&mut test_case).expect("wrong io");
    let test_case = test_case.trim().parse::<i32>().unwrap();
    for i in 1..test_case + 1 {
        let mut line = String::new();
        io::stdin().read_line(&mut line).expect("wrong io");
        line = line.trim().to_owned();
        let numbers: Vec<i32> = line
            .split_whitespace()
            .map(|num| num.parse::<i32>().unwrap())
            .collect();
        let year = numbers[0];
        let m = numbers[1];
        if (year % 100 != 0 && year % 4 == 0) || (year % 400 == 0) {
            month[2] = 29;
        } else {
            month[2] = 28;
        }
        if m == 1 {
            println!("{} 12 31", year - 1);
        } else {
            println!("{} {} {}", year, m - 1, month[(m - 1) as usize]);
        }
    }
}

📕 Test Case

 반례를 직접 작성해 보았습니다. 

input

1

2000 1

1999 12 31


*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.