파이콘 2018 코드 골프에 참가한 경험을 문제 풀이와 코드 축약 과정으로 정리한 글이다. 가장 적은 문자수로 알고리즘을 동작시키는 경기로, 다이아몬드를 겹쳐 그리는 문제를 551자에서 237자까지 줄이는 단계를 순서대로 보여준다. 각 단계마다 어떤 기법으로 몇 자를 줄였는지 수치가 붙는다.
핵심 포인트- 코드 골프는 가장 적은 문자수로 알고리즘을 동작시키는 경기이며 전용 사이트와 책까지 있다.
- 문제 자체는 어렵지 않지만 처음부터 간단한 방식으로 풀어야 축약 후에도 짧은 코드가 나온다.
- 주석과 공백 제거, 한 글자 변수명, 한 칸 들여쓰기만으로 551자가 289자가 됐다.
- 여러 번 쓰이는 range나 문자열 리터럴을 변수로 빼면 289자가 271자가 됐다.
- 정수 나눗셈 연산자와 리스트 컴프리헨션으로 258자, 다중 대입과 세미콜론으로 237자까지 줄었다.
상세 정리- 문제 형식: 다이아몬드 개수 n과 각 다이아몬드의 크기 s가 주어지고 s는 항상 양의 홀수다.
- 출력 규칙: 가장 큰 다이아몬드 크기가 출력 영역의 행과 열이 되고 그 중앙을 기준으로 각 다이아몬드를 겹쳐 그린다. 선은 asterisk, 나머지는 공백이다.
- 세부 조건: 각 줄에서 마지막 별 뒤에도 공백으로 열을 모두 채워야 하고, 모든 크기가 같으면 다이아몬드는 하나만 보여야 한다.
- 첫 코드: 공백판을 만들고 다이아몬드 크기로 오프셋을 계산해 네 사분면에 별을 찍은 뒤 줄 단위로 출력하는 551자짜리다.
- 축약 1 주석과 공백: 주석과 의미 없는 공백을 지운다.
- 축약 2 변수명: 모든 변수명을 한 글자로 바꾼다. 저자는 이 지점에서 가독성이 급격히 떨어져 변수명의 소중함을 알게 된다고 적는다.
- 축약 3 들여쓰기: 네 칸 관행 대신 한 칸만 써도 되므로 여기까지로 551자가 289자가 된다.
- 축약 4 반복 요소의 변수화: 여러 번 등장하는 range를 한 글자 변수에, 별 문자열도 변수에 담아 대체해 271자가 된다.
- 축약 5 짧은 표현으로 대체: 실수 나눗셈 후 int로 감싸던 부분을 정수 나눗셈 연산자로 바꾸고, append로 채우던 반복문을 리스트 컴프리헨션으로 바꿔 258자가 된다.
- 축약 6 줄바꿈 줄이기: 여러 변수를 한 줄에 묶어 대입하고 for 문 다음 줄들을 세미콜론으로 이어 붙여 237자가 된다.
- 남은 여지: 계속 들여다보면 한 글자씩 더 줄어들지만 글에서는 여기서 멈춘다.
- 저자의 태도: 회사에서는 절대 하면 안 되는 기법을 쓰게 되는 데서 오는 재미를 이유로 들고, 컨퍼런스를 즐기는 또 다른 방법으로 코딩 경기 참가를 권한다.
- 코드 골프의 위치: 짧은 코드 만들기가 목적이라 보통 어려운 문제가 나오지 않는다. 대신 풀이가 복잡하면 아무리 줄여도 짧아지지 않아 접근 자체를 단순하게 잡는 것이 먼저다.
- 변수 대체의 원리: 같은 이름이 여러 번 등장하면 짧은 이름에 한 번 담아두고 그 이름을 쓰는 편이 전체 문자수에서 이득이다. 등장 횟수가 적으면 오히려 손해라 세어보고 결정한다.
- 다중 대입: 여러 줄에 걸친 대입을 하나로 묶으면 줄바꿈과 반복되는 등호 주변 문자를 함께 줄일 수 있다.
왜 읽나파이썬 표현을 어디까지 압축할 수 있는지 단계별 수치와 함께 보고 싶다면, 반대로 실무 코드에서 무엇이 가독성을 지탱하는지도 같이 드러난다.