본문 바로가기

Algorithm/Math

(Rust) - 백준(BOJ) 15734 : 명장 남정훈

반응형

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

 

15734번: 명장 남정훈

오늘도 어김없이 피시방에서 피파를 하고 있는 정훈이는 큰 고민에 빠졌다. 자신에 팀에 있는 선수들의 주 사용 발(Main Foot)이 적절하게 나눠져있지 않기 때문이다. 정훈이의 팀에는 L명의 왼발

www.acmicpc.net

기준에 따라 적절히 나누는 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

한 줄을 입력받을 line, 각 발잡이 선수 l, r, a를 각각 선언 후 입력받습니다.

📔 풀이과정

양발잡이 선수들을 최대한 균형있게 배치해야 합니다.먼저 왼발잡이와 오른발잡이 선수의 차이를 diff를 선언해 저장합니다. 1. 양발잡이 선수가  diff보다 많다면 충분히 차이를 메꾸고 남습니다. 차이를 메꾸고 남은 양발잡이 선수가 홀수면 한 명만 방출하면 반씩 나눌 수 있습니다. 짝수면 방출할 필요가 없습니다.2. 양발잡이 선수가 diff보다 적다면 왼발, 오른발 선수의 수 중 적은 쪽을 모두 채워도 균형을 맞출 수 없습니다. 이 경우에는 (왼발, 오른발 선수 중 많은 쪽 - 적은쪽 + a)만큼을 방출하면 됩니다.

📔 정답출력

경우에 맞게 정답을 출력합니다.


📕 Code

use std::{cmp, io};

fn get_num(s: &str) -> i32 {
    s.to_owned().parse::<i32>().unwrap()
}

fn main() {
    let mut line = String::new();
    io::stdin().read_line(&mut line).expect("wrong io");
    let line: Vec<&str> = line.trim().split(" ").collect::<Vec<_>>();

    let l = get_num(line[0]);
    let r = get_num(line[1]);
    let a = get_num(line[2]);
    let all = l + r + a;
    let diff = i32::abs(l - r);
    let surplus = diff - a;

    if surplus < 0 {
        let surplus = a - diff;
        if surplus % 2 > 0 {
            print!("{}", all - 1);
        } else {
            print!("{}", all);
        }
    } else {
        print!("{}", all - i32::abs(cmp::min(l, r) + a - cmp::max(l, r)));
    }
}

📕 Test Case

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

input

6 7 7

20

 

input

1 7 3

8

 

input

7 2 3

10


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