[BOJ] 20363 - 당근 키우기

Sierra·2022년 2월 10일
0

[BOJ] Greedy

목록 보기
14/33
post-thumbnail

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

문제

꽉꽉나라의 농부 오리는 당근을 키우려고 한다. 꽉꽉나라에서는 씨앗이 X만큼의 온기와 Y만큼의 수분을 가지면 당근으로 자란다고 한다.

씨앗은 햇빛을 1번 받을 때마다 1만큼의 온기가 증가하고, 햇빛을 10번 받을 때마다 1만큼의 수분이 감소한다.

씨앗은 물을 1번 받을 때마다 1만큼의 수분이 증가하고, 물을 10번 받을 때마다 1만큼의 온기가 감소한다.

만약, 감소되어야 하는 온기 혹은 수분이 이미 0이라면 감소되지 않는다. 즉, 온기와 수분은 음수가 되지 않는다. 맨 처음 씨앗의 온기와 수분은 0이다.

오리는 당근을 효율적으로 키우기 위해, 당근이 자랄 때까지 햇빛과 물을 주는 횟수의 합을 최소화하려고 한다. 예를 들어, X = 10, Y = 10이라고 하자.

씨앗에 햇빛을 10번 주면 온기 10, 수분 0이 된다. 그리고, 물을 10번 주면 온기 9. 수분 10이 된다. 마지막으로 햇빛을 1번 주면 온기 10, 수분 10으로 당근이 자라게 된다. 이때, 햇빛과 물을 준 횟수의 합은 21이고 위 예제에서의 최솟값이다.

X와 Y가 주어졌을 때, 당근이 자랄 때까지 햇빛과 물을 주는 횟수의 합의 최솟값을 구하는 프로그램을 작성하라.

입력

첫째 줄에 X와 Y (0 ≤ X, Y ≤ 109)를 의미하는 정수가 공백으로 구분되어 주어진다.

출력

당근이 자랄 때까지 햇빛과 물을 주는 횟수의 합의 최솟값을 나타내는 정수를 출력하라.

예제 입출력

  • 예제 입력 1
    10 10
  • 예제 출력 1
    21
  • 예제 입력 2
    123456 12345
  • 예제 출력 2
    137035

Solution

#include <iostream>

using namespace std;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int X, Y;
    int answer;
    cin >> X >> Y;
    if (X >= Y) answer = (X + Y) + Y / 10;
    else answer = (X + Y) + X / 10;
    cout << answer << '\n';
}

어떻게든 복잡하게 생각하지 않으려고 머리를 써야하는 문제다.
X와 Y 둘중 큰 놈을 기준으로 물을 주든 햇빛을 비추든 해야 한다는 것은 충분히 알 수 있는 사실이다.

예를 들어 123456, 12345를 만들어야하는 입장이다.

만약 123456을 모두 채우고 12345를 채운다면, 12345 / 10 만큼 123456에서 줄어든다. 그 말은 123456에 또 12345 / 10 만큼 채우는동안 반대편에서 12345 / 10 / 10만큼 줄어든다는 얘기다.

이러한 뻘짓을 막기위해 낸 아이디어는 X와 Y중 더 큰 곳을 먼저 채우고 반대편 값의 / 10 만큼의 분량을 더 채우는것이다. 나머지 부분을 다 채우는 동안 줄어들 분량을 미리 채우는 것이다.

while문을 통해 풀려다가 숫자의 범위를 보고 그만두었다.

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/

0개의 댓글