no image
[C++] 백준 4단계 - 3052번 문제
문제설명 소스코드 #include using namespace std; int main() { int array[42] = {}; int input; for (int i = 0; i > input; ++array[input % 42]; } int count = 0; for (int i = 0; i 0) ++count; cout
2023.03.31
no image
[C++] 백준 4단계 - 5597번 문제
문제설명 소스코드 #include using namespace std; int main() { int arr[30] = { 0 }; int input = 0; for (int i = 0; i > input; arr[input - 1] = 1; } for (int i = 0; i < 30; ++i) if (arr[i] != 1) cout
2023.03.30
no image
[C++] 백준 4단계 - 10810번 문제
문제설명 소스코드 #include using namespace std; int arr[101]; int N, M; int main() { cin >> N >> M; while (M--) { int i, j, k; cin >> i >> j >> k; for (int u = i; u
2023.03.29
no image
[C++] 백준 4단계 - 2562번 문제
문제설명 소스코드 #include using namespace std; int main() { int max = 0; int idx; int arr[9]; for (int i = 0; i > arr[i]; if (arr[i] > max) { max = arr[i]; idx = i; } } cout
2023.03.29
no image
[C++] 백준 4단계 - 10818번 문제
문제설명 소스코드 #include using namespace std; int main() { int N; int max; int min; cin >> N; int* arr = new int[N]; for (int i = 0; i > arr[i]; max = min = arr[0]; for (int i = 0; i max) max = arr[i]; if (arr[i] < min) min = arr[i]; } cout
2023.03.29
no image
[C++] 백준 4단계 - 10871번 문제
문제설명 소스코드 #include using namespace std; int main() { int N; int X; cin >> N >> X; int* arr = new int[N]; for (int i = 0; i > arr[i]; for (int i = 0; i < N; ++i) if (arr[i] < X) cout
2023.03.28
no image
[C++] 백준 4단계 - 10807번 문제
문제설명 소스코드 #include using namespace std; int main() { int arrlength; int num = 0; int input; cin >> arrlength; int* arr = new int[arrlength]; for (int i = 0; i > arr[i]; cin >> input; for (int i = 0; i < arrlength; ++i) if (input == arr[i]) ++num; cout
2023.03.28
no image
[C++] 백준 3단계 - 10951번 문제
문제설명 소스코드 #include using namespace std; int main() { int a, b; while (!(cin >> a >> b).eof()) cout val; cout > a >> b).eof() 방식으로 괄호 안의 cin >> a >> b를 통해 읽은 후 eof상태인지를 검사하는 것이다. 따라서 아래와 같이 소스코드를 작성해야한다. while(!(cin >> a >> b).eof()) { ... } 출처 : https://st-lab.tistory.com/257
2023.03.28

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int array[42] = {};
	int input;
	for (int i = 0; i < 10; ++i)
	{
		cin >> input;
		++array[input % 42];
	}
	int count = 0;
	for (int i = 0; i < 42; ++i) if (array[i] > 0) ++count;
	cout << count;
}

 

풀이

0으로 초기화된 42칸짜리 배열을 선언하고, 입력을 42로 나눈 나머지를 a라고 하면, 좀 전에 선언한 배열의 a번째 인덱스를 1증가 시킨다.

for문을 돌려서 0보다 큰 배열의 개수를 센 후 출력한다.

나머지가 같은 수가 있다면, array[나머지]가 1증가하게 된다.

왜 42칸짜리 배열을 선언하는가?
어떠한 수든 42로 나눈 나머지는 0~41이기 때문에 42칸짜리 배열을 선언하는 것이다.

 

문제설명

소스코드

#include <iostream>
using namespace std;
int main() {
	int arr[30] = { 0 };
	int input = 0;
	for (int i = 0; i < 28; ++i)
	{
		cin >> input;
		arr[input - 1] = 1;
	}
	for (int i = 0; i < 30; ++i) if (arr[i] != 1) cout << i + 1 << endl;
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int arr[101];
int N, M;
int main() {
    cin >> N >> M;
    while (M--)
    {
        int i, j, k;
        cin >> i >> j >> k;
        for (int u = i; u <= j; u++) arr[u] = k;
    }
    for (int i = 1; i <= N; ++i) cout << arr[i] << ' ';
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int max = 0; int idx;
	int arr[9];
	for (int i = 0; i < 9; ++i)
	{
		cin >> arr[i];
		if (arr[i] > max)
		{
			max = arr[i];
			idx = i;
		}
	}
	cout << max << endl << idx + 1;
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int N; int max; int min;
	cin >> N;
	int* arr = new int[N];
	for (int i = 0; i < N; ++i) cin >> arr[i];
	max = min = arr[0];
	for (int i = 0; i < N; ++i)
	{
		if (arr[i] > max) max = arr[i];
		if (arr[i] < min) min = arr[i];
	}
	cout << min << " " << max;
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int N; int X;
	cin >> N >> X;
	int* arr = new int[N];
	for (int i = 0; i < N; ++i) cin >> arr[i];
	for (int i = 0; i < N; ++i) if (arr[i] < X) cout << arr[i] << " ";
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int arrlength; int num = 0; int input;
	cin >> arrlength;
	int* arr = new int[arrlength];
	for (int i = 0; i < arrlength; ++i) cin >> arr[i];
	cin >> input;
	for (int i = 0; i < arrlength; ++i) if (input == arr[i]) ++num;
	cout << num;
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int a, b;
	while (!(cin >> a >> b).eof()) cout << a + b << "\n";
}

 

풀이

이 문제의 핵심 포인트는 입력이 몇 개인지 정해지지 않았다는 것이다.

파일의 끝에 도달했을 때 즉, 더이상 읽을 수 있는 데이터가 없는 경우를 EOF(End Of File)이라고 한다.

입력 스트림이 더이상 읽을 것이 없는 파일의 끝에 도달했을 때 처리를 해야 한다는 것이다.

파일의 끝까지 앍었다고 EOF가 되는 것이 아니라 끝까지 읽고난 뒤 그다음 파일을  읽으려 할 때 읽을 데이터가 없을 때 EOF가 되는 것이다.

 

cin은 EOF를 발생시키는데 eof()함수는 파일의 끝에 도달한 뒤 읽고자 할 경우 true를 발생시킨다.

while(!cin.eof()) {
	...
}

이렇게 코드를 작성하면 틀린다.

 

char val;
while(!cin.eof()) {
	cin >> val;
	cout << val;
}

 

이렇게 코드가 작성되어있고 a, b ,c ,d를 입력한다고 하면

 

위와 같이 되어 결과적으로 abcdd 출력이 되어버린다.

cin에서 EOF가 되면 더 이상 내부 스트림 상태를 fail로 두고 val 변수에 값을 저장하지 않는다. 즉, val의 상태는 이전 루프의 값을 갖고 있게 되는 것이다.

즉, eof() 가 우리가 원하는 올바른 시점에 true가 되려면 "읽기 시도를 한 후"에 eof 검사를 해야 한다는 것이다.

그렇기 때문에 (cin >> a >> b).eof() 방식으로 괄호 안의 cin >> a >> b를 통해 읽은 후 eof상태인지를 검사하는 것이다.

 

따라서 아래와 같이 소스코드를 작성해야한다.

while(!(cin >> a >> b).eof()) {
	...
}

 

출처 : https://st-lab.tistory.com/257