[BOJ] 3985 :: 롤 케이크
https://www.acmicpc.net/problem/3985
문제는 매우 간단하다. 첫번째 출력은 입력과 동시에 출력할 수 있으므로 문제는 두번째 출력이다.
가장 먼저 생각나는 것은 L개의 array에 비어있으면 마크하는 동시에 카운팅해서 가장 큰값을 찾는 것이다.
1번 방청객이 2 4 를 했다면 2~4까지 마크를하고 3을 카운팅해서 max에 저장한다.
2번 방청객이 3 7 을 했다면 3,4 에는 마크가 되어있으므로 카운팅하지 않고 5,6,7 3개만 마크 후 카운팅하면 된다.
이때, 같은 조각을 받았다면 번호가 작은 방청객의 번호를 출력하라 했으므로 max는 그대로 1번 방청객이다.
#include<iostream>
using namespace std;
int main() {
int L, K;
cin >> L >> K;
// L길이의 array 생성 후 초기화
bool* array = new bool[L];
for (int i = 0; i < L; i++) {
array[i] = false;
}
int a, b;
int max1=0, max2=0;
int index_max1=0, index_max2=0; //방청객 번호를 출력해야되기 때문에 따로 저장할 것을 또 만들었다.
for (int i = 0; i < K; i++) { //순서대로 비교하기 때문에 따로 저장할 필요없이 반복 입출력을 받아 마지막에 출력하면된다.
cin >> a >> b;
if (max1 < b - a + 1) { // 첫번째 출력값
max1 = b - a + 1;
index_max1 = i;
}
int cnt = 0;
for (int k = 0; k < b - a + 1; k++) { // 두번째 출력값
if (array[a - 1 + k] == false) {
array[a - 1 + k] = true;
cnt++;
}
}
if (max2 < cnt) {
max2 = cnt;
index_max2 = i;
}
}
cout << index_max1 + 1 << endl;
cout << index_max2 + 1 << endl;
}
나름 간단하게 해결할 수 있었다.
for (int k = a; k == b; k++) {
if (array[k - 1] == false) {
array[k - 1] = true;
cnt++;
}
}
2번째 출력값을 구하는 과정에서 처음에는 위와 같이 k = a라 두고 b와 같아질때까지 하나씩 증가시키면서 반복문을 사용하였다. 이렇게하면 array안에 k-1로 간단하게 작성할 수 있었기 때문이다.
하지만 이때 for문이 반복되지 않는 문제가 발생하였다.
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
for (int k = a; k <= b; k++) {
cout << k << "번째" << endl;
}
}
한번 위와 같은 코드로 바꿔보았는데 아래와 같이 잘 작동하는 것을 알 수 있었다.
[##_Image | kage@pMQsf/btqB1nEQqmb/J8decHYidZcz2ump3rzECK/img.png | CDM | 1.3 | {“originWidth”:203,”originHeight”:135,”style”:”alignLeft”,”mobileStyle”:”widthContent”}_##] |
처음 시작하자마자 k != b 이기 때문에 당연히 for문이 시작되지도 않는 것이었다.
아무래도 오랜만에 코딩하다보니까 바보같은 실수를 했다 ㅋㅋ
댓글남기기