백준 단계별 풀어보기 2 단계, if 문의 마지막 문제입니다! 사실 이번 문제는 저번 문제들에서 배운 논리 연산자와 관계 연산자를 조금만 응용하면 금방 만들 수 있지만 초보자는 쉽게 놓칠 수 있는 부분이 있어서 풀이를 해 보려고 합니다! 그럼 바로 시작해보죠.
세 수(#10817) 문제는 세 개의 정수가 주어졌을 때 두 번째로 큰 정수를 출력하는 프로그램을 작성해야 하는 문제인데요, 저번 문제와 비슷하게 입력된 값들을 비교하는 문제입니다. 다만 저번에는 제일 작은 수를 찾는 문제여서 쉬웠지만 두 번째로 큰 수를 찾아야 하기 때문에 조금 더 복잡하죠. 코드를 살펴봅시다.
#include <stdio.h>
int main(void) {
int a, b, c, mid;
scanf("%d %d %d", &a, &b, &c);
if ((a > b && a < c) || (a < b && a > c))
mid = a;
else if ((a < b && b < c) || (a > b && b > c))
mid = b;
else
mid = c;
printf("%d\n", mid);
return 0;
}
형식은 얼추 비슷하죠? 스스로 해보신 분들도 아마 위 코드와 비슷하게 작성했을 것 같습니다. a, b, c 변수들의 값들을 비교하면서 논리 연산자를 사용해 각 변수들이 중간일 때를 찾으면 됩니다. 다만 놓치고 지나가면 안 되는 중요한 포인트가 하나 있는데요, 문제 어디에도 세 수가 무조건 서로 다르다는 조건이 없습니다. 그렇기 때문에 위의 코드를 그대로 사용하면 두 개 이상의 수가 같을 때 원하는 숫자가 나오지 않을 수도 있습니다. 예를 들어 2 2 1을 입력하면 두 번째로 큰 숫자인 2가 아니라 1을 출력하게 되죠. 왜냐하면 위 두 if 문에서는 a와 b가 같은 경우를 염두에 두지 않아서 무조건 마지막 else로 넘어가기 때문이죠.
#include <stdio.h>
int main(void) {
int a, b, c, mid;
scanf("%d %d %d", &a, &b, &c);
if ((a > b && a < c) || (a <= b && a > c))
mid = a;
else if ((a < b && b <= c) || (a >= b && b > c))
mid = b;
else
mid = c;
printf("%d\n", mid);
return 0;
}
그렇다면 서로 같은 경우도 두 번째로 큰 수를 찾을 수 있게 관계 연산자를 조금 수정해 주면 됩니다. 위 코드처럼 작성하면 이제 두 개 이상의 수가 같더라도 문제없이 두 번째로 큰 수를 찾을 겁니다.
테스트를 해 봅시다! 빌드한 뒤 다양한 조합의 숫자들을 입력해 보면 항상 중간 수가 나오는 것을 볼 수 있습니다. 다행이네요.
이제 제출을 해 볼까요? 백준에 들어간 뒤 언어를 C로 선택해서 제출하시면 됩니다.
성공!
이걸로 2단계 if 문도 끝이 났네요. 조금씩 프로그래밍 실력이 늘고 있는 게 느껴지시나요? 늘고 있기를 바라면서 다음 강좌는 3단계 for 문으로 돌아오도록 하겠습니다.
'프로그래밍 > 백준' 카테고리의 다른 글
백준으로 배우는 C 언어 15. A + B - 3 (1) | 2020.03.13 |
---|---|
백준으로 배우는 C 언어 14. 구구단 (4) | 2020.03.12 |
백준으로 배우는 C 언어 12. 상근날드 (1) | 2020.03.11 |
백준으로 배우는 C 언어 11. 윤년 (1) | 2020.03.10 |
백준으로 배우는 C 언어 10. 두 수 비교하기 (1) | 2020.03.10 |