백준 실전 팁

Updated:

공백을 포함한 string 입력 받기

// 1. scanf 옵션
char a1[10]
scanf("%[^\n]" a1);

// 2. gets 함수(보안상의 이유로 C++14 이상에서는 제거됨) / 비추천
char a2[10];
gets(a2);
puts(a2);

// 3. getline 함수 / 추천
string s;
getline(cin, s); 
cout << s;

cin/cout 사용시 주의사항

std::ios::sync_with_stdio(0); 
// printf(), scanf()가 사용하는 C stream과의 동기화를 끊는 명령어이다. 
// 이 명령어를 통해 시간을 아낄 수 있다.
// 이 명령어를 쓰고 나서 printf와 cout을 섞어서 쓰면 순서가 꼬이게 된다. 
std::cin.tie(0); 
// cin과 cout 명령어를 수행할 때 버퍼를 통해 수행이 되는데 기본적으로 cin명령을 수행하기 전에 cout 버퍼를 비우도록 설정이 되어 있다. 
// 하지만 백준에서는 채점시 출력 글자만 확인하기 때문에 콘솔 창에서 입력 글자와 출력 글자 사이에 순서가 꼬인다고 해도 정답처리가 된다. 
// 그래서 굳이 cin명령을 수행하기 전에 cout버퍼를 비우지 않도록 하기 위해 이 코드를 사용한다. 

// cin/cout 사용시 위의 두 명령어는 반드시 넣어줘야 한다. 

endl

endl은 개행문자를 출력하고 출력 버퍼를 비우라는 명령이다. 저지는 프로그램이 종료될 때 출력이 어떻게 되는지를 가지고 채점을 진행하기 때문에 중간 중간에 버퍼를 비우라는 명령을 할 필요가 없다. 줄바꿈이 필요하면 ‘\n’ 개행문자를 출력하면 된다. 따라서 endl의 사용은 추천되지 않는다.

배열의 전체를 특정한 값을 초기화 시킬 때

int a[21];
int b[21][21];

// 1. cstring 헤더의 memset // 0이나 -1이 아니거나 2차원 이상의 배열을 함수 인자로 넘길 때 오류 발생할 확률 존재 / 비추천
memset(a,0,sizeof a);
memset(b,0,sizeof b);

// 2. for문 // 투박하지만 오류 없음 / 무난
for(int i = 0 ; i < 21 ; i++)
  a[i] = 0;
for(int i = 0 ; i < 21 ; i++)
  for(int j = 0 ; j < 21 ; j++) 
    b[i][j] = 0;

// 3. algorithm 헤더의 fill / 추천
fill(a, a+21, 0);
fill(int i = 0 ; i < 21 ; i++)
  fil(b[i], b[i]+21, 0);

vector

  • 배열할당 필요 없음
  • insert(), erase(), push_back(), pop_back() 등 기능 구현 완료
#include <bits/stdc++.h>
using namespace std;

int main(void) {
  vector<int> v1(3, 5); // {5,5,5};
  cout << v1.size() << '\n'; // 3
  v1.push_back(7); // {5,5,5,7};

  vector<int> v2(2); // {0,0};
  v2.insert(v2.begin()+1, 3); // {0,3,0};

  vector<int> v3 = {1,2,3,4}; // {1,2,3,4}
  v3.erase(v3.begin()+2); // {1,2,4};

  vector<int> v4; // {}
  v4 = v3; // {1,2,4}
  cout << v4[0] << v4[1] << v4[2] << '\n';
  v4.pop_back(); // {1,2}
  v4.clear(); // {}
}

list

#include <bits/stdc++.h>
using namespace std;

int main(void) {
  list<int> L = {1,2}; // 1 2
  list<int>::iterator t = L.begin(); // t는 1을 가리키는 중
  L.push_front(10); // 10 1 2
  cout << *t << '\n'; // t가 가리키는 값 = 1을 출력
  L.push_back(5); // 10 1 2 5
  L.insert(t, 6); // t가 가리키는 곳 앞에 6을 삽입, 10 6 1 2 5
  t++; // t를 1칸 앞으로 전진, 현재 t가 가리키는 값은 2
  t = L.erase(t); // t가 가리키는 값을 제거, 그 다음 원소인 5의 위치를 반환
                  // 10 6 1 5, t가 가리키는 값은 5
  cout << *t << '\n'; // 5
  for(auto i : L) cout << i << ' ';
  cout << '\n';
  for(list<int>::iterator it = L.begin(); it != L.end(); it++)
    cout << *it << ' ';
}

코딩테스트 코드 작성 팁

  • 코딩테스트와 개발은 다르다
    • 어떻게든 타이핑을 줄이는 게 좋다. 조금 더럽더라도 내가 빠르게 짤 수 있는 방식으로 빠르게 구현하는게 훨씬 중요하다.
  • 출력 맨 마지막에 공백 혹은 줄바꿈이 추가로 있어도 괜찮다

출처

Leave a comment