반응형
https://www.acmicpc.net/problem/15734
기준에 따라 적절히 나누는 문제였습니다.
📕 풀이방법
📔 입력 및 초기화
한 줄을 입력받을 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
*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.
'Algorithm > Math' 카테고리의 다른 글
(C++) - LeetCode (easy) 231. Power of Two (2) | 2023.01.17 |
---|---|
(Python) - 백준(BOJ) 22938 : 백발백준하는 명사수 (0) | 2022.08.28 |
(C++) - 백준(BOJ) 8794 : Poniedziałki (0) | 2022.07.19 |
(C++) - 백준(BOJ) 9469 : 폰 노이만 (0) | 2022.06.19 |
(C++) - 백준(BOJ) 14490 : 백대열 (2) | 2022.06.08 |