2024. 11. 30. 16:48ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/28519
접근 방법 - 규칙을 활용한 기초적인 사칙연산 문제
백준의 28519번 문제는 정해진 규칙을 참조하면서 쉽게 해결할 수 있는 사칙연산 문제이다.
해당 문제는, 2종류의 각 초콜릿 개수가 주어지고 초콜릿을 먹는 특정 규칙이 있을 때 최대로 먹을 수 있는 초콜릿의 개수를 구하여 출력해야 하는 문제이다.
이때, 초콜릿을 먹는 규칙은 아래와 같다.
- 초콜릿은 한 번에 하나씩 먹을 수 있다.
- 직전에 먹은 초콜릿과 다른 초콜릿을 먹을 수 있다.
(다만, 처음 먹는 경우라면 원하는 종류의 초콜릿을 골라서 먹으면 된다.)
해당 문제는 한국어로 적혀있지 않아, 한국어 지문 번역본을 참고하면서 풀어보길 바란다.
https://www.acmicpc.net/board/view/124770
필자는 종류 A와 종류 B의 초콜릿이 있다고 가정할 때, 그 둘의 개수가 같은 경우와 다른 경우로 나누어 연산을 시도해 보았다.
* A와 B의 개수가 같을 경우엔 두 종류를 번갈아가며 먹을 때 모두 먹을 수 있다.
A의 개수가 2개이고, B의 개수가 2개인 경우엔 위와 같은 순서로 초콜릿을 먹을 수 있다.
따라서, A==B인 경우엔 A+B가 정답임을 알 수 있다.
* 다만, A와 B의 개수가 다를 경우엔 한 종류의 초콜릿은 반드시 다 먹을 수 있게 된다.
다만, 개수가 많은 초콜릿은 다 먹을 수 있거나 그중 일부만 먹을 수 있다.
이때 최댓값을 구하라고 하였으니, 위와 같은 경우에 B 초콜릿은 (A 초콜릿 개수)+1만큼 먹어야 최대가 나올 수 있다.
따라서, A!=B인 경우엔 (개수가 적은 초콜릿)*2+1가 정답임을 알 수 있다.
필자는 위 풀이 방식으로 코드를 작성하였는데, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 코드와 설명을 참고하면 도움이 될 것이다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 두 종류의 초콜릿 개수(m, n)를 각각 입력받는다
2) 2개의 경우로 나누어서, 연산을 취하도록 한다. (로직의 출처는 위 설명을 참고)
- m과 n이 같다면, m+n를 즉시 정답으로 출력한다.
- m과 n이 다르다면, m과 n 중 더 작은 값으로 min을 초기화한 다음에 min*2+1을 정답으로 출력한다.
3) 2)를 통하여 정답을 출력하였다면, 실행을 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;
//백준 28519번 코드
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int m, n;
cin >> m >> n;
if (m == n) {
cout << m + n << endl;
}
else {
int min = m > n ? n : m;
cout << min * 2 + 1 << endl;
}
}
제출 결과
(2024.03.30 백준 28519번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 1769번 3의 배수 (C++/cpp) (0) | 2024.12.29 |
---|---|
[백준 BOJ] 26042번 식당 입구 대기 줄 (C++/cpp) (0) | 2024.12.22 |
[백준 BOJ] 1969번 DNA (C++/cpp) (0) | 2024.11.24 |
[백준 BOJ] 26530번 Shipping (C++/cpp) (0) | 2024.11.16 |
[백준 BOJ] 10178번 할로윈의 사탕 (C++/cpp) (0) | 2024.10.03 |