네 줄 요약 :

1. 대회 도중 제출한 코드

2. 예제만 틀리도록 하는 코드

3. 데이터가 추가되어서 틀릴 예정인 문제의 코드

이런 코드들을 미리 많이 만들어서 제출해놓고, 하루에 하나씩 제출하자.




solved.ac 프로필 뱃지로 추가된 조건 중에 "512일 연속 문제 해결" 이라는, 아주 괴악한 조건을 가진 뱃지가 추가되었다.

물론 하루에 한 문제씩 512일 연속으로 꾸준히 풀면 해결되겠지만

인간의 미래는 알 수 없고, 512일 내내 문제를 풀 수 있는 환경이 보장될 것이라고 장담할 수 없다.

예를 들면 2년 이내에 군대에 끌려간다던가, 코딩용 컴퓨터가 고장나서 수리를 맡긴 상황 등...

여러 가지 상황으로 인해 문제를 풀 수 없는 날이 하루정도 쯤은 생길 수 있다.


그리고 이렇게 하루를 빼먹게 되면, 연속으로 문제를 해결하던 카운트가 초기화되고...

다시 처음부터 시작해서 512일 연속으로 문제를 풀어야하는 절망적인 상황이 발생한다.



이에 우리는 이렇게 '문제를 풀지 못하는 하루'가 발생하지 않도록 대비를 하고, 전략을 세우고, 준비를 해야한다.



대전제 : acmicpc.net 사이트 자체가 사망하여 채점할 수 없는 날은 고려하지 않는다.

또한 solved.ac 사이트 자체가 사망하여, acmicpc.net 채점 결과가 solved.ac 로 전송되지 않는 경우도 고려하지 않는다.

이 두 경우는 자연재해가 발생한 것과 같으므로, 나약한 인간인 우리가 할 수 있는 것은 없다.



1. BOJ 플랫폼에서 진행한 공식 대회 / Open Contest 때 제출한 코드를 다시 제출




acmicpc.net 에서는 가끔씩 대회를 진행한다.

그리고 대회 도중에 제출한 코드는 solved.ac 의 잔디로 인식이 안된다!

(문제가 아직 공개되지 않았기 때문에 solved.ac 로 API 전송을 할 수 없는, 기술적 한계 때문으로 추정)


잔디를 심지 않아서 최소 1문제 이상 풀어야 하는 상황이 되었을 때,

"난이도 기여" 버튼을 눌러서, 해당 문제가 solved.ac 에서 아직 안푼 문제로 인식되는지를 먼저 확인하고

대회 도중에 제출했던 코드를 그대로 다시 제출하면 된다.

대회 도중 제출한 코드는 제출 목록에 그대로 존재하므로, 클릭/터치 10 번 이내로 그날의 잔디를 심을 수 있다.



주의해야 할 것은 '강제 갱신을 해버린 경우, 대회 때 제출한 코드를 강제로 맞았다고 갱신되어버리므로 이 기술을 사용할 수 없다.

별 생각 없이 강제 갱신을 실수로 누르는 경우 or solved.ac 서버의 패치 작업 등으로 인해 강제로 갱신되는 경우가 발생할 수 있으니

아끼다 똥되지 않도록, 너무 오래동안 묵혀놓는 것은 좋지 않다.


2. assert 등을 활용하여 일부러 틀린 코드 제출





필자가 요즘 자주 하고 있는 짓이다.

일반적인 경우에는 정답을 받고, 예제가 들어올 때만 assert 를 발생시키도록 하는 코드를 제출한다.


해당 assert 문을 주석처리하면 되므로 

핸드폰으로도 1~2분 이내에 잔디를 심을 수 있다.



3. 재체점으로 틀릴 예정인 코드를 제출하여, 잔디 2번 심기




게시판 눈팅을 하다보면 위 게시글처럼, 재채점이 될 가능성이 높은 요청 게시글이 종종 보인다.(빨간색은 신뢰의 상징이다.)

이런 문제의 경우 백준님께서 꾸준하게 데이터를 추가해주시므로

조금 느리더라도 언젠가는 재채점이 이루어질 것이다.

이 때 우리가 취해야 할 자세는,

"데이터가 추가되면 틀리게 될 코드를 일부러 제출한다" 이다.


수정되기 전 정답으로 잔디 심기 --> 재채점 후 틀리기 --> 틀린 부분을 수정하여 다시 제출해서 잔디 심기

라는 기적의 논리로, 문제 하나로 잔디를 2번 심을 수 있다.

(실제로 테스트해본 결과, 재채점으로 인해 틀리게 된 문제로 인해 잔디가 중간에 빠지는 경우가 발생하지 않는 것을 확인했다.)


데이터 추가 후 재채점이 언제 일어날지 예상을 할 수 없으므로,

assert 등을 활용해 2. 번 문제 중 하나와 같이 관리할 수 있도록 하면 편할 것이다.



따라서 우리는, 문제를 풀 때 다음과 같은 정보를 고려해서 문제를 풀어야 한다.

1. 이 문제가 재채점될 가능성이 높은 문제인가.

2. 이 문제의 채점 데이터에 예제가 있는가.

1. 의 경우에는 재채점으로 추가될 데이터에 assert를, 2. 의 경우에는 예제에 assert를 걸어서

추후 우리가 쉽게 코드를 다시 제출할 수 있도록 만들어둔다.


그리고 다음과 같은 우선순위로, 하루에 하나씩 잔디를 심는다.

1-1. 재채점될 가능성이 높은 문제

1-2. 일반적으로 풀 수 있는 문제

2. 대회 도중에 제출한 문제

3. 과거에 assert 문으로 틀린 문제


assert 로 틀린 문제는, BOJ가 살아있는 한 언제든지 다시 제출할 수 있으므로 우선순위를 가장 낮게 둔다.

그리고 대회 도중 제출한 문제는 solved.ac 서버의 업데이트 등으로 인해

언제든제 강제로 풀릴 가능성이 있으므로 조금씩 조금씩 꺼내먹는 것이 좋다.


이런 복잡한 것을 고민할 것 없이 그냥 푸는 것이 가능한 환경이면, 그낭 한 문제를 풀자.

그래도 만약 재채점될 가능성이 높은 문제를 발견했다면, 그 문제에 대해, 일부러 틀린 풀이를 만들도록 노력하면 된다.


이상으로 꿀팁 방출을 모두 마친다.

모두들 새싹 9단계를 성공적으로 달성하길 기원한다.