"Back to Basic" Overview

chellchell·2020년 8월 19일
0

Basic

목록 보기
11/11
post-thumbnail

1. 다양한 라이브러리와 내장함수에 대한 설명

c++표준라이브러리

c++에서 제공하는 다양한 라이브러리를 설명해놓은 microsoft의 공식 사이트이다. 위의 사이트를 통해 필요로하는 라이브러리를 찾아보고 라이브러리 내 다양한 함수들을 익혀보도록 하자.

iomanip의 fixed,setprecision의 사용

부동소수점 값의 전체 자릿수를 설정한다. fixed가 없는 경우 정수부와 소수부 모두 포함하여 자릿수를 설정한다. fixed가 있는 경우 소수부분만의 자릿수를 설정한다. 또한 버림이 아닌 반올림으로 자릿수를 설정한다.

T5 setprecision(streamsize Prec);

  • Prec: 부동 소수점 값의 전체 자릿수

2. 입력

1. cin

  • iostream 에 존재
  • 표준 입력 버퍼에서 개행문자를 제외한 값을 가져옴
  • 공백, 개행 무시
  • 개행 키보드 버퍼에 남겨둠

2. cin.get()

  • iostream에 존재
  • 표준 입력 버퍼에서 문자를 하나만 가져옴
  • 공백, 개행 포함
  • 문자만 입력 받음

3. cin.getline()

  • iostream에 존재
  • 종결 문자를 NULL로 바꿈, 종결 문자 생략 시 엔터로 간주
  • 최대 입력 가능 문자수보다 많은 문자를 입력한 경우 n 번째 문자부터 NULL로 취급
  • 공백, 개행 입력 받음
  • 문자열만 입력받음

std::cin.getline(char str[], int size)

  • char str[] : 문자열을 저장할 char 배열명
  • int size: 저장할 문자의 최대 개수

4. getline()

  • string에 존재
  • 공백, 개행 입력 받음
  • 문자열 입력받음

std::getline(std c,string str, char deliminator)

  • std c : 파일입력을 받을지 표준입력을 받을지
  • string str : 문자열을 저장할 string형 변수명
  • char deliminator : 입력받은 문자들 중 어떤 문자까지만 저장할지 결정 (default값:'\n')

3. 자료형 범위

각 자료형별 범위이다. 변수 선언 시 범위를 확인하고 그에 대응되는 자료형을 사용하자.

5. 입력의 형태가 정해져있을 때(발상의 전환)

c++은 c언어와 달리 입력의 형태를 정해놓고 입력을 받을 수 없는 듯했다. 예를 들어 c언어에서 h:m:s의 형태로 입력을 받고자 한다면 scanf("%d:%d:%d",&h,&m,&s)로 입력받을 수 있지만 c++에서는 정해진 형태의 입력에 대해서 따로 방법이 없다. 그래서 :와 같은 부분을 tmp라는 별도의 변수에 저장한다. 그러면 cin>>h>>tmp>>m>>tmp>>s 로 입력을 받을 수 있다.

6. cout.width,cout.fill

7. 진수 표현

2,8,16,10진수
더 많은 형태로 숫자를 표현하고 싶다면 위의 링크를 참고하면 좋을 거 같다.

1. 10진수

cout<<dex<<...

  • 접두사 없음

2. 8진수

cout<<oct<<...

  • 접두사 0출력

3. 16진수

cout<<hex<<...

  • 접두사 0X 출력

  • 참고

    cout<<uppercase<<...

    16진수 대문자를 출력

    cout<<nouppercase<<...

    16진수 소문자를 출력

8. p진수 -> q진수로 표현

입력 받을 때 해당 진수의 flag를 설정하고 입력받고 출력하고자 하는 진수의 flag를 사용하여 출력한다.

ex) 8진수에서 10진수로 표현

#include <iostream>
using namespace std;

int main(void) {
	int a;
	cin >> oct >>a;
	cout << dec << a;
}

(참고) 영문자에서 10진수로 변환

영문자에서 10진수로 변환할 때도 위와 비슷하게 하면 된다.

#include <iostream>
using namespace std;
int main(void) {
	char a;
	cin >> a;
	cout << (int) a;
}

9. 비트 연산자

10. 16진수 곱하기

1082 : [기초-종합] 16진수 구구단?
8번의 p진수로 입력받아 q진수로 표현하는 문제의 풀이방식과 비슷하다. 입력이 16진수로 입력되므로 hex flag를 사용하고 출력할 때 역시 hex flag를 다시 선언해준다. 자세한 문제는 위 링크에서 풀어보길 바란다.

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
	int a;
	cin >> hex>>a;
	for (int i = 1; i <16; i++) {
		cout <<uppercase<< hex<<a << '*' << uppercase << hex << i << '=';
		cout << hex << a * i<<endl;
	}
}

11. endl과 '\n'의 시간차이

문제를 푸는 과정에서 endl과 '\n'에 속도차이가 있다는 것을 알게되었다. endl함수는 개행만 해주는 것이 아니라 flush함수를 겸하기 때문에 내부 버퍼를 비워주는 역할도 함께 수행하여 매우 느리다고 한다. c++에서는 endl뿐만 아니라 몇몇 입출력 스타일에서 속도차이가 발생하는 부분이 있다고한다. 그래서 되도록이면 c스타일의 입출력을 사용하도록 하자.

12. 함께 문제 푸는 날 주기성

1092 : [기초-종합] 함께 문제 푸는 날(설명)
어떤 사람이 d일 간격으로 어떤 일을 한다고 가정하자. 그러면 n번째 날 그 일을 하는지 안하는지 알 수 있는 방법은 n을 d로 나눠봄으로써 n일이 d의 배수이면(n%d==0)그 일을 하고 그렇지 않다면(n%d!=0)그 일을 하지 않는다. 위 문제에서는 이러한 주기성을 가지는 사람이 3명이 있는데 그 사람들이 함께 어떤 일을 행하는 날을 찾는것이다. 즉, 모든 사람의 주기로 특정한 날을 나눴을때 모두 나머지가 0이 되는 날(최소공배수)를 구하면되는 것이다. 이를 역으로 하면 어느 한 명이라도 나머지가 0이 아닌 날이 나오면 그 다음날로 넘어간다. 더 자세한 문제설명은 위 링크를 참고하기 바란다.

#include <iostream>
using namespace std;
int main() {
	int a, b, c;
	int day=1;
	cin >> a >> b >> c;
	while (day % a != 0 || day % b != 0 || day % c != 0) {
		day++;
	}
	cout << day << endl;
}

13. 성실한 개미 문제

1099 : [기초-2차원배열] 성실한 개미
기초 100제의 가장 까다로운 문제였다. 이 문제를 봤을 때 가장 먼저 떠오른 것은 stack의 사용과 재귀함수였다. stack을 떠올린 이유는 학교에서 좌표 사이를 움직이는 쥐의 움직임을 출력하는 문제를 푼 기억이 있어서이다. 아쉽게도 나의 코드는 stack을 사용하지 않고 재귀함수만을 사용하였다. 그런데 만약 stack을 사용하였다면 개미가 움직일 수 있는 방향의 좌표를 모두 stack에 저장하며 해당 좌표가 1이면 전 좌표로 돌아가고 그렇지 않다면 먹이를 만날 때까지 재귀적으로 진행하였을 것이다. 아래의 코드도 stack을 이용하지 않았을뿐 개미의 움직임을 재귀적으로 표현하였다. 그런데 여기서 까다로웠던 부분은 오른쪽으로 갈지 아래로 갈지에 대한 판단이었다. 문제에 정확히 설명되어있지 않은 부분 중에 하나가 개미는 우선적으로 오른쪽으로 진행한다는 것이다. 그래서 오른쪽에 장애물이 없다면 오른쪽으로 이동하고 그렇지 않다면 아래로 진행하는 방식으로 재귀함수를 구현하였다. 기초 100제의 가장 마지막 문제이고 재귀함수를 제대로 경험할 수 있는 좋은 문제인 거 같다. 위에 링크를 통해 한 번 풀어보길 권장한다.

#include <iostream>
using namespace std;
int ar[10][10];
int solve(int x, int y) {
	if (ar[x][y] == 2) {
		ar[x][y] = 9;
		return 0;
	}
	else if (ar[x][y])
		return 0;
	else {
		if (ar[x][y + 1] != 1)
			solve(x, y + 1);
		else if(ar[x+1][y]!=1)
			solve(x + 1, y);
		ar[x][y] = 9;
	}
}
int main() {
	int i, j;
	for (i = 0; i < 10; i++) {
		for (j = 0; j < 10; j++) {
			cin >> ar[i][j];//0:갈 수 있는 곳, 1: 벽 또는 장애물, 2:먹이
		}
	}
	solve(1,1);
	for (i = 0; i < 10; i++) {
		for (j = 0; j < 10; j++) {
			cout << ar[i][j] << ' ';//0:갈 수 있는 곳, 1: 벽 또는 장애물, 2:먹이
		}
		cout << "\n";
	}
}
profile
high hopes

0개의 댓글