-
JUNGOL 실력키우기 도형만들기1 - 구구단 | 구구단2보관함 2020. 1. 15. 22:00
기초 다지기에서 배운 내용을 응용하여 문제를 해결해야 하는 실력 키우기입니다.
실력 키우기는 비슷한 문제 유형별로 묶어서 풀어보겠습니다.
이번 포스팅에서는 도형만들기1의 구구단 시리즈를 풀어보겠습니다.
1291 : 구구단
이번 문제는 조건이 세 가지 등장합니다
1. 시작과 끝 값이 항상 커지는 게 아니다.
2. 시작과 끝 값은 각각 2와 9사이의 값이다.
3. 출력 예와 같이 줄을 맞춰 출력해야 한다.
여기에서 2번 조건을 해결하기 위해 범위 검사 함수를 추가했고, 1번 조건을 하나의 반복문으로 처리하기 위해 함수 포인터를 사용했습니다. 마지막으로 줄을 맞춰 출력하는 것은 공백 3개로 구분되는 것 외에도 결과 값이 2개의 칸을 사용하고 우측 정렬되는 것을 포함합니다.
#include <iostream> #include <iomanip> using namespace std; bool IsInRange(int num); bool IsBigOrEqual(int a, int b); bool IsSmallOrEqual(int a, int b); void Increase(int& num); void Decrease(int& num); int main(void) { int s, e; while (true) { cin >> s >> e; // 범위 벗어나는 경우 검사 if (!IsInRange(s) || !IsInRange(e)) { cout << "INPUT ERROR!" << endl; continue; } // 큰값 -> 작은값, 작은값 -> 큰값을 모두 대응하기 위한 함수포인터 사용 bool (*checker)(int, int) = nullptr; void (*adder)(int&) = nullptr; // 위 조건에 따라 함수를 선택한다. checker = (s < e) ? IsSmallOrEqual : IsBigOrEqual; adder = (s < e) ? Increase : Decrease; for (int i = 1; i <= 9; ++i) { for (int j = s; checker(j, e); adder(j)) { cout << j << " * " << i << " = " << setw(2) << j * i; cout << " "; } cout << endl; } break; } } bool IsInRange(int num) { if (num < 2) return false; if (num > 9) return false; return true; } bool IsSmallOrEqual(int a, int b) { return a <= b; } bool IsBigOrEqual(int a, int b) { return a >= b; } void Increase(int& num) { num++; } void Decrease(int& num) { num--; }
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=574&sca=2010
1234 : 구구단2
기본적으로 구구단과 같은 유형의 문제입니다. 또한, 조건 또한 동일합니다.
다만 출력 방식이 조금 달라지는데 이번에는 한 번에 하나의 단을 출력하고 3개씩 나눠서 출력하면 됩니다.
#include <iostream> #include <iomanip> using namespace std; bool IsInRange(int num); bool IsBigOrEqual(int a, int b); bool IsSmallOrEqual(int a, int b); void Increase(int& num); void Decrease(int& num); int main(void) { int s, e; while (true) { cin >> s >> e; // 범위 벗어나는 경우 검사 if (!IsInRange(s) || !IsInRange(e)) { cout << "INPUT ERROR!" << endl; continue; } // 큰값 -> 작은값, 작은값 -> 큰값을 모두 대응하기 위한 함수포인터 사용 bool (*checker)(int, int) = nullptr; void (*adder)(int&) = nullptr; // 위 조건에 따라 함수를 선택한다. checker = (s < e) ? IsSmallOrEqual : IsBigOrEqual; adder = (s < e) ? Increase : Decrease; // 하나의 단을 모두 출력한 뒤 다음 단을 출력한다. for (int i = s; checker(i, e); adder(i)) { for (int j = 1; j <= 9; ++j) { cout << i << " * " << j << " = " << setw(2) << i * j; // 3개씩 나눠서 출력한다. if (j % 3 == 0) cout << endl; else cout << " "; } cout << endl; } break; } } bool IsInRange(int num) { if (num < 2) return false; if (num > 9) return false; return true; } bool IsSmallOrEqual(int a, int b) { return a <= b; } bool IsBigOrEqual(int a, int b) { return a >= b; } void Increase(int& num) { num++; } void Decrease(int& num) { num--; }
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2076&sca=2010