| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 백준단계별풀기
- 백준
- 백준c언어
- 코딩
- 유니티렌더링
- 유니티오류
- 랜더링오류
- 유니티
- 백준7287
- 노션커스텀
- 백준정답
- 백준씨언어
- 백준11382
- coding
- 백준10699
- 유니티에셋
- 씨언어
- CPP
- 백준18108
- C언어
- 백준단계별로풀어보기
- 자바
- 노션자동화
- java
- 5000port
- 계획노션
- 게임
- C++
- killport
- 자바설치오류
- Today
- Total
동동 개발
[C++] 백준 단계별로 풀기 2단계 : 조건문 (총 7문제) 본문
백준 2단계는 조건문이다. C++ 언어의 조건문 관련 문법을 살펴보니 C와의 차이점은 딱히 느껴지지 않았다.
if ~ else if ~ else 구문과 switch문(케이스가 너무 많을 경우)을 사용한다. 둘의 성능차이는 대개 무시가능한 범주라고 하니 어떤 코드를 쓰고 싶은지에 따라 달라질 것 같다. 가독성이 좋고 유지보수가 쉬운 건 switch이지만, 단일 변수가 아니고 서로 다른 변수나 표현식이 포함된 여러 조건을 검사할 땐 if문이 더 적합하다.
switch(number)
{
case 1:
cout << "입력한 수는 1 입니다." << endl;
break;
case 2:
cout << "입력한 수는 2 입니다." << endl;
break;
default: // 다른 케이스가 모두 아닐 경우
cout << "입력한 수는 1, 2가 아닙니다." << endl;
break;
}
switch문은 조금 정리해놓았다. 자, 이제 풀어봅시다!
✏️ 1330번 : 두 수 비교하기
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b ;
if(a>b){
cout << '>' << endl;
}else if(a<b){
cout << '<' << endl;
}else{
cout << "==" << endl;
}
return 0;
}
조건문을 사용하는 간단한 문제다.
✏️ 9498번 : 시험 성적
#include <iostream>
using namespace std;
int main()
{
double score;
cin >> score ;
if(90<=score && score<=100){
cout << "A" << endl;
}else if(80<=score && score<90)
{
cout << "B" << endl;
}else if(70<=score && score<80){
cout << "C" << endl;
}else if(60<=score && score<70){
cout << "D" << endl;
}else{
cout << "F" << endl;
}
return 0;
}
90점 ~ 100점 사이라는 조건을 코드로 쓰려면
90<=score<=100 (X)
90<=score && score<=100 (O)
여러 수식을 쓸 경우 &&(and)와 ||(or)를 쓰는 걸 잊지 말자 ㅎㅎ. 오랜만에 써서 까먹었다... 왠지 코드에서 기시감이 들더라니.
✏️ 2753번 : 윤년
#include <iostream>
using namespace std;
int main()
{
int year;
cin >> year;
if((year%4==0 && year%100!=0)||(year%400==0)){
cout << 1 << endl;
}else{
cout << 0 << endl;
}
return 0;
}
이 문제의 슈도코드를 짜다가 문득 생각이 들었다.
100의 배수를 표현하기 위해 year%100 ==0 을 쓸 때,
0%100도 0 아닌가? 이런 예외는 어떻게 처리하는지 궁금해서 찾아봤다.
>> 0%n은 항상 0을 반환한다.(0은 모든 수의 배수라는 수학적 원리에 의거)
>> n%0은 에러(ZeroDivisionError)를 발생시키므로 주의해야한다.
더하여, 나머지 연산은 정수에서만 사용할 수 있고 실수에서는 사용할 수 없다.(컴파일 에러가 난다.)
이를 원할 경우 #include <cmath> 를 사용해서, fmod를 쓸 수 있다.
#include <cmath>
fmod(a,b)
✏️ 14681번 : 사분면 고르기
#include <iostream>
using namespace std;
int main()
{
int x, y;
cin >> x >> y;
if (x > 0 && y > 0){
cout << 1 << endl;
}else if (x < 0 && y > 0){
cout << 2 << endl;
}else if (x < 0 && y < 0){
cout << 3 << endl;
}else {
cout << 4 << endl;
}
return 0;
}
이 문제를 풀다보니 문득 궁금한 게 생겼다. 코드의 가독성을 높이려면 어디에 띄어쓰기를 해야할까?
찾아보니 연산자 주변과 키워드 뒤에 공백을 주는 게 좋다고 한다. 조건이 길어질 경우 개행해서 정렬하면 좋다.
또, endl 과 "\n"중 무엇이 더 효율적일지 찾아본 결과 \n을 쓰는 게 더 효율적이라는 것을 알아냈다.
스트림 사용 중의 std::endl은 매 개행마다 불필요한 flush(버퍼를 강제로 비움)작업을 실행하여 "\n"에 비해 효율이 굉장히 떨어지게 된다고 한다.(https://sam0308.tistory.com/122)
그리고 조건문을 이렇게 압축할 수도 있다고 한다. 하지만 조금 덜 직관적이어지는 것 같다.
if (y > 0) {
cout << (x > 0 ? 1 : 2) << '\n';
}
✏️ 2884번 : 알람 시계
#include <iostream>
using namespace std;
int main()
{
int h, m;
cin >> h >> m;
if(h == 0)
{ // h가 0시일 경우
if(m >= 45) { // m이 45보다 크거나 같으면
m -= 45; // h 유지, m만 빼기
}
else {
h = 23; // h = 23시
m +=15; // m = 60 - 45 + m 계산
}
}
else // h가 1~23일 경우
{
if (m >= 45){ // m이 45보다 크거나 같으면
m -= 45; // h 유지, m만 빼기
}else {
h -= 1; // h - 1
m += 15; // m = 60 - 45 + m 계산
}
}
cout << h << " " << m ;
return 0;
}
테스트 케이스를 잘 짜서 반례를 잘 확인해야겠다는 생각이 들었다. 주어진 예시 입력값만으로는 어디가 문제인지 찾기가 어려웠다.
여기서 경계값은 h = 0, 23과 m = 44, 45, 46 정도가 있겠다. 소프트웨어 공학에서 테스트케이스 짜는 법을 배워두니 이렇게 쓸모가 있군.
더하여 반례를 잘 찾으려면 최대/최소값, 경계값, 조건 분기점, 특이값 등의 요소를 항상 생각해야겠다.
✏️ 2525번 : 오븐 시계
#include <iostream>
using namespace std;
int main()
{
int h, m, t;
int plus_h, plus_m;
int result_h, result_m ;
cin >> h >> m >> t;
// 1. t를 plus_h, plus_m으로 변환
if (t < 60) {
plus_h = 0;
plus_m = t;
}else {
plus_h = t / 60;
plus_m = t % 60;
}
// 2. 최종 시각 계산
result_h = h + plus_h ;
result_m = m + plus_m ;
// 60분보다 클 경우, h 증가하므로 Minute 로직 먼저
if (result_m >= 60) {
result_h += (m + plus_m) / 60;
result_m = (m + plus_m) % 60 ;
}
// Hour
if (result_h >= 24) {
result_h = result_h % 24 ;
}
cout << result_h << " " << result_m << endl;
return 0;
}
시간이 좀 걸렸던 문제지만, 경계값을 잘 생각하는 게 도움이 많이 됐다.
그리고 오류가 나는 부분은 계속 디버깅을 해보며 찾아냈다.
역시 귀찮게 생각하지 말고 디버깅 몇 줄 쓰는 게 굉장한 도움이 된다.
✏️ 2480번 : 주사위 세개
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
if (a==b && b==c){
cout << 10000 + (a*1000) << '\n';
} else if (a==b || a==c){
cout << 1000 + (a*100) << '\n';
} else if (b==c){
cout << 1000 + (b*100) << '\n';
} else {
cout << 100 * max({a, b, c}) << '\n';
}
return 0;
}
처음엔 최댓값 함수를 내가 직접 만들려고 했다. (input 값 세 개를 배열에 넣은 다음, for문으로 최댓값 리턴하는 함수를 만듦.)
근데 C++에는 알고리즘 라이브러리가 있어서, #include <algorithm>을 해주면 max()로 최댓값을 구할 수 있다!

ㅎㅎ
잘 배워갑니다! 이렇게 조건문 단계도 끝~
'C++ 공부' 카테고리의 다른 글
| [C++] 백준 단계별로 풀기 4단계 : 1차원 배열 (총 10문제) (0) | 2026.02.19 |
|---|---|
| [C++] 백준 단계별로 풀기 3단계 : 반복문 (총 12문제) (0) | 2026.02.18 |
| [C++] 백준 단계별로 풀기 1단계 : 입출력과 사칙연산 (총 13문제) (0) | 2026.02.16 |
| C++의 입출력: cin, cout, endl (0) | 2026.02.15 |
| C++와 C언어 차이 TOP7(코딩테스트 대비) (0) | 2026.02.13 |