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문이 시작되지도 않는 것이었다.

아무래도 오랜만에 코딩하다보니까 바보같은 실수를 했다 ㅋㅋ

업데이트:

댓글남기기