π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_μˆ˜ν•™&κ΅¬ν˜„

[Baekjoon/λ°±μ€€][10951][C/C++] A+B - 4 (EOF)

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 1. 24.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

Cμ—μ„œ EOF, scanf(), feof()의 κ°œλ…μ— λŒ€ν•΄ μ•Œκ³  있으면 ν’€ 수 μžˆλŠ” 문제.

1. 문제

https://www.acmicpc.net/problem/10951

 

10951번: A+B - 4

두 μ •μˆ˜ A와 Bλ₯Ό μž…λ ₯받은 λ‹€μŒ, A+Bλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

www.acmicpc.net

[문제]

두 μ •μˆ˜ A와 Bλ₯Ό μž…λ ₯받은 λ‹€μŒ, A+Bλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

[μž…λ ₯]

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ μ€„λ‘œ 이루어져 있으며, 각 쀄에 A와 Bκ°€ 주어진닀. (0 < A, B < 10)

[좜λ ₯]

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ A+Bλ₯Ό 좜λ ₯ν•œλ‹€.

[예제 μž…λ ₯ 1]

1 1
2 3
3 4
9 8
5 2

[예제 좜λ ₯ 1]

2
5
7
17
7

2. 풀이

이 문제의 핡심은 λͺ‡ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μž…λ ₯ 받을지 μ•Œ 수 μ—†λ‹€λŠ” 점이닀. 파일의 끝에 λ„λ‹¬ν•˜μ—¬ 더 이상 읽을 데이터가 없을 λ•Œ, μž…λ ₯ μŠ€νŠΈλ¦Όμ€ EOF(End Of File)λ₯Ό λ¦¬ν„΄ν•œλ‹€. EOFλŠ” End Of File의 μ•½μžλ‘œ, 파일의 끝을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ -1둜 μ •μ˜λœ μƒμˆ˜μ΄λ‹€. (μ΄λŠ” ν—€λ”νŒŒμΌ <stdio.h>의 41행에 μ •μ˜λ˜μ–΄ μžˆλ‹€.) κ²°κ΅­, 이 λ¬Έμ œλŠ” EOFκ°€ 될 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•΄μ„œ μž…λ ₯을 λ°›μœΌλ©΄ λ˜λŠ” λ¬Έμ œμ΄λ‹€.

while (scanf("%d %d", &a, &b) != EOF)
while (scanf("%d %d", &a, &b) == 2)

/* line 1κ³Ό line 2쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜μ—¬ 문제λ₯Ό ν’€λ©΄ λœλ‹€. */

이 문제의 핡심이 λ˜λŠ” μ½”λ“œλŠ” μœ„μ™€ κ°™λ‹€. μ΄λŠ” 파일의 끝(EOF)에 도달할 λ•Œ κΉŒμ§€ while문을 μ‹€ν–‰ν•œλ‹€λŠ” 의미λ₯Ό μ§€λ‹Œλ‹€.

 

scanf ν•¨μˆ˜λŠ” '읽어듀인 μž…λ ₯의 개수λ₯Ό λ°˜ν™˜'ν•œλ‹€. (이λ₯Ό μ•Œλ©΄, scanf둜 μž…λ ₯값을 읽어듀일 λ•Œ "C6031 λ°˜ν™˜κ°’μ΄ λ¬΄μ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€." λΌλŠ” κ²½κ³ κ°€ λœ¨λŠ” μ΄μœ λ„ μ•Œ 수 μžˆλ‹€.) '읽어듀인 μž…λ ₯의 개수λ₯Ό λ°˜ν™˜'ν•œλ‹€λŠ” 것은 scanfν•¨μˆ˜ 호좜 μ‹œ μ‚¬μš©ν•œ ν˜•μ‹ μ§€μ •μž(%둜 μ‹œμž‘ν•˜λŠ” ν˜•μ‹) 쀑 λͺ‡ κ°œκ°€ μ²˜λ¦¬λ˜μ—ˆλŠ”μ§€λ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€. 즉, 파일의 끝(EOF)에 λ„λ‹¬ν•˜λ©΄ -1(=EOF)을 λ°˜ν™˜ν•œλ‹€.

 

예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€κ³  κ°€μ •ν•˜μž.

int main() {
    int a, b;
    int n = scanf('%d %d', &a, &b);
    printf("%d", n);
    return 0;
}

1 1 μž…λ ₯ μ‹œ 2κ°€ 좜λ ₯λœλ‹€.
1κ³Ό 1을 곡백을 두고 μž…λ ₯ν•˜λ©΄ μ§€μ •λœ ν˜•μ‹μΈ μ •μˆ˜κ°’ 2κ°œκ°€ μ •μƒμ μœΌλ‘œ μž…λ ₯λ˜μ—ˆκΈ° λ•Œλ¬Έμ— scanf() ν•¨μˆ˜λŠ” 2λ₯Ό 좜λ ₯ν•¨μœΌλ‘œμ¨ %d 2κ°œκ°€ μ²˜λ¦¬λ˜μ—ˆμŒμ„ μ•Œλ €μ€€λ‹€.

 

a 1 μž…λ ₯ μ‹œ 좜λ ₯은 μ–΄λ–»κ²Œ 될까?
λ‘λ²ˆμ§Έ %dλŠ” μ •μƒμ μœΌλ‘œ μž…λ ₯λ˜μ–΄ 1이 좜λ ₯될 거라 생각할 수 μžˆμ§€λ§Œ 0이 λ°˜ν™˜λœλ‹€. κ·Έ μ΄μœ λŠ” scanf() ν•¨μˆ˜λŠ” 잘λͺ»λœ μž…λ ₯값을 λ§Œλ‚˜λ©΄ μž…λ ₯을 μ‹€νŒ¨λ‘œ μ²˜λ¦¬ν•˜κ³  ν•¨μˆ˜λ₯Ό μ’…λ£Œν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ 첫번째 %dμ—μ„œ 였λ₯˜κ°€ λ‚œ 문자 'a'λŠ” ν‘œμ€€ μž…λ ₯ 버퍼에 남고 λ‘λ²ˆμ§Έ %dλ₯Ό μ²˜λ¦¬ν•˜κΈ° μ „ scanfν•¨μˆ˜κ°€ μ’…λ£Œλœλ‹€.

 

1 z μž…λ ₯ μ‹œ 좜λ ₯은 μ–΄λ–»κ²Œ 될까?
1이 좜λ ₯λœλ‹€.

3. μ½”λ“œ

[풀이1. scanf()의 λ°˜ν™˜κ°’μ„ μ΄μš©ν•œ 풀이]

#pragma warning (disable:4996)
#include <stdio.h>

int main(void) {
	int a, b;
	while (scanf("%d %d", &a, &b) != EOF) {
		printf("%d\n", a + b);
	}
	return 0;
}

[풀이2. feof()λ₯Ό μ΄μš©ν•œ 풀이]

#pragma warning (disable:4996)
#include <stdio.h>

int main(int argc, char* argv[]) {
	int a, b;
	while (true) {
		scanf("%d %d", &a, &b);
		if (feof(stdin) != 0)
			break;
		printf("%d\n", a + b);
	}
	return 0;
}
728x90
λ°˜μ‘ν˜•