[백준] 9498번 : 시험 성적 - [C++]
-
문제
워낙 쉬운 문제라 크게 설명 할 게 없다....
- 알고리즘 [접근 방법]
이전 문제에서 if-else 조건문에 대해 알아보았다.
기본적으로 if-else는 if() 문의 조건을 만족한다면 if문 블럭 안의 내용을 실행하고 만족하지 못한다면 else 문의 블럭을 실행하는 구조였다. 이 문제 또한 똑같은 원리를 적용하면 된다.
오늘은 코드를 깔끔하게 최적화하여 작성 하는 방법을 알려주고자 한다.
int score; // 시험점수를 입력받았다고 가정
if(score <= 100 && score >= 90){
cout << "A";
}
else if(score < 90 && score >= 80){
cout << "B";
}
else if(score < 80 && score >= 70){
cout << "C";
}
else if(score < 70 && score >= 60){
cout << "D";
}
else {
cout << "F";
}
만약 코딩을 막 접한 분들이라면 위와같이 작성하셨을 수도 있다.
물론 위 작성 방식도 틀린 것은 아니다.
다만, 조건문 안의 조건식이 길어지고 보는 입장에서도 코드가 더러워 보일 수 있다. 좀 더 깔끔하게 쓰는 방법은 없을까?
생각해보자. 조건문 if-else if-else 구조는 기본적으로 아래와 같다.
if(조건식 1){
[실행문 1] // 조건식 1이 참일경우
}
else if(조건식 2){
[실행문 2] // 조건식 1이 거짓이면서 조건식 2가 참일경우
}
else if(조건식 3){
[실행문 3] // 조건식 1, 2이 거짓이면서 조건식 2가 참일경우
}
else if(조건식 4){
[실행문 4] // 조건식 1, 2, 3이 거짓이면서 조건식 2가 참일경우
}
else {
[실행문 5] // 위 조건식을 모두 만족하지 못했을 경우
}
즉, 원래 코드를 보면 만약 조건식 1이 90점 이상이었을 때라고 본다면, 조건식 1을 만족하지 못하면 자연스래 그 밑의 else if 문에서는 90점 이상은 만족 못했다는게 확인이 되는 것이다.
한마디로 중첩되는 범위에 대해서 앞 조건식에서 걸러진다면 그 아래의 조건식에서는 검사 할 필요가 없는 것이다.
코드로 보면 이해가 갈 것이다.
int score; // 시험점수를 입력받았다고 가정
if(score >= 90){ // 주어지는 입력은 100을 넘지 않기 때문에 score <= 100 필요 없음
cout << "A";
}
else if(score >= 80){ // 90점 이상은 자연스레 걸러진다.
cout << "B";
}
else if(score >= 70){ // 80점 이상은 자연스레 걸러진다.
cout << "C";
}
else if(score >= 60){ // 70점 이상은 자연스레 걸러진다.
cout << "D";
}
else { // 60점 이상은 자연스레 걸러진다.
cout << "F";
}
위와같이 작성하면 좀 더 깔끔하게 만들 수 있다. 또한 위 처럼 작성한다면 장점이 조건식 검사를 줄여 효율이 좋아진다는 것이다.
원래 작성했던 코드를 보자.
score <= 100 && score >= 90 -> 조건 검사 2번
score < 90 && score >= 80 -> 조건 검사 2번
score < 80 && score >= 70 -> 조건 검사 2번
score < 70 && score >= 60 -> 조건 검사 2번
최악의 경우, 즉 else문까지 오게 될 경우 총 8번의 조건 검사를 거쳐가야 한다.
하지만, 조건식을 최소화 한 코드를 보면 절반으로 총 4번의 조건 검사 밖에 안한다.
당장에는 제출하더라도 큰 차이는 없어 보일 수는 있어도, 후에 조건식이 복잡해지거나 반복적으로 검사하게 될 경우 이러한 차이에서 속도(시간)이 차이가 날 수 있다.
그러니 항상 문제를 보면 1차적으로 작성한 뒤, 어떻게 코드를 더욱 최적화 할 수 있을지 고민해보는 습관을 들이면 좋을 것 같다.
- 1가지 방법을 사용하여 풀이한다.
이전 포스팅까진 stdio.h 로 C라이브러리를 이용한 입출력도 보여주었지만, 앞으로는 꼭 필요한 상황이 아닌 이상 C++ 표준 라이브러리로 풀 것이다.
이는 C++ 를 배우신 분이라면 알겠지만, 사실 C와 C++은 얼핏 비슷한 언어처럼 보이고 상호 호환도 가능하지만, 언어 지향점은 많이 상이하기 때문이다.
이 부분에 대해서는 이후에 다룰 수 있는 기회가 된다면 따로 다루기로 하겠다.
- 풀이
- 방법 1
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int score;
cin >> score;
if(score >= 90){
cout << "A";
}
else if(score >= 80){
cout << "B";
}
else if(score >= 70){
cout << "C";
}
else if(score >= 60){
cout << "D";
}
else {
cout << "F";
}
return 0;
}
- 성능
채점 번호 : 26896598 - 방법 1
- 정리
오늘은 간단한 조건문에 대해 어떻게 코드의 가독성을 높이고 최적화를 하는지 맛보기로 알아보았다.
크게 어려울 건 없었던지라 그다지 설명 할 것도 없긴 하나, 혹여 어렵거나 이해가 되지 않은 부분이 있다면 언제든 댓글 남겨주시면 최대한 빠르게 답변드리겠다.
'C++ - 백준 [BAEK JOON] > 조건문' 카테고리의 다른 글
[백준] 2525번 : 오븐 시계 - [C++] (0) | 2022.07.24 |
---|---|
[백준] 2844번 : 알람 시계 - [C++] (2) | 2021.03.15 |
[백준] 1468번 : 사분면 고르기 - [C++] (0) | 2021.03.11 |
[백준] 2753번 : 윤년 - [C++] (0) | 2021.03.09 |
[백준] 1330번 : 두 수 비교하기 - [C++] (0) | 2021.02.28 |