728x90

백준 단계별로 풀어보기

 

단계별로 풀어보기

단계별은 @jh05013님이 관리하고 계십니다. 단계제목설명정보총 문제내가 맞은 문제1입출력과 사칙연산입력, 출력과 사칙연산을 연습해 봅시다. Hello World!112if문if문을 사용해 봅시다.53for문for문을

www.acmicpc.net


1. 입출력과 사칙연산

10869. 사칙연산


이미지를 클릭하시면 문제 페이지로 이동합니다.

순서대로 단계별을 풀어 오셨으면 어려울 것은 없지만, 

2가지 정도 주의 깊게 볼만한(틀릴만한) 부분이 있는 것 같네요.

 

1. A/B (몫) 

  • 이게 뭐 어쨌다고? 싶을 수 있지만, c++ 과 파이썬에서 미묘하게 다른 부분입니다. 
  • 문제에서는 '몫' 이라는 자연수를 요구한다는 사실을 유의해서 풀어보세요.
  • 풀어보시고, 모르겠으면 아래의 언어별 풀이를 봐주세요.

 

2. % ?

새로 등장한 기호가 있습니다. '%' 인데요.

  • 나머지 연산이라는 의미로, '모듈러' 연산 혹은 기호 라고도 합니다. 
  • a % b = a를 b로 나눈 나머지를 구하라.
  • +, -, *, / 와 같이 %도 그대로 써 주시면 됩니다. 이제 C++의 산술 연산자는 모두 배웠네요.

 

c++과 파이썬의 연산자에 대해 더 알고 싶은 분들은 아래의 링크를 참고 해 주세요. (추가 예정)

 


C++

c++의 경우 int형 자연수를 / 로 나눌 경우 int형으로 결과가 반환됩니다.
문제에서 자연수만 input으로 들어온다고 했으니, 그대로 int로 받은 후 사용하시면 됩니다.

 

최종 코드

#include <iostream>

int main(){
    int a, b;
    std::cin >> a >> b;
    
    std::cout << a+b << "\n";
    std::cout << a-b << "\n";
    std::cout << a*b << "\n";
    std::cout << a/b << "\n";
    std::cout << a%b << "\n";

}

 


Python

파이썬의 경우, c++처럼 냅다 /를 써버리면 안 됩니다.

파이썬에서는 '나누기' 연산과 '몫' 연산이 분리되어 있습니다.

 

' / ' 연산자

  • 나누기 연산입니다.
  • int를 사용한다고 해도 실수형으로 결과가 반환됩니다.
  • 만약 이 기호를 사용했다면, 결과값을 int로 형 변환하는 과정이 필요합니다.

 

' // ' 연산자

  • c++에는 존재하지 않는 기호임을 유의하세요.
  • '몫' 을 구하는 연산으로 항상 자연수가 반환됩니다. 이 문제에서 원하는 연산자는 아마도 이 연산자겠죠.

 

최종 코드

a, b = map(int,input().split())

print(a+b)
print(a-b)
print(a*b)
print(a//b)
print(a%b)

아래와 같이 print를 한 번만 호출하면 더 좋겠죠.

a, b = map(int,input().split())

print(a+b,a-b,a*b,a//b,a%b,sep='\n')

 

 

728x90
728x90

백준 단계별로 풀어보기

 

단계별로 풀어보기

단계별은 @jh05013님이 관리하고 계십니다. 단계제목설명정보총 문제내가 맞은 문제1입출력과 사칙연산입력, 출력과 사칙연산을 연습해 봅시다. Hello World!112if문if문을 사용해 봅시다.53for문for문을

www.acmicpc.net


1. 입출력과 사칙연산

1008. A/B


이미지를 클릭하면 해당 문제 페이지로 이동합니다.

 

만약 입출력 방식에 익숙하지 않으신 분들은 아래의 글을 참고 해 주세요.

 

C++ 기본 입출력

 

[C++] 기본 입출력 ( cin | cout | scanf | printf )

기본 입출력 함수 헤더 파일 #include 위의 헤더파일을 반드시 추가해야 사용 가능합니다. cin,cout 모두 std 네임스페이스 내에 존재합니다. 참고로 아래의 코드를 추가하면 std:: 를 붙이지 않고도 사

where-i-am.tistory.com

 

python 기본 입출력

 

[Python] 기본 입출력 ( input | split | map | sys.stdin.readline | print )

기본 입력 함수 input() 가장 기본적인 입력 함수입니다. 개행 문자 이전까지의 1 line을 읽어옵니다. str = input() #input : hello print(str) # output : hello 특별히 형식을 정해주지 않으면 string 형식으로..

where-i-am.tistory.com

 

 

'%' 문자를 나눗셈 연산자로 착각하기 쉬운데 키보드의 ? 키의 '/' 임을 유의하세요.

 

만약 파이썬으로 풀고 계시다면 이건 뭔가 더 붙어 있네... 하는 정도로 가볍게 넘어가실 수 있지만,

c++로 풀고계시다면 처음으로 약간 혼돈이 올 수 있을 것 같네요. 

여기서 주목해야 할 부분은 출력값의 절대오차 혹은 상대오차가 10^-9이하여야 한다는 부분입니다. 

 


C++

먼저, c++의 데이터 타입 및 범위가 생소하다면 아래의 문서를 참고 해 주세요.

 

[C++] 데이터 형식 | 크기 | 범위 ( Data type | size | range )

출처: Data Type Ranges Learn more about: Data Type Ranges docs.microsoft.com Visual Studio 2019 기준 유형 이름 크기 (byte) 기타 이름 값의 범위 int 4 signed –2,147,483,648 ~ 2,147,483,647 unsigned..

where-i-am.tistory.com

 

c++로 이 문제를 풀 때 자주 빠트리는 지점은 2가지입니다.

  1. 변수 타입을 실수형으로 사용했는지
    • 여지껏 int만 주구장창 썼기 때문에 관성적으로 int를 사용할 가능성.
    • 여기서는 10^-9 이하의 오차만 허용하기에, 최대 소수점 9자리만 지원하는 float를 사용하시면 안됩니다.
    • 최대 소수점 15자리까지 지원하는 double 형을 사용해야 합니다. 
  2. 소수점 표현 범위를 제대로 지정했는지
    • 아래의 코드를 봅시다. 결과가 어떻게 나올까요?
      #include <iostream>
      
      int main() {
      
          double a = 1;
          double b = 3;
          std::cout << a/b;
      
      }

      1008번 문제의 예시처럼 0.33333333333333333.. 이 나올 거라고 생각하기 쉽지만,
      결과는 0.333333 입니다. 이러면 오차가 10^-9 보다 커지게 됩니다.
    • 이렇게 출력되는 이유는 c++ 에서 기본적으로 소수점 출력 범위가 6자리 디폴트로 설정되어 있기 때문입니다.
    • c++ 소수점 자리수 설정 코드는 아래와 같습니다. 
      std::cout.precision(10);	//괄호 안에 출력하고 싶은 소수점 자리수를 입력합니다.  ​

 

최종 코드

#include <iostream>

int main(){
    double a, b;
    
    std::cin >> a >> b;
    std::cout.precision(10);	// 15까지 해도 됩니다. 10자리부터 정답이 나옵니다.
    std::cout << a/b ;
}

 


Python

python의 경우에는 사실상 다 알아서 해주고 소수점 자리수도 길~게 출력 해 주기 때문에 그냥 하시면 됩니다. (..)

언젠가 다시 다루겠지만 이렇게 숫자나 문자를 다루는 문제에서는 파이썬을 활용하는 게 훨씬 간편한 경우가 많습니다. ( 코테에서 )

 

최종 코드

a, b = map(int,input().split())
print(a/b)
728x90
728x90

 


출처:

 

Data Type Ranges

Learn more about: Data Type Ranges

docs.microsoft.com

 

 

Visual Studio 2019 기준

 

유형 이름 크기
(byte)
기타 이름 값의 범위
int 4 signed –2,147,483,648 ~ 2,147,483,647
unsigned int 4 unsigned 0 ~ 4,294,967,295
__int8 1 char -128 ~ 127
unsigned __int8 1 unsigned char 0 ~ 255
__int16 2 short
short int 
signed short int
–32,768 ~ 32,767
unsigned __int16 2 unsigned short 
unsigned short int
0 ~ 65,535
__int32 4 signed, 
signed int, 
int
–2,147,483,648 ~ 2,147,483,647
unsigned __int32 4 unsigned 
unsigned int
0 ~ 4,294,967,295
__int64 8 long long
signed long long
–9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
unsigned __int64 8 unsigned long long 0 ~ 18,446,744,073,709,551,615
bool 1 없음 false or true
char 1 없음 기본적으로-128 ~ 127

(/J로 컴파일한 경우 0에서 255) 
signed char 1 없음 -128 ~ 127
unsigned char 1 없음 0 ~ 255
short 2 short int
signed short int
–32,768 ~ 32,767
unsigned short 2 unsigned short int 0 ~ 65,535
long 4 long int 
signed long int
–2,147,483,648 ~ 2,147,483,647
unsigned long 4 unsigned long int 0 ~ 4,294,967,295
long long 8 없음 (__int64 와 동일 ) –9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
unsigned long long 8 없음
(unsigned __int64와 동일)
0 ~ 18,446,744,073,709,551,615
enum 다름 없음  
float 4 없음 3.4E±38(7개의 자릿수)*
double 8 없음 1.7E±308(15개의 자릿수)*
long double double과 동일 없음 double과 동일
wchar_t 2 __wchar_t 0 ~ 65,535

 

signed  VS  unsigned

  • signed : 부호가 있는
  • unsigned : 부호가 없는 (양수만 표현)

 

지수 표기법

    n E M = n * 10^M 

  • float 와 double의 범위를 보면 숫자가 특이하게 표현되어 있는 것을 볼 수 있습니다.
  • 이는 컴퓨터에서 아주 크거나 작은 수를  표기하는 방식입니다.
  • float의 경우에만 간단히 바꾸어 보자면 아래와 같습니다.
    ->              3.4E±38 = 3.4*10^-38 ~ 3.4*10^38

 

float VS double

  • float와 double 모두 실수를 표현하는 데이터 타입이지만 float가 double 보다 큰 수를 표현 할 수 있는 것을 볼 수 있습니다.
  • 하지만 그만큼 오차가 많으니 더 많은 소수점 자리수를 표현할 수 있는 double의 사용을 권장하고 있습니다.

 

 

 

728x90
728x90

백준 단계별로 풀어보기

 

단계별로 풀어보기

단계별은 @jh05013님이 관리하고 계십니다. 단계제목설명정보총 문제내가 맞은 문제1입출력과 사칙연산입력, 출력과 사칙연산을 연습해 봅시다. Hello World!112if문if문을 사용해 봅시다.53for문for문을

www.acmicpc.net


1. 입출력과 사칙연산

10998. AxB

이미지를 클릭하면 해당 문제 페이지로 이동합니다.


입력을 받아서 변수에 저장한 후 연산 및 출력하는 방법을 배우는 문제입니다.

 

입출력 방식에 익숙하지 않으신 분들은 아래의 글을 참고 해 주세요.

 

C++ 기본 입출력

 

[C++] 기본 입출력 ( cin | cout | scanf | printf )

기본 입출력 함수 헤더 파일 #include 위의 헤더파일을 반드시 추가해야 사용 가능합니다. cin,cout 모두 std 네임스페이스 내에 존재합니다. 참고로 아래의 코드를 추가하면 std:: 를 붙이지 않고도 사

where-i-am.tistory.com

 

python 기본 입출력

 

[Python] 기본 입출력 ( input | split | map | sys.stdin.readline | print )

기본 입력 함수 input() 가장 기본적인 입력 함수입니다. 개행 문자 이전까지의 1 line을 읽어옵니다. str = input() #input : hello print(str) # output : hello 특별히 형식을 정해주지 않으면 string 형식으로..

where-i-am.tistory.com

 

 

'x' 문자를 곱셈 연산자로 착각하기 쉬운데 키보드의 숫자 8 위의 '*' 임을 유의하세요.

 

C++

 

#include <iostream>

int main(){
	int a, b;	//변수 선언
    
	std::cin >> a >> b;	//입력
	std::cout << a*b;	//출력
}

 


 

Python

 

a, b = map(int, input.split())
print(a*b)

 

 

728x90
728x90

백준 단계별로 풀어보기

 

단계별로 풀어보기

단계별은 @jh05013님이 관리하고 계십니다. 단계제목설명정보총 문제내가 맞은 문제1입출력과 사칙연산입력, 출력과 사칙연산을 연습해 봅시다. Hello World!112if문if문을 사용해 봅시다.53for문for문을

www.acmicpc.net


1. 입출력과 사칙연산

1001. A-B

이미지를 클릭하면 해당 문제 페이지로 이동합니다.


 

입력을 받아서 변수에 저장한 후 연산 및 출력하는 방법을 배우는 문제입니다.

 

입출력 방식에 익숙하지 않으신 분들은 아래의 글을 참고 해 주세요.

 

C++ 기본 입출력

 

[C++] 기본 입출력 ( cin | cout | scanf | printf )

기본 입출력 함수 헤더 파일 #include 위의 헤더파일을 반드시 추가해야 사용 가능합니다. cin,cout 모두 std 네임스페이스 내에 존재합니다. 참고로 아래의 코드를 추가하면 std:: 를 붙이지 않고도 사

where-i-am.tistory.com

 

python 기본 입출력

 

[Python] 기본 입출력 ( input | split | map | sys.stdin.readline | print )

기본 입력 함수 input() 가장 기본적인 입력 함수입니다. 개행 문자 이전까지의 1 line을 읽어옵니다. str = input() #input : hello print(str) # output : hello 특별히 형식을 정해주지 않으면 string 형식으로..

where-i-am.tistory.com

 

 


 

C++

 

#include <iostream>

int main(){
	int a, b;	//변수 선언
    
	std::cin >> a >> b;	//입력
	std::cout << a-b;	//출력
}

 


 

Python

 

a, b = map(int, input.split())
print(a-b)

 

 

 

 

728x90
728x90

백준 단계별로 풀어보기

 

단계별로 풀어보기

단계별은 @jh05013님이 관리하고 계십니다. 단계제목설명정보총 문제내가 맞은 문제1입출력과 사칙연산입력, 출력과 사칙연산을 연습해 봅시다. Hello World!112if문if문을 사용해 봅시다.53for문for문을

www.acmicpc.net


1. 입출력과 사칙연산

1000. A+B

이미지를 클릭하면 해당 문제 페이지로 이동합니다.


처음으로 입력을 받아서 처리해야 하는 순간이 왔습니다.

입력을 받아서 변수에 저장하는 방법을 배우는 문제입니다.

 

입출력 방식에 익숙하지 않으신 분들은 아래의 글을 참고 해 주세요.

 

C++ 기본 입출력

 

[C++] 기본 입출력 ( cin | cout | scanf | printf )

기본 입출력 함수 헤더 파일 #include 위의 헤더파일을 반드시 추가해야 사용 가능합니다. cin,cout 모두 std 네임스페이스 내에 존재합니다. 참고로 아래의 코드를 추가하면 std:: 를 붙이지 않고도 사

where-i-am.tistory.com

 

python 기본 입출력

 

[Python] 기본 입출력 ( input | split | map | sys.stdin.readline | print )

기본 입력 함수 input() 가장 기본적인 입력 함수입니다. 개행 문자 이전까지의 1 line을 읽어옵니다. str = input() #input : hello print(str) # output : hello 특별히 형식을 정해주지 않으면 string 형식으로..

where-i-am.tistory.com

 

 


 

C++

 

#include <iostream>

int main(){
	int a, b;	//변수 선언
    
	std::cin >> a >> b;	//입력
	std::cout << a+b;	//출력
}

 


 

Python

 

a, b = map(int, input.split())
print(a+b)

 

 

728x90
728x90


기본 입출력 함수


헤더 파일

#include <iostream>
  • 위의 헤더파일을 반드시 추가해야 사용 가능합니다.
  • cin,cout 모두 std 네임스페이스 내에 존재합니다.

 

 

참고로 아래의 코드를 추가하면 std:: 를 붙이지 않고도 사용할 수 있습니다.

 

 

1.전체 네임스페이스를 std로 선언하는 방식.

이는 추후에 문제가 생길 수 있는 방식이니 초반에만 사용하도록 합니다.

using namespace std;​

 

2. cin,cout에 대해서만 네임스페이스를 지정해주는 방식

이 방식이 좀 더 권장되는 방식입니다. 

(사실 귀찮아서.. 저는 1번도 자주 사용합니다.) 

using std::cin;
using std::cout;

 


std::cin 

 

#include <iostream>	

int main(){
	int num;	//변수 선언
	std::cin >> num;	//변수 입력
}
  • 가장 기본적인 cin의 활용 방식입니다.
  • 백준 저지의 경우라면 입력으로 보여주는 숫자들이 프로그램 흐름상 차례로 변수에 입력되게 됩니다.
  • >> 의 방향에 유의하도록 합시다. 저는 변수에게 집어넣는다고 연상해서 외웠습니다.

std::cout

#include <iostream>

int main(){
	int num;	//변수 선언
	std::cin >> num;	//변수 입력
	std::cout << num;	//변수 출력
}
  • 앞서 cin으로 값을 입력받은 num 변수를 출력하는 모습입니다.
  • cin과 화살표 방향이 반대임을 꼭 유의하도록 합니다.

 

 

-여러개의 변수를 한꺼번에 입출력 시

std::cin >> a >> b;
std::cout << a << b;
    •  너무 횟수가 늘어나는 경우에는 당연히 반복문 등을 활용하도록 합니다.

 

 

 


 

시간 제한 환경에서의 빠른 입출력


 

  • 무턱대고 cin과 cout을 쓰다 보면, 백준 저지등에서 시간초과가 날 수 있습니다. 속도가 아주 느리거든요.
  • 속도가 느린 이유는 저도 자세히는 설명이 어렵지만(잘 모름), 대체로 2가지로 추려볼 수 있습니다.
    1. 타 언어(C나 Java등)와 달리 입출력하는 데이터의 형식을 지정하지 않습니다.(데이터가 int인지, string인지..) 아주 편리하죠.
    2. iostream이 cstdio와 동일한 버퍼 시스템을 사용하기 때문에. (잘 이해가 되지 않으나 printf, scanf등을 모두 호출한다고 함)
  • 그런데, 느리다고 해서 나쁜 걸까?
    • 그렇지는 않습니다. 아래의 방식들은 시간 제한이 있는 코딩테스트 등의 특수한 상황에서의 대처법일 뿐입니다.
    • cin, cout이 나중에 나온 언어이니 만큼 안정성, 확장성 등에서는 더 뛰어나다고 합니다. 

 

 

1.  C의 입출력 사용하기

 

헤더파일

 

#include <stdio.h>	//C의 방식
#include <cstdio>	//C++의 방식
  • stdio.h와 cstdio는 namespace가 다르다곤 하지만.. 다들 취향껏 사용하시는 듯 하니 골라서 쓰시면 됩니다.

 

 

scanf

 

#include <cstdio>

int main()
{
	int num;
	scanf("%d",&num);	//입력
}
  • %d란 무엇일까요?  cin과 달리 printf는 입력받는 데이터의 형식을 지정해 주어야 합니다. 
  • 바로 그 데이터의 형식을 알려주는 문자를 형식지정자 라고 합니다. 
    • 형식지정자에 관해서는 아래의 페이지를 참고 해 주세요! (추가 예정)

 

  • 그렇다면 입력 받는 변수 앞에 &를 붙이는 이유는 무엇일까요? (참고로 &는 코딩 초기에 자주 까먹습니다. 유의하세요.)
  • C에서 포인터를 배웠다면 아시겠지만.. &를 변수 앞에 붙여주면 변수의 메모리 주소라는 의미입니다.
  • 여기서는 num의 메모리 주소로 가서 입력받은 int 데이터를 입력하라는 뜻으로 보면 되겠죠.

 

  • 한번에 여러개의 입력을 받을 때는 아래처럼 사용하면 됩니다.
scanf("%d %d %d",&a,&b,&c);

 


printf

 

#include <cstdio>

int main()
{
	int num;
	scanf("%d",&num);
	printf("%d",num);	//출력
}
  • scanf와 거의 동일한 모양입니다. 다만 변수 앞에 &가 붙지 않음을 유의하세요.
  • scanf와 달리 문자열과 함께 사용할 수 있습니다. 아래와 같습니다.
printf("%d 더하기 %d 는 %d 입니다.\n",a,b,a+b);

 


 

2.  버퍼 동기화 끊기 + untie 

 

버퍼 동기화 끊기

ios_base::sync_with_stdio(false);
  • 앞서 말한 cstdio와 iostream의 버퍼 동기화를 끊어줍니다.
  • 메인 함수 안, 가장 윗줄에 추가하여 사용합니다.
  • 다만, 이걸 사용한 경우에 cin,cout을 사용하면서 printf,scanf를 동시에 사용하는 것은 불가능하니 유의합시다.

 

untie

cin.tie(NULL);
  • cin과 cout의 tie를 풀어줌으로써 속도를 향샹시키는 방식입니다.
    • cin과 cout의 tie의 의미 : 서로의 IO작업 전에 자동으로 버퍼를 비웁니다.
  • 따라서 이 코드를 사용한 경우에는 수동으로 버퍼를 비워줘야 합니다. (대체로 코딩테스트에서는 잘 없음)
  • 마찬가지로 메인 함수 안, 가장 윗줄에 추가하여 사용합니다.

 

 

저는 개인적으로 애초에 아래의 형식을 기본으로 두고 사용하는 편입니다. (대체로 백준에서는 문제 없었음)

#include <iostream>

using namespace std;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
    
	/*
	TODO
	*/

}

 

728x90
728x90

백준 단계별로 풀어보기

 

단계별로 풀어보기

단계별은 @jh05013님이 관리하고 계십니다. 단계제목설명정보총 문제내가 맞은 문제1입출력과 사칙연산입력, 출력과 사칙연산을 연습해 봅시다. Hello World!112if문if문을 사용해 봅시다.53for문for문을

www.acmicpc.net


1. 입출력과 사칙연산

10172. 개

이미지를 클릭하면 문제 페이지로 이동합니다.


바로 이전 문제인 10171.고양이(클릭)를 풀었다면, 동일한 방법으로 쉽게 해결 할 수 있습니다. 

풀다가 막히는 부분이 있다면, 위 글을 참고 해 보시면 됩니다.

 

 


C++

출력해야 하는 문자열은 아래와 같습니다.

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

 

여기에서 이스케이프 시퀀스로 출력해야 하는 부분만 강조 해 보겠습니다.

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

 

해당하는 문자만 이스케이프 시퀀스로 바꾼 결과입니다.

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

 

 

최종 코드

#include <iostream>

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

 


Python

python의 경우에도 동일하게 처리 해 주시면 됩니다. 

 

최종 코드

print('|\\_/|')
print('|q p|   /}')
print('( 0 )\"\"\"\\')
print('|\"^\"`    |')
print('||_/=\\\\__|')
  • python에서는 문자열에도 ' (작은 따옴표)를 사용할 수 있으니 대체하셔도 됩니다.
728x90

+ Recent posts