[BOJ] 백준 #11720. 숫자의 합 (C/C++)
🎨 문제
문제 링크: https://www.acmicpc.net/problem/11720
💬 풀이
- 적절히 숫자 입력을 받는다.
- ASCII코드를 이용해 int형과 char형에 적절히 +,- 연산을 하면 char형 ↔ int형이 서로 변환 가능한 점을 활용해 정수형으로 출력한다.
C++
C++의 string도 배열처럼 인덱스를 통해 각 문자에 접근이 가능한 점을 이용해 한 글자씩 처리한다.
C
getchar()
getchar() 함수는 표준입력 스트림(stdin)인 키보드로 입력받은 문자를 리턴하는 함수다. 콘솔창에서 키보드로 입력하는 표준 입력을 int형으로 한 개씩 반환해준다.
주로 문자(char)를 하나씩 입력받을 때나 버퍼 비우기용으로 사용한다.
- 헤더파일: <stdio.h>
- 원형: int getchar(void)
- 리턴값: 읽어들인 문자 리턴, 실패 시 EOF(-1) 리턴
👩💻 코드
C++
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main() {
int N;
string s;
int sum = 0;
cin >> N >> s;
for (int i = 0; i < N; i++) {
sum += s[i] - '0';
}
cout << sum;
return 0;
}
C (1)
배열에 한꺼번에 입력받아서 총합을 구하는 방식. (위 C++ 코드와 유사)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int N;
scanf("%d", &N);
char input[101];
int sum = 0;
scanf("%s", &input);
for (int i = 0; i < N; i++) {
sum += input[i] - '0';
}
printf("%d\n", sum);
return 0;
}
C (2)
하나씩 입력받고 더하고 입력하고 더하고 하는 방식
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int N;
scanf("%d", &N);
getchar(); // 버퍼 비우기
char ch;
int sum = 0;
for (int i = 0; i < N; i++) {
ch = getchar();
sum += ch - '0';
}
printf("%d\n", sum);
return 0;
}
입력할 숫자의 개수 N을 scanf()로 입력받고나면, 엔터키 때문에 버퍼에 ‘\n’이 남게 된다. 따라서 본격적으로 둘째 줄 숫자들을 받기 전 getchar()를 이용해 버퍼를 비워줬다.
그 다음 다시 getchar()를 이용해 문자를 하나씩 받는데, ‘0’의 ASCII값 48을 빼줘야 한다.
📝 +α
(버퍼 비우기 공부 내용 추가)
스트림 입출력 (콘솔 표준 입출력)
키보드로부터 입력받은 값은 프로그램에 직빵으로 전달되는 게 아니라, ‘입력 버퍼‘라는 임시 저장공간을 거친다.

버퍼를 채우는 버퍼링(buffering)을 굳이 하는 이유는 성능 향상이다. 문자를 개별 처리하는 것보다, 문자들을 모아 일괄 처리하는 것이 효율적이기 때문이다.
키보드로부터 입력된 데이터가 입력 스트림을 거쳐서 입력버퍼로 들어가는 시점은 엔터키가 눌리는 시점이고, 이 버퍼에 저장된 값이 실행중인 프로그램에 입력되는 것이다. 입력버퍼에 저장된 값은 읽혔을 때(실행 프로그램에 실제로 입력되었을 때) 사라지게 된다. 출처
입력 버퍼 비우기
콘솔 표준 입출력 함수 scanf(), fgets() 등으로 문자열 입력을 받다보면, ‘\n’이 버퍼에 남아서 다음 입력 때 이 ‘\n’이 입력돼버린다. 이 문제를 해결하기 위해서 입력함수 후에 getchar();를 하거나 아래와 같은 버퍼 비우는 함수를 호출하는 등 조치를 해줘야 된다.
Sol #1) 입력함수 뒤에 getchar(); 한 줄 추가
getchar();
Sol #2) 버퍼를 비워주는 함수를 따로 정의해서 호출
void ClearReadBuffer(void) {
while (getchar() != '\n');
}
‘\n’을 읽을 때까지 getchar()가 호출되도록 한다. 그럼 버퍼에 남은 ‘\n’뿐 아니라, 앞에 남아있는 데이터들도 전부 비워줘서 버퍼엔 아무것도 남지 않게 된다.
Sol #3) fgets() 후 강제로 널 문자를 넣어줌
fgets(str, sizeof(str), stdin);
str[strlen(string)-1] = '\0'; // 강제로 널 문자 넣어줌
Sol #4) scanf()에서 %c 앞에 공백 추가
scanf(" %c", &c);
Sol #5) fflush(stdin); 추가
fflush(stdin); // 단, Visual Studio에서만 먹힌다
댓글남기기