동동 개발

[C++] 백준 단계별로 풀기 2단계 : 조건문 (총 7문제) 본문

C++ 공부

[C++] 백준 단계별로 풀기 2단계 : 조건문 (총 7문제)

양동선 2026. 2. 17. 15:28

백준 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()로 최댓값을 구할 수 있다!

 

 

 

ㅎㅎ

잘 배워갑니다! 이렇게 조건문 단계도 끝~