프로그래밍 언어/PS를 위한 C++

[PS를 위한 C++] 1. PS란?

nageune 2023. 9. 30. 15:09
728x90
반응형

1. PS란?

C++을 알아보기 전에 먼저 PS가 무엇인지부터 알아봅시다.

PS란 Problem Solving의 약자로, 제한된 시간과 메모리 내에 주어진 문제를 해결하는 코드를 작성하는 행위를 일컫는 말입니다. 프로그래밍 대회나 기업의 코딩테스트는 모두 PS에 속한다고 볼 수 있습니다.

자세히 파고들면, 프로그래밍 대회의 경우 더 많은 문제를 더 빠르게 해결할수록 높은 순위를 차지하게 됩니다. 이를 Competitive Programming이라고 하며 줄여서 CP라고 합니다.

 

2. 어떤 언어를 쓰나요?

보통 언어로 C/C++을 주로 사용합니다. 타 언어에 비해 실행시간이 짧다는 장점이 있고, STL을 위해 C++을 많이 사용합니다. C++은 객체지향언어의 대표적인 언어지만, 사실 객체 지향의 특성을 살려 코딩하는 경우는 거의 없습니다. 클래스를 사용해 객체지향적인 코드를 작성하는건 좋은 습관이지만, 제한된 시간 안에 빠르게 문제를 풀어야하는 PS 분야에선 필요없는 과정입니다. 저도 C++을 사용합니다.

 

3. PS를 잘하려면 어떤 능력이 필요한가요?

PS는 코드를 작성해서 문제를 푸는 행위입니다. 이를 쪼개면 (코드를 작성해서 / 문제를 푸는 행위) 입니다. 즉, 내가 원하는 대로 코드를 작성할 수 있는 구현 능력과 문제를 푸는데 필요한 문제 해결 능력이 필요합니다. 이 능력을 보기 위해 기업에서 코딩테스트를 하는 것과도 같지요.

1) 구현 능력

구현은 자신이 원하는 대로 작동하는 코드를 행위입니다. 아무리 열심히 종이에 적어서 문제를 해결할 수 있더라도 코드로 변환하지 못하면 아무 의미가 없습니다.

 

2) 문제 해결 능력

문제 해결 능력은 주어진 문제의 답을 도출해내는 방법을 찾는 능력입니다. 이를 위해선 자료구조, 알고리즘, 수학 지식 뿐 아니라 "직관"도 중요합니다. 이런 능력은 스스로 기르지 않으면 성장하기 어렵습니다.

 

4. 문제는 어디서 풀죠?

백준 온라인 저지(BOJ)

국내에서 가장 인기가 많고 문제도 많으며 가장 활성화된 사이트입니다. 대부분의 사람들이 여기서 PS를 시작하죠. 백준 온라인 저지(이하 백준)는 현재(2023.9.29.)를 기준으로 약 3만개의 문제가 업로드되어 있습니다. 그리고 solved.ac 와 연계해 문제들의 난이도를 티어로 보여줍니다.

 

문제집 탭에서 다른 사람들이 만들어 놓은 문제 모음을 풀어볼 수 있습니다. C++을 처음 접한다면 C++ 배우기 시리즈를 추천합니다.

 

프로그래머스(Programmers)

프로그래머스는 기업의 코딩테스트 문제를 모아놓은 사이트입니다. 대회나 PS에 관심없고 오직 코딩테스트만을 위해 공부하시는 분이라면 프로그래머스에서 문제를 푸는 것도 추천합니다. 난이도를 레벨로 구분해서 자신에게 맞는 난이도의 문제를 풀어볼 수 있습니다.

 

코드포스(Codeforces)

백준과는 결이 많이 다릅니다. 앞서 말한 CP를 위한 사이트로 주 1~2회 이상 대회가 열립니다. 러시아 사이트이고 영어권 사용자들이 많은 사이트라 영어와 러시아어를 지원합니다. 대회 한 번에 몇만 단위의 사람이 참가하기에 실력 지표에 굉장히 공신력이 있는 메이저 사이트입니다.

 

AtCoder

AtCoder는 코드포스와 비슷합니다. 일본 사이트로 영어와 일본어를 지원합니다. 대체적으로 코드포스보다 문제가 깔끔하다는 평이 많습니다.

 

5. 문제는 어떻게 푸나요?

  1. 문제를 읽고, 풀이를 생각합니다.
  2. 생각한 풀이가 정말로 요구하는 바를 충족하는지 검증합니다.
  3. 생각한 풀이가 시간/메모리 제한에 초과되지 않는지 검증합니다.
  4. 프로그래밍 언어로 구현하고 제출합니다.

개인적인 생각이지만, 문제에 대해 고민하는 시간은 30분이면 충분합니다. 30분 안에 답을 생각해내지 못한다면 1시간, 2시간 잡고 있어도 못떠올릴 확률이 높습니다. 이런 경우 30분 더 봤을 때 풀 수 있을 것 같다면 더 풀어보고, 아니면 답을 검색해서 풀이를 보고 어떻게 풀었는지 배웁니다. 스스로 코드를 작성해서 풀어봅니다. 못하겠으면 다른 사람의 코드를 봅니다.(풀이와 코드는 다릅니다.) 나중에는 이런 습관이 좋지 않을 수 있지만, 처음 배우는 입장일 때는 빠르게 성장하는 밑거름이 됩니다.

 

처음 배울 때 쉬운 문제를 푸는 것은 큰 도움이 됩니다. 하지만 쉬운 문제만 푸는 것은 구현 능력을 키우는 데는 도움이 될지 몰라도 문제 해결 능력 향상에는 도움되지 않습니다.

많은 문제를 푸는 것도 좋지만, 질 좋은 문제를 푸는 것이 실력 상승에 도움됩니다.

무엇보다 꾸준히 하는 것이 가장 중요합니다. 이건 solved.ac의 개인 프로필에서 매일 1문제 이상씩 풀어야 채워지는 스트릭을 이어보시면 좋을 것 같습니다.


 

728x90
반응형