백준 온라인 저지로 프로그래밍 언어와 알고리즘 속성으로 배우기
업데이트:
처음 프로그래밍 언어를 배울 때 ‘어디서부터 시작해야하나?’라는 고민으로 막막해진 경험이 있을것이다. 특히 막 입문하게 된 경우 일단 책 부터 산 후, 한 챕터를 넘기지 못하고 냄비받침으로 전락한 경험도 있을 수 있겠다.
책을 사서 공부한다는 발상은 학교와 학원에서 받았던 기초 교육의 영향이 클것이라고 생각한다. 교재를 사고, 교과서를 받고, 문제집을 사서 공부해왔던 경험이 프로그래밍 공부에서도 책을 사도록 만들었을것이다.
그러나 프로그래밍 언어 서적은 입문자에게 적합하지 않다. 대부분의 서적은 어느정도 궤도에 오른 이들이 부족한 부분을 알아보기 위해 더 적합한 형태를 가지고 있기 때문이다.
내가 무엇을 모르는지도 모르고, 무엇을 알아야하는지, 어떻게 찾아야하는지 조차모르는, 초석을 마련해야하는 입문자에게 더 적합한 배움의 형태는 문제풀이이다.
그리고 우리는 그 문제풀이를 ‘코딩테스트’라고 부른다. 코딩테스트를 할 수 있는 웹사이트는 대표적으로 ‘백준 온라인 저지’와 ‘프로그래머스’가 있다.
이번 포스트에서는 백준 온라인 저지 웹사이트 이용방법을 설명하고자 한다.
백준 온라인 저지
웹사이트 주소는 boj.kr이다. 백준 온라인 저지의 웹사이트 공식 설명은 다음과 같다.
프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.
실제로 해당 사이트는 프로그래밍 언어를 선택 해 코딩테스트를 단계별로 풀어보는 과정을 통해 통해 알고리즘을 배우며 코딩 실력을 키울 수 있고, 해당 프로그래밍 언어를 이해 할 수 있는 학습 기회를 제공한다.
회원가입
백준 온라인 저지는 회원제로 운영되는 웹사이트이기 때문에 회원가입을 해야 한다.
회원가입은 어렵지 않고, 프로그래밍을 배운다면 자주 사용할 웹사이트가 될 테니 웬만해서 회원가입을 해두는 편이 좋을것이다. 물론, 회원가입 후에 회원탈퇴 또한 자유롭게 가능하다.
안내 및 광고 이메일 수신은 선택사항이므로 필요하지 않다면 반드시 선택 해제를 해야한다.
단계별로 풀어보기
회원가입과 로그인을 하고 나면 메인화면으로 돌아올것이다. 웹사이트 자체가 입문자에게 불친절한 구조를 가지고 있어 여기서부터 무엇을 해야할지 감이 오지 않을 수 있다.
추천하는 것은 ‘단계별로 풀어보기’를 선택하는것이다. 문제 탭에 마우스를 올리고, 단계별로 풀어보기를 눌러보자.
각 단계별로 관련한 주제가 주어지고, 어떤 문제가 있는지에 대한 설명과 몇개의 문제가 있는지 분류가 되어있다.
1단계 입출력과 사칙연산을 선택해 시작부터 차근차근 나아가보도록 하자.
단계를 선택하면 풀어볼 수 있는 문제 리스트 들이 나온다. 예시로 리스트의 첫 번째 문제인 “Hello World”를 풀어보도록 하겠다.
문제 풀이 예시
가장 먼저 보이는 것은 시간 제한과 메모리 제한 항목이다. 그러나 낮은 단계에서는 이를 신경쓰지 않아도 좋다.
다음으로는 각각 문제, 입력, 출력 항목이 보일것이다. 각각 문제에 대한 설명, 입력 값, 출력 값에 대한 정보를 알려준다.
예제 입력과 예제 출력은 작성한 알고리즘에 입력되는 값의 예제와 그 입력값에 대한 기댓값을 의미한다.
따라서 문제의 요구사항을 본 다음, 시간 제한과 메모리 제한을 확인한 후, 입력값과 기댓값을 숙지하는 순서로 문제를 읽어나가자.
파란색으로 표시 되어있는 문제 번호 옆의 ‘제출’을 누르면 알고리즘을 작성 할 수 있는 페이지로 이동한다.
답안 제출
이 페이지에서는 언어 선택, 소스코드 공개 여부, 소스 코드 작성란을 볼 수 있다.
백준 온라인 저지는 다양한 프로그래밍 언어를 지원한다. C언어 계열부터 시작해서, 자바, 코틀린, 파이썬, 루비, 스위프트는 물론, BrainF*ck과 아희 언어도 지원한다.
소스 코드 공개 여부는 ‘맞힌 사람’과 ‘채점 현황’리스트 등에서 내가 작성한 코드를 외부에서 열람할 수 있는지 여부를 결정하는 항목이다.
이제 소스 코드 작성란에 답안을 작성 해 제출하도록 하자.
1
2
3
4
5
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
제출 버튼을 누르면 자동으로 ‘내 제출’ 리스트로 넘어가며 체점을 해준다. 조금만 기다리면 답안 제출 결과와 메모리, 시간 등을 확인 할 수 있다.
답안 제출 주의점
치팅은 엄격히 금지하고 있다.
이 때, 치팅이란 자신이 작성하지 않은, 다른 사람의 소스 코드를 그대로 복사해서 가져오는 것을 말한다. 이 행위가 적발 되면 해당 문제에 대한 모든 제출은 삭제되고, 너무 많은 치팅이 발견되면 계정의 모든 제출이 삭제된다.
치팅으로 적발된 유저는 횟수에 따라 이용 제한 처분을 받는다.
- 1회 : 7일 제출 금지
- 2회 : 30일 제출 금지
- 3회 : 2,147,483,647초 제출 금지 (약 68년)
이 외에도 백준의 이용 규칙은 여럿 있으니 꼭 숙지하여 이용에 차질이 없도록 해야 할 것이다.
그래서, 이걸 어떻게 풀어야 하죠?
여기까지 읽었다면 실망스럽고 답답한 기분을 느끼고 있을지도 모르겠다. 프로그래밍에 대해 아는 것은 하나도 없는데, 문제를 푸는 방법만 설명하고 있으니 충분히 그렇게 생각할 수 있을것이다.
지금까지 웹사이트를 사용하는 방법을 소개했으니 여기서부터는 웹사이트를 통해 공부하는 방법을 다뤄보고자 한다.
문제를 풀어보고자 했지만, 전혀 모르겠다고 생각하거나 풀 수 없는 문제라고 생각한다면 구글 검색을 이용해보자.
이 때, 검색 형식은 다음과 같다.
백준 [문제 번호] [프로그래밍 언어 이름]
대부분의 문제 풀이 예시가 위와 같은 형태의 제목으로 구성되어있어 위와 같이 검색하면 정보를 쉽게 찾을 수 있을것이다.
위에서 예시 문제로 풀었던 2557번 문제를 다시 예제로 사용한다면 다음과 같이 검색 할 수 있겠다.
중요한 것은 코드와 풀이를 정독 하여 이해한 다음에 그 코드를 보지 않고 문제를 풀어야 한다.
앞서 설명했듯이 치팅은 엄격하게 금지되어 있고, 우리의 목적 또한 코드 복사가 아니기 때문이다.
정리하며
우리가 지향하고자 하는 목적은 예시 코드를 정독하고 분석해 무엇이 어떤 기능을 하는지를 살핀 후 이해하여 내 것으로 만드는 연습을 하는것이다.
다만 1차적인 목표는 프로그래밍 언어를 익히는 것이고, 2차적인 목표는 ‘프로그래밍’을 익히는 것이니 외워야 하는 패턴(고유 형태, 알고리즘 등)은 외우고, 내 코드를 만들어야 하는 부분은 이해한 내용을 풀어내는 능력을 길러내야 한다.
1
console.log("Hello, World!");
1
2
3
4
5
class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
};
위 세 코드는 각각 자바스크립트(JavaScript, JS), 자바(Java), C++(CPP) 언어로 Hello, World!를 출력하는 프로그램을 작성 한 것이다.
세 코드 모두 같은 기능을 하는 프로그램임에도 언어가 달라 모두 다른 형태를 가지고 있는 것을 볼 수 있을것이다.
이처럼 프로그래밍 언어를 익히기 위해서는 언어가 가진 고유한 형식과 함수(입출력문, 분기문, 반복문 등)을 숙지하고 있어야 하며, 프로그램을 작성하는것은 이 구조를 이해하거나 숙지 한 다음이어야 한다.
하나의 코딩 문제를 가지고, 그 문제의 여러 개 예제를 보며 연습하게 되면 그 언어의 고유 형식과, 정석적인 풀이, 특이한 풀이 모두를 볼 기회가 생기게 된다. 많은 코드를 보고, 분석하고, 이해하여 내 것으로 만들게 되면 어느순간 그 언어를 다룰 수 있게 된 자신을 볼 수 있게 될 것이다.
처음 프로그래밍 언어를 다룬다면 “Hello World!”코드 예제를 찾아보고, 프로그래밍 언어에 대한 기초문법을 함께 찾아보자. 그리고 그 후에 문제풀이를 차근차근 시작해보면 된다. 출력문, 입력문, 분기분, 반복문 순서로 배우는 것이 좋고, 그 후에는 언어마다 다르게 할 수 있다.
백준 단계별로 풀어보기 기준으로 13단계 : 정렬까지 풀게되면 그 언어의 기본은 할 수 있게 되었다고 생각해도 좋다.
13단계까지 풀었다면, 다시 1단계로 돌아가 복습해보자. 이번에는 예제 코드 검색 없이 순수하게 자신의 실력으로만 풀어보고, 막히게 된다면 예제를 검색하는 게 아니라 막힌 부분만 검색해보도록 하자.
여기까지 마쳤다면 이제 당신은 강의나 서적과 함께 그 언어만의 추가적인 세부 기능들, 혹은 다른것들을 공부할 준비가 된 것이다.
그리고 만약 컴퓨터공학 전공생이라면, 그리고 4월 안에 이 모든 과정을 마쳤다면, 프로그래밍 과목만큼은 완벽한 준비가 되었을것이다.