본문 바로가기
백준 200제

백준 c++로 문제 풀기 (1~10)

by 노재두내 2025. 4. 26.

c#언어로 개발해왔기 때문에 c++은 정말 오랜만에 써보는데 코딩테스트는 C#보다는 Python, c++, Java가 유리하다고 한다. 나는 그중에서 그나마 아는게 C++밖에 없기 때문에 C++로 오늘부터 시작해보려고 한다! 

 

백준 난이도 쉬운 문제들로 200문제를 풀어서 일단 언어와 문법에 익숙해지는게 첫번째 목표이다.

 

그 첫걸음은 국룰인 Hello World! 출력하기


1/200. 2557번

처음에 나는 

1. cout을 생각하지 못하고 #include <iostream> 헤더가 필요 없는 줄 알았음 

2. Hello World가 문자열이니 반환값이 string이어야 하는거 아닌가?했던 생각 ㅋ

using namespcae std;

string main(){
    cout<<Hello World!<<endl;
    return 0;
}

이렇게 작성했고 컴파일 에러가 났다. string은 type name이 아니라는 메세지. 그래서 아 이게 아니구나 해서 

그다음엔 string-> int로 변경했다 

using namespcae std;

int main(){
    cout<<Hello World!<<endl;
    return 0;
}

역시나 다시 에러난다. cout과 Hello가 선언되지 않았다는 메세지.  아아 드디어 완벽히 뭐가 문젠지 파악했다 

#include <iostream>
using namespace std;
int main(){
    cout<<"Hello World!"<<endl;
    return 0;
}


2/200. 1000번

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

#include <iostream>
using namespace std;

int main(){
    int a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
    return 0;
}

 

이번엔 한번에 정답

 


3/200. 10998번

두 정수 A와 B를 입력받은 다음, A×B를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

음 입력에서 A,B의 범위가 정해진게 좀 마음에 걸리긴 하는데 일단은 이전 문제에서 했던대로 작성해봤다.

#include <iostream>
using namespace std;

int main(){
    int a,b;
    cin>>a>>b;
    cout<<a*b<<endl;
    return 0;
}

 

오 한번에 정답이다.

 

그치만 저 범위는 그럼 왜 써있었던걸까? 그냥 정수라는걸 알려주려고?  나의 친구 지피티한테 물어봐야지 ㅎㅎ

그렇다고 한다 

만약 범위 체크하는 코드를 작성하고 싶다면 

  // 입력 범위 검사
    if (a > 0 && a < 10 && b > 0 && b < 10) {
        cout << a * b << endl;
    } else {
        cout << "입력값이 범위 밖입니다." << endl;
    }

이렇게 작성하면 된다고 합니다.


4/200. 1008번

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

#include <iostream>
using namespace std;

int main(){
    int a,b;
    cin>>a>>b;
    cout<<a/b<<endl;
    return 0;
}

예 그렇다네요

 

그 소수점을 몇번째 자리까지 표시할건지를 지정해볼까 싶다. 근데 그건 까먹었으니 찾아보자

precision과 fixed로 가능한데

 

cout.precision(자리수);

cout<<fixed;

 

이런 형태로 가능하다 precision으로만으로도 자릿 수 지정이 가능하지만 fixed를 쓰는것과 안쓰는건 이런 차이점이 있다.

예를들어

double a = 12.235667; 이라고 했을 때

cout.precision(5); 

cout<<a ;    //출력 값은 12.235

 

double a = 1.235667;

cout<<fixed; 

cout.precision(5);

cout<<a ;    // 출력 값은 12.23566

 

즉 precision(n)을 사용하면 전체 자릿수를 지정하는 것이지만 fixed를 사용하면 소수점 아래 자릿수를 지정하는 것이다.

cout.precision(n)

  • cout 객체의 precision 설정을 바꾸는 멤버 함수

setprecision(n)

  • 출력 스트림 안에서 바로 쓰는 조작자(manipulator)
  • #include <iomanip> 필수

 

+ setprecision(n)이 있는데 이건 #include <iomanip> 헤더가 필요하다. 출력 스트림 안에서 바로 쓰는 조작자(manipulator)이다.

cout.precision(6);  // 전체 유효 자릿수 6자리로 설정
cout << fixed << a << endl;
cout << fixed << setprecision(6) << a << endl;

위의 코드에서 보이는 것처럼 setprecision(n)을 사용하면 한줄로 깔끔하게 작성가능하다. 

 

 

다시 문제로 돌아가보자 

#include <iostream> 
#include <iomanip>
using namespace std;

int main(){
    int a,b; //정수 a,b 입력 받기
    cin>>a>>b;
    cout<<fixed<<setprecision(6)<<(double)a/b<<endl;
    
    return 0;
}

이렇게 작성했는데 또 틀렸다 뭐가 문제지??

 

아 출력 결과는 절대오차 또는 상대오차가 10⁻⁹ 이하면 정답으로 처리라는 조건이 있으니 

오차를 더 줄이기 위해, 최소 setprecision(9) 이상으로 설정해야함 

 

setprecision(9)로 코드 수정하고 정답 !!


5/200. 10869번 사칙연산

문제

두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. 

입력

두 자연수 A와 B가 주어진다. (1 ≤ A, B ≤ 10,000)

출력

첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A*B, 넷째 줄에 A/B, 다섯째 줄에 A%B를 출력한다.

예제 입력 1 복사

7 3

예제 출력 1 복사

10
4
21
2
1

 

#include<iostream>
using namespace std;

int main()
{
    int a,b;
    cout<<a+b<<'\n';
    cout<<a-b<<'\n';
    cout<<a*b<<'\n';
    cout<<a/b<<'\n';
    cout<<a%b<<endl;
    return 0;
}

cin>>a>>b; 로 a,b 값을 입력 받았더니 맞았다.

#include<iostream>
using namespace std;

int main()
{
    int a,b;
    cin>a>>b;
    cout<<a+b<<'\n';
    cout<<a-b<<'\n';
    cout<<a*b<<'\n';
    cout<<a/b<<'\n';
    cout<<a%b<<'\n';
    return 0;
}

하나 알아두었으면 하는 부분은 사실 다음 줄로 넘어가는 개행 부분의 경우 endl 을 써도 되지만, 나중에 빠른 입출력을 요구하는 경우에는 endl 을 지양하는 것이 좋다.


6/200. 10926번 ??!

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str;
    cin>>str;
    cout<<str<<"??!"<<endl;
    return 0;
}

한번에 맞췄다.

 

cout << str + "??!" << endl; 로도 작성가능


7/200. 18108번 1998년생인 내가 태국에서는 2541년생?!

ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다.

불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

#include <iostream>
using namespace std;

int main()
{
    int year;
    cin>>year;
    cout<<year+543<<endl;
    
    return 0;
}

틀렸습니다.

아 빼야하는구낭 반대로 생각해버렸군

#include <iostream>
using namespace std;

int main()
{
    int year;
    cin>>year;
    cout<<year-543<<endl;
    
    return 0;
}


8/200. 11382 꼬마 정민

꼬마 정민이는 이제 A + B 정도는 쉽게 계산할 수 있다. 이제 A + B + C를 계산할 차례이다!

입력

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 10의 12승)이 공백을 사이에 두고 주어진다.

#include <iostream>
using namespace std;

int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    cout<<a+b+c<<endl;
    return 0;
}

틀렸습니다.

 

백준 11382번 문제의 범위가 0 ≤ A, B, C ≤ 10¹²라서 int 나 long 자료형은 이 범위를 커버할 수 없기 때문에 **long long**을 사용해야 한다고 한다.   long long은 -10¹⁸ ~ 10¹⁸ 범위의 값을 지원하기 때문에 충분히 큰 숫자를 다룰 수 있음

 

#include <iostream>
using namespace std;

int main()
{
    long long a,b,c;
    cin>>a>>b>>c;
    cout<<a+b+c<<endl;
    return 0;
}


9/200. 10171 고양이

고양이를 출력한다.

예제 출력 1 

\    /\
 )  ( ')
(  /  )
 \(__)|

 

일단 cout과 공백으로 구현가능할거같다는 생각이 들었다.

c++에서 공백 출력을 어떻게 하는지 구글링해보니 setw가 있다고 한다.

 

참고 https://rh-cp.tistory.com/3

 

(C++) \t, 공백 언제까지 다 치고있을건가요? (setw)

picture from Shutterstock 출력문자들을 정렬하기 위해 공백이나 "\t"를 사용합니다. 하지만 이 작업들은 적지않은 시간을 소요합니다. 이것을 편하게 해주는 명령어로 setw가 있습니다. setw는 cout과 함

rh-cp.tistory.com

 

예시 코드를 토대로 한번 해보자

 

#include <iostream>;
#include <iomanip>;
using namespace std;

int main()
{
    cout<<"\""<<setw(4)<<"/\""<<'\n';
    cout<<setw(1)<<")"<<setw(3)<<"("<<setw(2)<<"')"<<'\n';
    cout<<"("<<setw(3)<<"/"<<setw(3)<<")"<<'\n';
    cout<<setw(1)<<"\(__)|"<<'\n';
    return 0;
}

굉장히 짜치긴 하지만 일단 해봤음 

틀렸습니다

^^ 그럼 그렇지

 

이 문제의 핵심은 역슬래시이다 \는 이스케이프 문자이기 때문에 \\으로 출력해야함

참고로 "는 \"로 출력가능 

#include <iostream>;
using namespace std;

int main()
{
    cout<<"\\    /\\\n";
    cout<<" )  ( ')\n";
    cout<<"(  /  )\n";
    cout<<" \\(__)|\n";
    return 0;
}

이렇게 수정했다. 

setw()를 사용해도 틀리는 건 아니지만, 이 문제에서는 setw()를 사용하지 않고 문자를 정확히 출력하는 것이 정확한 답이다.


10/200. 10172 개

아래 예제와 같이 개를 출력하시오.

|\_/|
|q p|   /}
( 0 )"""\
|"^"`    |
||_/=\\__|

 

#include <iostream>
using namespace std;

int main()
{
    cout<<"|\\_/|"<<'\n';
    cout<<"|q p|   /}"<<'\n';
    cout<<"( 0 )\"\"\"\\"<<'\n';
    cout<<"|\"^\"`    |"<<'\n';
    cout<<"||_/=\\\\__|"<<'\n';
    
    return 0;
}

큰 따옴표와 백슬래시 유의, 고양이 문제 참고해서 풀었음

한번에 맞음

'백준 200제' 카테고리의 다른 글

백준 c++로 문제 풀기(21~30)  (0) 2025.05.06
백준 c++로 문제 풀기 (11~20)  (0) 2025.05.03