조건문
간단한 입출력과 산술 연산을 통해 프로그램이 계산하는 것을 알아봤다면, 다음으로는 프로그램의 흐름을 제어하는 조건문입니다.
프로그램은 계산된 결과에 따라 다른 결과를 출력해야하는 경우가 있습니다. 순서도를 떠올리시면 이해가 쉽습니다. 즉, 주어진 조건에 따라 프로그램의 흐름을 바꾸는 구문을 조건문이라고 합니다.
간단한 조건문을 활용하는 문제를 몇 가지 풀어보며 조건문이 어떻게 문제 풀이에 활용될 수 있는지 알아봅시다.
9498. 시험 성적
한 개의 정수를 입력받은 후, 그 정수의 값에 따라 다른 결과를 출력하는 문제입니다. 조건문을 적절히 활용하여 풀어봅시다!
#include <stdio.h>
int main() {
int x;
scanf("%d", &x);
if(x >= 90) {
printf("A");
} else if(x >= 80) {
printf("B");
} else if(x >= 70) {
printf("C");
} else if(x >= 60) {
printf("D");
} else {
printf("F");
}
return 0;
}
else
를 사용하지 않고, AND 연산인 &&
를 사용하여 다음과 같이 작성할 수도 있습니다.
#include <stdio.h>
int main() {
int x;
scanf("%d", &x);
if(x >= 90) {
printf("A");
}
if(x < 90 && x >= 80) {
printf("B");
}
if(x < 80 && x >= 70) {
printf("C");
}
if(x < 70 && x >= 60) {
printf("D");
}
if(x < 60) {
printf("F");
}
return 0;
}
눈여겨보신 분들이라면, x >= 90
의 반대는 x < 90
이기 때문에 else
를 사용한 것과 똑같다는 것을 눈치채셨을겁니다. 그러므로 두 코드는 같은 결과를 출력합니다.
x = int(input())
if x >= 90:
print("A")
else:
if x >= 80:
print("B")
else:
if x >= 70:
print("C")
else:
if x >= 60:
print("D")
else:
print("F")
파이썬의 경우, 연속된 else
와 if
를 줄여서 적은 elif
라는 예약어가 있습니다. elif
를 사용하면 코드는 아래와 같아집니다.
x = int(input())
if x >= 90:
print("A")
elif x >= 80:
print("B")
elif x >= 70:
print("C")
elif x >= 60:
print("D")
else:
print("F")
위는 하나의 예시입니다. else
를 사용하지 않고 다음처럼 작성할 수도 있습니다.
x = int(input())
if 90 <= x and x <= 100:
print('A')
if 80 <= x and x < 90:
print('B')
if 70 <= x and x < 80:
print('C')
if 60 <= x and x < 70:
print('D')
if x < 60:
print('F')
10817. 세 수
세 정수를 입력받아 그 중 두 번째로 큰 정수를 출력하는 문제입니다.
이 문제는 많은 풀이가 존재하지만, 지금은 조건문만 사용하여 풀어보시길 바랍니다. 문제에서 요구하는 정답에는 생략된 조건들이 많습니다. 그것을 찾아낸다면 쉽게 해결할 수 있습니다. 힌트는 모든 경우의 수를 고려해보는 것입니다.
세 정수를 크기 순으로 나열했을 때, 나올 수 있는 경우의 수는 총 6가지 입니다.
- a <= b <= c
- a <= c <= b
- b <= a <= c
- b <= c <= a
- c <= a <= b
- c <= b <= a
주어진 세 가지 수가 위 6가지 조건 중 하나를 만족한다면, 그 때 우리는 2번째로 큰 수를 알 수 있습니다. 예를 들어, 주어진 세 수가 c <= a <= b인 상황을 만족한다면 두 번째로 큰 수는 a가 될 것입니다. 이 조건에 맞춰서 코드를 작성하면 됩니다.
#include <stdio.h>
int main(){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if( a <= b && b <= c ){
printf("%d\n", b);
}
else if( a <= c && c <= b ){
printf("%d\n", c);
}
else if( b <= a && a <= c ){
printf("%d\n", a);
}
else if( b <= c && c <= a ){
printf("%d\n", c);
}
else if( c <= a && a <= b ){
printf("%d\n", a);
}
else if( c <= b && b <= a ){
printf("%d\n", b);
}
return 0;
}
여기서 주의할 점이 있습니다. else
는 위 코드에서 생략할 수 없다는 점입니다. 왜일까요?
세 정수가 모두 같은 경우가 있기 때문입니다. 그 외에도 여러 모순이 있기 때문이지만, 더 자세한 이유는 생략하겠습니다.
아래 코드는 위 코드의 조건문들을 OR연산인 ||
을 사용하여 합쳤습니다. 괄호와 조건문 연산에 유의하며 한번 참고해보세요.
#include <stdio.h>
int main(){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if( (b <= a && a <= c) || (c <= a && a <= b) ){
printf("%d\n", a);
}
else if( (a <= b && b <= c) || (c <= b && b <= a) ){
printf("%d\n", b);
}
else if( (a <= c && c <= b) || (b <= c && c <= a) ){
printf("%d\n", c);
}
return 0;
}
위 코드는 아래와 같은 방식으로 좀 더 간결하게 바꿔쓸 수 있습니다.
#include <stdio.h>
int main(){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if( (b <= a && a <= c) || (c <= a && a <= b) ){
printf("%d\n", a);
}
else if( (a <= b && b <= c) || (c <= b && b <= a) ){
printf("%d\n", b);
}
else {
printf("%d\n", c);
}
return 0;
}
맨 마지막 else if의 경우, 항상 위 두 가지 조건에 해당하지 않는다면 세번째 조건은 참이 되기 때문에 마지막 if는 생략할 수 있습니다.
넘어가기 전에
조건문은 프로그램에서 실행되는 각 구문이나 명령어들의 순서에 영향을 미치기 때문에, 반복문과 함께 쓰이는 경우가 많습니다. 그러니, 반복문을 배우기 전에 조건문을 확실히 알고 가시기를 권장합니다.