[백준] 10952번 : A+B - 5 - [C++]
https://www.acmicpc.net/problem/10952
- 문제
새로운 카테고리인 while 문의 첫 문제다.
- 알고리즘 [접근 방법]
만약 while문을 다뤄보았다면 모두가 쉽게 풀 수 있었을 것이다.
기본적으로 for문과 유사하게 반복문이라는 메커니즘을 갖고있지만 조금은 양식이 다르다. 그동안 배웠던 for문은 기본 형식이 다음과 같았다.
반면에 while문은 형태가 조금 더 간단하다.
두 개의 반복문은 본질적으로 그렇게 큰 차이는 없지만 for문은 초기식에 따른 변수에 따라 조건식을 검사하기 때문에 좀 더 유연하게 활용할 수 있고, 반면에 while문은 단순한 반복을 하고자 할 떄 사용하는 경향이 있다. 쉽게 말해 for문의 조건식만 있는 것이 while문이라고 보아도 무방하다.
그렇다보니 두 조건식의 상호 변환도 가능은 하다.
for문으로 10회 반복하고자 한다면 다음과 같이 작성 할 수 있다.
for(int i = 0; i < 10; i++) {
cout << i << "번째 loop " << endl;
}
이를 while문으로 변경한다면 다음과 같이 할 수 있다.
int i = 0;
while(i < 10) {
cout << i << "번째 loop " << endl;
i++;
}
위와 같은 방법으로 상호 변환이 가능한 점이 좋다. 특히 이 번 문제처럼 몇 개의 입력이 들어오는지 알 수 없을 경우 while문을 활용하여 무한 반복하도록 조건식을 true 혹은 0이 아닌 정수로 둔 뒤, while문 안에서 if 조건식을 두어 A와 B가 0을 입력받는 순간 while문을 탈출하도록 break를 하는 방법이 더욱 간결하게 짤 수 있다.
즉, 쉽게 말하자면 다음과 같이 작성해주면 된다.
while(true) {
int A, B;
cin >> A >> B;
if(A == 0 && B == 0) { // A와 B가 모두 0이라면 while문 종료
break;
}
cout << A + B << "\n";
}
위와 같은 형식으로 작성해주면 된다.
- 2가지 방법을 사용하여 풀이한다.
이 전에 빠른 A+B를 풀어보셨다면 알겠지만, C++는 입출력이 기본적으로 C의 기본 입출력과 동기화 되어있어서 상대적으로 느리다. 그래서 두 io의 동기화를 끊어주고, 입력과 출력 묶음을 풀어주면 성능적으로 이득을 볼 수 있지만, 아직 익숙치 않은 분들도 계실 것 같아 일반적인 방법과 입출력 향상 방법 이렇게 두 가지 방법을 보여주고자 한다.
알고리즘 자체는 위 내용을 그대로 적용하면 된다.
1. 기본 입출력
2. 향상 된 입출력
- 풀이
- 방법 1 : [기본 입출력]
#include <iostream>
using namespace std;
int main(int argc, char const *argv[]) {
int A, B;
while (true) {
cin >> A >> B;
if (A == 0 && B == 0) { // A와 B가 모두 0이라면 while문 종료
break;
}
cout << A + B << "\n";
}
return 0;
}
가장 기본적인 방법이라 할 수 있겠다.
참고로 true 대신 0이 아닌 정수로 써도 된다. 0은 false를 의미하며 그 외의 수는 true를 의미하기 떄문이다. 보통은 숫자로 기입하는 경우 1로 쓴다.
- 방법 2 : [향상 된 입출력]
앞서 말했듯, C와 C++의 표준 입출력 동기화를 끊어주고, 입력과 출력도 번갈아가면서 사용되기 때문에 입출력이 묶여있는 것을 끊어주는 방법이다.
이 방법을 잘 모른다면 다음 글을 참고하시길 바란다.
#include <iostream>
using namespace std;
int main(int argc, char const *argv[]) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int A, B;
while (true) {
cin >> A >> B;
if (A == 0 && B == 0) { // A와 B가 모두 0이라면 while문 종료
break;
}
cout << A + B << "\n";
}
return 0;
}
크게 어려울 것은 없을 것이다.
- 성능
채점 번호 : 30021759 - 방법 2 : 향상 된 입출력
채점 번호 : 30021755 - 방법 1 : 기본 입출력
보면 미약하게나마 향상 된 입출력 방법의 시간이 감소한 것을 볼 수 있다.
- 정리
이 번 문제는 기본적인 while문 사용법을 알고있었다면 그렇게 어렵지 않았을 것이다. 그리고 for문과 while문 중 어떤 것을 사용하더라도 그렇게 큰 시간차이는 없다.(이는 컴파일러가 생성한 어셈블리 수준의 코드를 뜯어보면 아는데, for문과 while문은 크게 차이는 없다. 다만, do while문의 경우는 조금 다른 형식이라 다른 반복문에 비해 약간 더 빠른 것으로 알고있다.) 만약 어렵거나 이해가 되지 않은 부분이 있다면 언제든 댓글 남겨주시면 최대한 빠르게 답변드리겠다.
'C++ - 백준 [BAEK JOON] > 반복문' 카테고리의 다른 글
[백준] 1110번 : 더하기 사이클 - [C++] (0) | 2021.07.06 |
---|---|
[백준] 10951번 : A + B - 4 - [C++] (25) | 2021.06.29 |
[백준] 2439번 : 별 찍기 - 2 - [C++] (1) | 2021.05.11 |
[백준] 2438번 : 별 찍기 - 1 - [C++] (0) | 2021.05.08 |
[백준] 11022번 : A+B - 8 - [C++] (0) | 2021.05.02 |