Baekjoon OJ
1. 개요
2010년 최백준(ID: baekjoon)에 의해 개설된 알고리즘 트레이닝 사이트.
우리나라의 정보과학 알고리즘 트레이닝 사이트 중 하나이다. 가장 큰 특징으로는 문제가 '''아주''' 많으며[6] C, Java, Python 등의 유명한 프로그래밍 언어는 물론 BrainF**k, Whitespace, 아희 등의 마이너 언어들까지[7] 지원한다는 것이다. 또한 여러 대회의 기출 문제들까지 정리되어 있어 한국정보올림피아드를 준비하거나 알고리즘을 공부하는 프로그래머들에게 많은 도움이 된다.
게시판, 문제집, 그룹, 블로그 등 다양한 기능들이 개발되어 있어 많은 유저들이 애용한다.
문제 번호와 난이도는 관련이 없으므로 주의해야 한다. 특히 초심자가 문제 순서대로 풀 경우, 습격자 초라기[8][9] 라는 벽에 부딪히게 된다.
2016년 11월 11일에는 빼빼로데이 기념으로 빼빼로데이라는 문제에서 그 문제를 11월 11일에 해결하면 빼빼로를 모두에게 주었다. [10]
2018년 9월 3일에는 채점 수 1000만 돌파 기념으로 아이디 변경 이벤트를 진행했다.
noj.am , boj.kr, icpc.me, sundaycoding.co.kr 로도 접속할 수 있다.
2. 채점 결과
- 기다리는 중: 채점이 밀려서 아직 채점이 되지 않은 경우.
- 재채점을 기다리는 중: 재채점을 기다리는 중인 경우.
- 컴파일 중: 컴파일 하는 중인 경우.
- 채점 중: 채점을 하는 중인 경우.
- 맞았습니다!! (AC [11] ): 제출한 프로그램이 모든 테스트 케이스를 통과했을 경우.
- 맞았습니다!!: 서브태스크, 부분 점수, 전체 채점 문제에서 만점보다 낮은 점수를 받은 경우. 다만 부분 점수 및 전체 채점에서 총점보다 낮은 점수로 맞았습니다!!를 받을 수도 있는데, 이때의 기준은 문제 하단에 적혀 있다.
- 틀렸습니다 (WA [12] ): 출력 결과가 정답과 다른 경우. 테스트 케이스들 중 하나라도 답을 바르게 출력하지 못하면 틀렸습니다를 받는다.[13]
- 컴파일 에러 (CE [14] ): 컴파일 하지 못한 경우. Warning Message는 에러 메시지가 아니다. 채점 결과를 클릭하면 컴파일 에러 메시지를 볼 수 있다.
- 시간 초과 (TLE [15] ): 프로그램이 제한된 시간 이내에 끝나지 않은 경우. 제한 시간을 초과하게 되면 즉시 실행을 종료하므로, 출력 결과가 정답인지는 알 수 없다.
- 런타임 에러 (RE [16] ): 실행 도중에 'segmentation fault', 'floating point exception', 'used forbidden functions', 'tried to access forbidden memories' 등의 에러가 발생하여 프로그램이 종료된 경우.
- 메모리 초과 (MLE [17] ): 프로그램이 허용된 메모리보다 많은 메모리를 사용했을 경우. 시간 초과와 같은 이유로 출력 결과가 정답인지 알 수 없다.
- 출력 형식이 잘못되었습니다 (PE [18] ): 출력 결과가 정답과 유사하나, 공백, 빈 줄과 같은 문제로 인해서 출력 결과가 일치하지 않는 경우.[19][20][21]
- 출력 초과 (OLE [22] ): 너무 많은 출력이 발생하는 경우. 프로그램이 무한 루프에 빠졌을 때나 디버깅용 출력을 제거하지 않고 제출했을 때 주로 발생한다. 출력 제한은 미리 구해놓은 정답 파일의 약 2배이며, 출력하는 바이트 수가 2*(정답의 바이트 수)+1024를 넘어가면 이 결과를 받게 된다.
- 채점 불가 (UA [23] ): 채점 서버에 오류가 발생하거나, 옛날에는 해당 언어가 존재했는데 지금은 존재하지 않는 경우가 대표적이다.
- 삭제된 제출: 매크로, 핵, 치팅[24] 등 비정상적인 방법으로 제출을 한 것이 적발되어 운영자에 의해 삭제된 제출.
3. 문제 태그
문제 선택 창에서 그 문제에 대한 정보를 보여준다.
3.1. 기본 태그
- 분류: 문제를 푸는 데 필요한 알고리즘을 알려준다. 처음에는 보이지 않고 클릭하면 보인다.
- 출처: 외부 대회 등에서 가지고 온 문제들. 해당 문제 안에 그 문제의 원본 위치가 기록되어 있다.
- 스페셜 저지: 원래는 입력에 대해 출력이 완전히 일치해야 정답으로 인정되나, 이런 태그가 있는 문제들은 답이 꼭 일치하지 않아도 문제에서 제시한 조건에 맞으면 정답으로 처리된다. 주로 답이 여러 개인 경우 아무거나 하나를 출력하거나, 실수를 계산하는 경우 어느정도의 오차를 허용해준다.
- 디버그: 특정 입력에 대한 정답을 미리 확인해볼 수 있는 기능. "디버그" 탭에 들어가서 입력창에 문제에서 제시한 형식에 맞추어 테스트 케이스를 입력하면 그 입력에 대한 올바른 출력을 보여준다. 단 1회 사용할 때마다 코인을 지불해야 하며 코인은 일종의 캐시이므로 신중하게 사용하자.[25]
- 제출 언어 제한: 해당 문제에서 제출할 수 있는 언어에 제한이 있는 문제. 문제에 적혀있는 종류의 언어로만 답을 제출할 수 있다.[26]
- 서브태스크: 문제의 테스트 케이스가 여러 집합으로 분류되어 있으며 각각의 집합에 대해 부분점수를 주는 문제. 한 집합에 있는 모든 테스트케이스에 대한 답을 바르게 출력해야 해당 서브태스크의 부분점수를 얻는다. 맞은 서브태스크가 있는 경우, 득점이 총점과 같으면 맞았습니다!!, 그렇지 않으면 맞았습니다!!를 받는다.
- 부분 점수: 전체 테스트 케이스 중 답을 바르게 출력한 테스트 케이스의 비율에 따라 점수를 주는 문제. 일정 점수를 넘으면 맞았습니다!!, 그렇지 않으면 맞았습니다!!를 받는다.[27]
- 전체 채점: 틀렸습니다를 받아도 채점을 계속 진행한다. 전체 테스트 케이스 중 맞은 테스트 케이스가 일정 개수를 넘으면 맞은 데이터 수가 x, 전체 데이터 수가 y일때 맞았습니다!!(x/y), 그렇지 않으면 맞았습니다!!(x/y)를 받는다.
- 북마크: 자신이 북마크를 표시해 둔 문제. 북마크 탭에서 표시한 문제들만 모아볼 수 있다.
- 함수 구현: 문제에서 요구하는 함수를 구현하는 문제이다. 언어별로 채점이 구현되어야 하기 때문에, 모든 언어로 제출할 수 있는 것은 아니다.
- 인터랙티브: 채점 프로그램과 소통을 하면서 문제를 푸는 방식이다. 기존 알고리즘 문제와는 다른 스타일의 문제가 많다.
- 투 스텝: 같은 프로그램을 두 번 독립적으로 실행하서 문제를 풀어야 한다. 인코딩과 디코딩같이 짝을 이루는 것을 구현해야 하는 경우가 많다.
3.2. 제출 관련 태그
문제의 제출과 결과에 관련한 태그들이다,
- 성공: 자신이 해결한 문제.
- 실패: 자신이 1회 이상 시도하였으나 맞았습니다!!를 받지 못한 문제. 서브태스크/부분 점수의 경우 점수를 1점도 따지 못해도 얻는다.
- 부분 성공: 서브태스크/부분 점수 문제에서 점수를 획득하기는 했으나 만점을 받지 못한 문제.[28][29]
- 채점 준비중: 아직 제출할 수 없는 문제.
3.3. 기타 태그
- 랜덤 방지: 같은 데이터를 3번 채점하여 결과가 다르면 '틀렸습니다'를 받는다. 코드에 난수 발생 등 랜덤을 돌려서 문제를 맞히는 행위를 방지하기 위함이다.
- 번외: 이 문제들은 맞았습니다!! 를 받아도 현재까지 푼 문제수에 반영되지 않으며, solved.ac 경험치도 없다.[30] 주로 넌센스, 구글링을 해야 하는 문제, 랜덤 게임, 구데기컵 문제 등이 이런 태그를 받는다.
4. solved.ac
- https://solved.ac - 백준에 수록되어 있는 문제들에 난이도를 부여하는 서비스. 서강대학교 컴퓨터공학부 학생 박수현(shiftpsh)이 개발하였다. 경험치 등을 계산해서 티어를 매기고, Platinum V 이상이라면 문제에 난이도를 매길 수 있다. 그동안 백준의 단점 중 하나였던 문제의 난이도를 한눈에 파악하기 어렵다는 점을 거의 완벽하게 보완하여 유저들의 찬사를 받고 있다.
4.1. 경험치 테이블
증가율 '''볼드체''': 이전 및 이후 티어보다 현저히 높은 증가율
'''붉은 볼드체''': 2배 이상 증가율
'''푸른 볼드체''': 매우 낮은 증가율
달성 인원 수: 2020-10-04 기준
5. 장점
5.1. 한국어화
BOJ는 해외의 수많은 알고리즘 문제들을 번역하여 제공한다. 아직 외국어로 된 문제를 풀 준비가 덜 된 사람들에게 애용되고 있다.
5.2. 다양한 언어
ACM-ICPC와 같은 큰 대회에서는 C, C++, Java, Python[34] , Kotlin[35] 정도의 언어만 사용할 수 있으나, BOJ에서는 60가지 이상의 언어로 제출할 수 있다. 그리고 최근에는 Minecraft와 Coq라는 언어가 등장했다.
5.3. 유머
다른 온라인 저지에 비해 문제들이 재미있게 구성되어 있어 알고리즘 공부의 딱딱함을 줄여준다. 외국 문제들은 한국의 문화에 맞게 적절하게 각색된 경우가 많으며, 백준의 오리지널 문제들도 재미있는 상황이 많이 주어진다. 번역자, 출제자들의 유머 감각을 엿볼 수 있는 부분. 또한 수수께기 문제, 운에 의존하는 문제 등 특이한 문제들이 많이 있다. 이런 류의 문제들 중에서는 9999번 문제(구구)[36] 와 1237번 문제(정ㅋ벅ㅋ), 그리고 11506번 문제(占쏙옙)가 가장 유명하다. 어려운 문제를 오랫동안 붙잡고 있었는데 도저히 풀리질 않아 스트레스를 받았다면 이런 문제를 하나 풀면서 힐링을 하도록 하자. 단, 이런 문제의 정답을 게시판에 스포하면 규제당하므로 절대 그러지 말도록 하자. 이런 문제들만 모아놓은 문제집이 존재하고, 이런 넌센스 문제들만 모아놓은 대회인 구데기컵도 있다.[37][38][39]
5.4. 지속적인 문제 보강
데이터 수정 요청 게시판을 통해서 계속해서 문제들을 보강하고 있다. 데이터가 수정/추가되고 나서는 재채점을 하기 때문에, 이전에는 맞았던 문제가 재채점 후에는 틀린 것으로 바뀌기도 한다. 또한 같은 문제인데 백준에만 존재하는 추가 데이터 때문에 다른 온라인 저지 또는 당시 대회 데이터에서는 맞고 백준에서는 틀리는 경우도 발생한다. 이 덕분에 비교적 코드를 통과시키기 까다로운 조건에서 연습할 수 있고, 이는 실력 향상에 큰 도움이 된다.
5.5. 깔끔한 UI
전 세계의 온라인 저지 중에서 백준 온라인 저지만큼 깔끔한 인터페이스를 제공하는 곳은 없다. 해외의 유명 저지 Codeforces와 비교해도 백준이 훨씬 현대적이고 사용하기에 편리하다.
6. 단점
6.1. 잘못된 문제 및 데이터
문제가 잘못 번역되어 문제 풀이에 어려움을 주거나, 가끔은 아예 반대로 번역되어 원문을 읽지 않으면 풀 수 없는 경우가 있다. 그리고 간혹 테스트케이스의 입력 형식이 일정하지 않은 경우가 있다. 문제에서는 두 줄에 걸쳐 들어온다고 한 값들이 한 줄에 들어오거나 하는 것이 그 예이다. C/C++과 같은 언어는 상관이 없으나 Python과 같은 언어를 사용할 경우 입력 형식이 중요하기 때문에 입력값을 제대로 읽지 못해 오답을 내는 경우가 있다. 틀려도 어떤 입력과 출력으로 틀렸는지 알 수 없기 때문에, 이를 확인하기 위해 assert 함수를[40] 이용하거나 맞지 않는 입력이 주어지면 0으로 나누는 작업등으로 문제가 있음을 확인한 후에 해당 문제의 질문 검색에 글을 올리도록 하자.
6.2. 부실한 예제
유명 알고리즘 사이트들의 문제는 푸는 사람들의 이해를 돕기 위해 설명이 동반된 예제를 2개 이상 제공한다. 그러나 BOJ는 초창기에 문제를 만들 때 예제를 1개밖에 올릴 수 없었고, 당시에 등록된 오래된 문제들은 지금도 여전히 예제가 1개이며 예제에 대한 설명이 없다. 백준은 이 문제를 개선하겠다고 했으며, 예제 추가 요청은 게시판에 하지 말아달라고 했다.
7. 사건 사고
7.1. 2019 숭고한 알고리즘 캠프 시작 시간 지연
운영자인 최백준이 대회 전날 저녁부터 대회 당일까지 연락이 안 되었고, 예정된 대회 시작 시간인 오후 1시가 아닌 오후 2시에 연락이 되어 대회 전용 계정을 제공하여 2시 25분에 대회가 시작되었다. 1시간 25분을 기다려야 했던 참가자들 뿐만 아니라 만일을 대비하여 전날부터 개인 서버를 켜 돔저지 세팅을 하던 운영진 모두 피해를 보았음은 분명하다.
7.2. UCPC 서버 사고
2019, 2020년 모두 대회 진행 중 서버가 다운되는 사고가 발생하였다. 대회 종료 후 전국 대학생 프로그래밍 대회 동아리 연합 페이스북 홈페이지에 최백준이 직접 사과문을 작성하였다.
- 2019 UCPC 서버 다운 https://www.acmicpc.net/board/view/39396
- 2020 UCPC 서버 다운 https://www.acmicpc.net/blog/view/94
7.3. 중앙대 프로그래밍 경진 대회 서버 사고
2020년 11월 21일 백준 DB 서버 용량이 가득차 서버가 다운되고, 대회 진행에 차질이 있었다. 이후 용량 오토 스케일링을 적용했다고 한다.
- 2020년 11월 21일 서버 사고 https://www.acmicpc.net/blog/view/98
8. Slack
단체 톡방으로 Slack을 이용한다. 위치는 https://acmicpc.slack.com이며, 홈페이지의 안내에 따라 초대장을 받아 들어갈 수 있다. BOJ에서 활동중인 유저들이 이야기를 나눈다. 질문 채널에서 모르는 문제에 대해 질문하면 답변을 받을 수 있는 경우도 있다.
2020년 6월 10일 BOJ 슬랙이 삭제되는 사고가 발생했다. 이후 정상 복구되었으나, 2021년 1월부터 분위기가 좋지 않아지다가 2021년 2월 18일 사건이 터지면서 완전히 삭제되었다. #
아래 글은 슬랙이 삭제되기 직전 분위기가 어땠는지를 말해준다. 원문
[ 추측성이 아닌 확실한 사건 'BOJ 슬랙 2월 13일~2월 18일' ]
2시 반이 지나서 나머지 두 명이 랜덤채널에 들어왔고 그중에 한명은 사과를 함. 나머지 한명이 다른 두명이 6일 밴 당한 걸 보고 대뜸 3일 밴 당한 거 조금 일찍 들어왔다고 일주일 밴하다니 무슨 이런게 다 있냐고 따짐. 백준은 그 사람은 채널에서 욕을 했기 때문에 즉시 밴 대상이지만 3일만 밴했기 때문에 문제가 없다고 답함. 곧 슬랙이 삭제됨.}}}
9. 적절한 문제 선정을 위한 팁
아래의 기능들을 잘 활용해보자.
- 문제집: 유저들이 자유롭게 생성할 수 있는 문제집 중에서 초심자 전용 문제집이 많이 존재한다. 좋은 문제들을 많이 모아놓은 문제집이 많으므로 애용하면 좋다.
- 내가 못 푼 문제들: 전체 문제들 중에서 내가 아직 풀지 않은 문제를 정답자 수가 높은 순서로 정렬하여 보여준다. 정답자 수가 충분히 높다면 문제에 치명적인 오류가 있을 가능성이 낮으므로 믿고 풀어도 좋다.
[1] 2020년 9월 08일 오전 11시 29분 기준[2] 이메일 인증을 받은 사람만 포함[3] 2020년 10월 20일 오후 8시 39분 기준[4] 2021년 2월 4일 오후 11시 50분 기준[5] 번호는 20900번까지 있지만 문제가 1000번부터 시작하므로 999를 빼주어야 한다.[6] 19000 문제면 세계 최고 수준이다.[7] 기본적으로 선택할 수 있는 옵션은 72개지만 C나 C++, python 등의 언어가 여러 번 포함됐기 때문에 실제로 제출 가능한 언어의 수는 50이다. 그밖에 Minecraft, Coq처럼 기본 옵션에는 없지만 특정 문제에서 제출할 수 있는 언어도 있다.[8] 해당 문제는 1006번 문제로, 1000번부터 시작하는 백준 문제 중 7번째 문제이다. 초보가 도전하기에는 적절하지 않은 문제이므로 다른 문제를 통해 충분히 연습을 한 후 도전하도록 하자. 또한 이 문제는 중급자도 어려워하는 문제이다.[9] solved.ac 난이도 기준으로 '''Platinum III'''이다.[10] 오전 11시 11분 또는 오후 11시 11분에 해결하면 빼빼로 3개를 주고, 오전 11시 11분 11초 또는 오후 11시 11분 11초에 해결하면 빼빼로 5개를 줬다. 일본에 있는 사람에게도 주었다.[11] Accepted[12] Wrong Answer[13] 서브태스크가 있는 문제나 부분점수를 주는 문제는 예외. 이 경우 '부분 성공'을 얻을 수도 있다.[14] Compilation Error[15] Time Limit Exceeded[16] Runtime Error[17] Memory Limit Exceeded[18] Presentation Error[19] 일반 문자(숫자, 알파벳 등)를 틀리면 이 결과 대신 틀렸습니다를 받는다.[20] 각 줄 맨 마지막 공백 1개 및 마지막 줄바꿈은 있어도 없어도 된다.[21] 결과가 매우 길기 때문에, 채점 결과 필터 및 통계에서는 '출력 형식'으로 표시된다.[22] Output Limit Exceeded[23] Unavailable[24] 다른 사람의 소스코드를 그대로 복사해서 제출하는 것.[25] 코인 스토어에서 코인을 살 수 있으며 1100원에 10개이다. 대량으로 구입하면 더 싸게 살 수 있다.[26] 이 태그가 없으면 모든 언어로 제출 가능하다.[27] 위 두 태그에 속하는 문제는 맞았습니다를 받은 경우 'x점' 형식으로 표시된다.[28] 제출 결과가 맞았습니다!!인 경우.[29] 유저 프로필에서는 '시도했으나 만점을 받지 못한 문제' 에 포함된다.[30] solved.ac에서는 난이도 0(Not Ratable)로 표시되며 이 문제들은 경험치가 0이다.[31] 번외 문제 전용[32] 아직 레이팅되지 않은 경우.[33] 0으로 나눌 수 없기 때문이다.[34] 이마저도 최근 들어서 사용 가능해졌다.[35] JetBrains이 후원사가 되면서 사용 가능해졌다.[36] 참고로 이 내용과는 관계가 없으며, 오로지 구글링으로 문제를 풀어야 한다.[37] 이런 문제들이 코딩 테스트나 경시에 나올 가능성은 전무하므로 관심이 없다면 풀지 않아도 무방하다.[38] 코딩으로 엄청 어려운 문제나 편견을 깨는 문제들을 준다.[39] 여기서 '구데기'는 이 뜻이다.[40] assert(<조건>)은 <조건>이 거짓인 경우 그 즉시 런타임 에러를 발생시키며 프로그램을 종료시킨다.