-
JUNGOL 기초다지기 05 선택제어문보관함 2019. 11. 18. 21:12
프로그래밍에서 가장 기초적인 내용을 다루는 기초 다지기입니다.
이번 포스팅은 기초 다지기 중 다섯 번째인 선택제어문 문제를 풀어보도록 하겠습니다.
기초 내용인 만큼 다른 설명없이 문제와 코드만 간단하게 작성하도록 하겠습니다.
528 : 선택제어문 - 자가진단1
#include <iostream> using namespace std; int main(void) { int var; cin >> var; cout << var << endl; if (var < 0) cout << "minus" << endl; }
529 : 선택제어문 - 자가진단2
#include <iostream> using namespace std; int main(void) { int height, weight; cin >> height >> weight; int obesityVal = weight + 100 - height; cout << obesityVal << endl; bool isObesity = obesityVal > 0; if (isObesity) cout << "Obesity" << endl; }
530 : 선택제어문 - 자가진단3
#include <iostream> using namespace std; int main(void) { int age; cin >> age; if (age >= 20) cout << "adult" << endl; else cout << 20 - age << " years later" << endl; }
531 : 선택제어문 - 자가진단4
이번에는 작은 함수를 만들어 코드가 깔끔해 보이도록 작성해 봤습니다.
이런식으로 작성하면 코드의 의도를 명확하게 파악할 수 있다는 장점이 있습니다.
#include <iostream> using namespace std; bool IsFlyweight(float weight); bool IsLightweight(float weight); bool IsMiddleweight(float weight); bool IsCruiserweight(float weight); int main(void) { float weight; cin >> weight; if (IsFlyweight(weight)) { cout << "Flyweight" << endl; } else if (IsLightweight(weight)) { cout << "Lightweight" << endl; } else if (IsMiddleweight(weight)) { cout << "Middleweight" << endl; } else if (IsCruiserweight(weight)) { cout << "Cruiserweight" << endl; } else { cout << "Heavyweight" << endl; } } bool IsFlyweight(float weight) { return weight <= 50.85f; } bool IsLightweight(float weight) { return weight <= 61.23f; } bool IsMiddleweight(float weight) { return weight <= 72.57f; } bool IsCruiserweight(float weight) { return weight <= 88.45f; }
532 : 선택제어문 - 자가진단5
#include <iostream> using namespace std; int main(void) { float var1, var2; cin >> var1 >> var2; if (var1 >= 4.0f && var2 >= 4.0f) cout << 'A' << endl; else if (var1 >= 3.0f && var2 >= 3.0f) cout << 'B' << endl; else cout << 'C' << endl; }
533 : 선택제어문 - 자가진단6
작은 함수로 작성할 때의 장점은 주석으로 추가적인 설명을 기입할 필요 없이 코드 자체적으로 설명이 된다는 점 외에도 반복되는 코드를 하나의 함수로 정리할 수 있다는 장점이 있습니다.
작은 함수를 사용한 코드와 그렇지 않은 코드를 모두 작성하니 비교해보면 작은 함수의 장점을 파악할 수 있을 것입니다.
작은 함수 미사용)
#include <iostream> using namespace std; int main(void) { char sex; int age; cin >> sex >> age; // 남성 if (sex == 'M') { // 성인인지 판단 if (age >= 18) cout << "MAN" << endl; else cout << "BOY" << endl; } // 여성 else { // 성인인지 판단 if (age >= 18) cout << "WOMAN" << endl; else cout << "GIRL" << endl; } }
작은 함수 사용)
#include <iostream> using namespace std; bool IsMale(char sex); bool IsAdult(int age); int main(void) { char sex; int age; cin >> sex >> age; if (IsMale(sex)) { if (IsAdult(age)) cout << "MAN" << endl; else cout << "BOY" << endl; } else { if (IsAdult(age)) cout << "WOMAN" << endl; else cout << "GIRL" << endl; } } bool IsMale(char sex) { return sex == 'M'; } bool IsAdult(int age) { return age >= 18; }
534 : 선택제어문 - 자가진단7
#include <iostream> using namespace std; int main(void) { char alpha; cin >> alpha; if (alpha == 'A') cout << "Excellent" << endl; else if (alpha == 'B') cout << "Good" << endl; else if (alpha == 'C') cout << "Usually" << endl; else if (alpha == 'D') cout << "Effort" << endl; else if (alpha == 'F') cout << "Failure" << endl; else cout << "error" << endl; }
535 : 선택제어문 - 자가진단8
정수형으로 변환하면 소수점 이하 값을 버리는 것에 주목하시기 바랍니다.
#include <iostream> using namespace std; int main(void) { float score; cin >> score; switch (static_cast<int>(score)) { case 4: cout << "scholarship" << endl; break; case 3: cout << "next semester" << endl; break; case 2: cout << "seasonal semester" << endl; break; default: cout << "retake" << endl; break; } }
632 : 선택제어문 - 자가진단9
값의 비교를 삼항 연산자를 이어 한 줄로 처리할 수도 있습니다.
다만, 그렇게 하면 가독성이 굉장히 떨어지게 되므로 간결하게 작성하는 게 좋습니다.
#include <iostream> using namespace std; int GetMinValue(int var1, int var2, int var3); int main(void) { int var1, var2, var3; cin >> var1 >> var2 >> var3; cout << GetMinValue(var1, var2, var3) << endl; } int GetMinValue(int var1, int var2, int var3) { int var1vs2 = var1 < var2 ? var1 : var2; int var2vs3 = var2 < var3 ? var2 : var3; return var1vs2 < var2vs3 ? var1vs2 : var2vs3; }
120 : 선택제어문 - 형성평가1
#include <iostream> using namespace std; int main(void) { int var1, var2; cin >> var1 >> var2; int big = var1 > var2 ? var1 : var2; int small = var1 < var2 ? var1 : var2; cout << big - small << endl; }
121 : 선택제어문 - 형성평가2
#include <iostream> using namespace std; int main(void) { int var; cin >> var; if (var > 0) cout << "plus" << endl; else if (var < 0) cout << "minus" << endl; else cout << "zero" << endl; }
122 : 선택제어문 - 형성평가3
윤년은 400으로 나누어 떨어지는 해 혹은 4로 나누어 떨어지고 100으로는 나누어 떨어지지 않는 해를 말합니다.
#include <iostream> using namespace std; bool IsLeapYear(int year); int main(void) { int year; cin >> year; if (IsLeapYear(year)) cout << "leap year" << endl; else cout << "common year" << endl; } bool IsLeapYear(int year) { if (year % 400 == 0) return true; if (year % 4 == 0 && year % 100 != 0) return true; return false; }
123 : 선택제어문 - 형성평가4
나열형을 사용하는 것도 가독성을 향상시키는데 도움이 됩니다.
#include <iostream> using namespace std; enum Species { dog = 1, cat = 2, chick = 3, }; int main(void) { int num; cout << "Number? "; cin >> num; switch (num) { case Species::dog: cout << "dog" << endl; break; case Species::cat: cout << "cat" << endl; break; case Species::chick: cout << "chick" << endl; break; default: cout << "I don't know." << endl; break; } }
124 : 선택제어문 - 형성평가5
이 문제는 기본적으로 switch-case 문을 통해 쉽게 해결이 가능합니다.
그런데 배열 또는 맵을 사용하면 짧은 코드로 동일한 결과를 만들 수 있습니다.
switch-case 문 사용)
#include <iostream> using namespace std; int main(void) { int month; cin >> month; switch (month) { case 2: cout << 28 << endl; break; case 4: case 6: case 9: case 11: cout << 30 << endl; break; default: cout << 31 << endl; } }
배열 사용)
#include <iostream> using namespace std; int monthsDay[] = { 0, 31, 28, 31,30, 31, 30, 31, 31, 30, 31, 30, 31 }; int main(void) { int month; cin >> month; cout << monthsDay[month] << endl; }
배열 또는 맵을 사용한 경우 메모리 사용량은 증가하지만 미리 계산된 값을 사용하기 때문에 실행 속도는 더 빠를 수 있습니다. 이것은 이러한 단순한 코드에서도 확인이 가능했습니다.
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&sca=1050