등급: 브론즈2
사용된 문법: 그리디 알고리즘
#include
#include
#include
#include
#include
using namespace std;
int main(){
int A, B, C, M;
cin >> A >> B >> C >> M;
int tired = 0;
int work = 0;
for (int i = 0; i < 24; i++) {
if (tired + A <= M) {
tired += A;
work += B;
}
else {
tired -= C;
if (tired < 0) tired = 0;
}
}
cout << work << endl;
return 0;
}
문제 해설: 이 문제는 하루 24시간 동안 피로도가 누적되고, 이를 관리하면서 최대로 일한 양을 구하는 문제입니다. 피로도가 일정 값 이상이 되면 일을 할 수 없으며, 피로도를 줄이기 위해 잠을 자야 합니다. 이를 통해 하루 동안의 최대 작업량을 계산합니다.
등급: 브론즈2
사용된 문법: 구현
#include
#include
using namespace std;
int main() {
int n, m, a, b;
int arr[100];
cin >> n >> m;
for (int i = 1; i <= n; i++)
arr[i] = i;
while (m--) {
cin >> a >> b;
for (int i = 0; i <= (b - a) / 2; i++) {
swap(arr[a + i], arr[b - i]);
}
}
for (int i = 1; i <= n; i++) {
cout << arr[i] << ' ';
}
return 0;
}
문제 해설: 문제는 학생들의 순서를 바꾸는 작업을 여러 번 수행하는 문제로, 두 지점의 학생들을 서로 바꾸는 과정을 반복합니다. 중요한 점은 그 범위 내에서 반복적으로 스왑 연산을 수행하는 것입니다. 구현을 정확히 하기 위해 인덱스 접근에 주의해야 합니다.
등급: 브론즈2
사용된 문법: 수학
#include
#include
#include
using namespace std;
int main()
{
int arr[42] = { 0, };
int n;
int sum = 0;
for (int i = 0; i < 10; i++)
{
cin >> n;
if (!arr[n % 42]++)
sum++;
}
cout << sum;
}
문제 해설: 이 문제는 주어진 수들에 대해 42로 나누었을 때 나머지 값들이 몇 가지 종류가 있는지를 구하는 문제입니다. 핵심은 각 나머지 값이 중복되었는지 확인하여 중복되지 않는 값을 세는 것입니다.
등급: 실버4
사용된 문법: 그리디 알고리즘
#include
#include
#include
#include
#include
using namespace std;
int main(){
int num, won;
cin >> num >> won;
vector don(num);
for (int i = 0; i < num; i++) {
cin >> don[i];
}
int count = 0;
for (int i = num - 1; i >= 0; i--) {
if (don[i] <= won) {
count = count + won / don[i];
won = won % don[i];
}
}
cout << count << '\n';
return 0;
}
문제 해설: 이 문제는 그리디 알고리즘을 사용하여 가장 큰 동전부터 차례대로 돈을 낼 수 있는 만큼 내는 문제입니다. 나누어 떨어지지 않는 경우에는 그 나머지를 작은 동전으로 처리합니다.
등급: 브론즈2
사용된 문법: 구현
#include
using namespace std;
int main(){
int count = 0;
int maxCount = 0;
for (int i = 0; i < 4; i++) {
int out, in;
cin >> out >> in;
count += in - out;
if (count > maxCount) maxCount = count;
}
cout << maxCount;
}
문제 해설: 이 문제는 버스에 탑승하는 사람 수를 계산하고, 버스에 타고 있는 사람의 최대 수를 구하는 문제입니다. 각 정류장에서 승객의 탑승과 하차를 고려하여 그때그때 승객 수를 업데이트합니다.
등급: 브론즈5
사용된 문법: 반복문
#include
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cout << i << '\n';
}
return 0;
}
문제 해설: 이 문제는 1부터 N까지의 숫자를 출력하는 문제로, 단순한 반복문을 사용하여 풀 수 있습니다. 입력값에 따라 반복문을 실행하여 결과를 출력합니다.
등급: 브론즈2
사용된 문법: 배열
#include
#include
#include
using namespace std;
int main() {
int n;
cin >> n;
vector arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int maxVal = *max_element(arr.begin(), arr.end());
int minVal = *min_element(arr.begin(), arr.end());
cout << minVal << ' ' << maxVal;
return 0;
}
문제 해설: 이 문제는 주어진 수들 중에서 가장 작은 값과 큰 값을 찾아 출력하는 문제입니다. 배열의 최소값과 최대값을 찾기 위해 `min_element`와 `max_element` 함수를 사용합니다.
등급: 브론즈5
사용된 문법: 반복문
#include
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cout << i << '\n';
}
return 0;
}
문제 해설: 이 문제는 1부터 N까지의 숫자를 출력하는 문제로, 단순한 반복문을 사용하여 풀 수 있습니다. 입력값에 따라 반복문을 실행하여 결과를 출력합니다.
등급: 실버4
사용된 문법:스택
#include
#include
using namespace std;
vector stack;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, a;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a;
if (a == 1) {
int b;
cin >> b;
stack.push_back(b);
}
else if (a == 2) {
if (stack.size() >= 1) {
cout << stack.back() << "\n";
stack.pop_back();
}
else
cout << "-1" << "\n";
}
else if (a == 3)
cout << stack.size() << "\n";
else if (a == 4) {
if (stack.size() >= 1)
cout << "0" << "\n";
else
cout << "1" << "\n";
}
else if (a == 5) {
if (stack.size() >= 1)
cout << stack.back() << "\n";
else
cout << "-1" << "\n";
}
}
return 0;
}
문제 해설: 주어진 명령에 따라 스택(Stack)을 구현하고, 각 명령에 맞는 작업을 수행합니다. 스택은 LIFO(Last In, First Out) 구조로, 나중에 들어간 데이터가 먼저 나옵니다.