mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-09-17 20:56:57

숏코딩

코드 골프에서 넘어옴
1. 개요2. 전용 언어3. 여담

1. 개요

Short Coding

주어진 문제 또는 특정 알고리즘을 '최대한 짧은 코드로' 구현하는 프로그래밍 방식. 골프 스크립팅 혹은 코드 골프로도 불리며, 1999년 Perl에서 이 단어가 탄생했다.[1] 공을 가능한 적은 횟수로 쳐서 골을 넣어야 하는 골프의 룰과 비슷하다고 하여 그런 이름이 지어졌다고 한다.

최대한 코드를 단순화하는 것도 기본적으로 코드 골프와 같은 맥락이다. 가령 정수형 변수 하나를 선언하는 상황에서
#!syntax cpp
int value = 10;
위와 같은 선언문을
#!syntax cpp
v=10;
이렇게 단순화하는 것. 이것을 변수 선언에 국한하지 않고 소스코드 전반에 걸쳐 극한으로 줄이고 줄여서 더 짧고 메모리를 적게 쓰는 것이 숏코딩이며, 이를 가지고 경쟁하는 것이 코드 골프. 해외에는 대회도 많은 편이고, 백준이나 Codeforces 같은 알고리즘 문제 풀이 사이트에서는 다른 사람들이 작성한 코드의 길이가 정답자 명단에 표시되는 점을 이용하여 은둔 고수들이 보이지 않는 경쟁을 하기도 한다.

가독성이나[2] 데이터 절약 등의 특정 목적을 위해 일부 변수명이나 코드를 단순화하는 것은 흔하지만, 아예 소스코드 전반을 이런식으로 작성하는 것은 딱히 실용성이 없는데다 추후에 코드를 파악하는 것도 어려워 자충수가 될 수도 있다. 실제로 사용하는 경우는 거의 없고 사실상 재미를 위한 오락 내지 흑마법에 가깝다. 진짜로 팀에서 코드 골프하듯 구현하면 맞는다. 다만 코딩을 공부하는 초심자 단계에서는 숏코딩을 해보는 게 유효한 경험이 될 수 있다. 최대한 깔끔하고 간결하면서도 효율적인 코드를 작성하는 법을 공부하는 것은 괜찮은 경험이다.

코드 골프 경쟁과 별개의 맥락으로, 프로그래밍 입문자들은 동일한 동작을 구현하더라도 짧은 길이로 구현하는게 더 실력이 좋은거라 오해하기 쉽다. 그러나 프로그래밍에 있어서 아주 중요한 사실은, 개발에서 가장 중요한 지표가 되는 실행시간과 메모리 사용률 등의 수치는 코드의 표면적인 길이와는 전혀 관련이 없다.[3] 즉, 코드가 짧다고 해서 효율적인 코드가 아니다. 시간 복잡도를 이해하면 숏코딩이 왜 실무에서 의미가 없고 단순 재미를 위한 오락인지 알게 된다.

여기에 더해 현실적인 이유가 더 있는데, 홀로 일하는 프리랜서나 1인 조직이 아닌 이상 개발은 반드시 다른 사람과의 협업이 전제된다. 기본적으로 소스코드는 컴퓨터에게 지시하는 명령어의 집합이지만 그 전에 일단 사람 개발자가 읽어야 하는 물건이다. 직관적인 구조와 적절한 기능의 분할, 가독성 향상 등을 고려하면 어느 정도 코드가 길어지더라도 일단 사람이 보기에 편하면서 그 안에서 최대한 최적화를 챙기는 것이 흔히 말하는 '좋은 코드'다.

언어에 따라서 이름이 다르게 불리기도 하며, Perl Golf 같은 경우가 대표적이다. 특히 Perl은 이 분야의 원조인 만큼 특히 규모가 큰 편이다.

2. 전용 언어

코드 골프를 위해 만들어진 언어도 많은데, GolfScript나 FlogScript 같은 경우가 대표적이다. 최대한 코드 길이를 줄여야 하다 보니 난해한 프로그래밍 언어와도 어느 정도 통하는 편이고, 실제로 GolfScript는 공식 홈페이지에 난해한 프로그래밍 언어라고 명시해 두었다. 아래의 코드는 GolfScript로 소수점 아래 1000자리의 원주율을 출력한다(29 bytes).
#!syntax perl
6666,-2%{2+.2/@*\/10.3??2*+}*
 -> 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989

입력 받은 수 N개의 합을 출력하는 문제의 경우, 다음과 같이 Golfscript 언어로 단 6 Byte만에 푸는 것이 가능하다.
#!syntax perl
~]{+}*

3. 여담

Baekjoon Online Judge에서는 각 문제의 모든 정답 코드를 바이트 크기 오름차순으로 정렬해주는 기능을 제공하여, 난이도가 낮은 문제들의 경우 치열한 코드 골프 경쟁이 이루어지는 것을 볼 수 있다.


[1] https://groups.google.com/group/comp.lang.perl.misc/msg/7b97c434492c8d20 [2] 혹은 의도적으로 가독성을 낮추는 난독화도 해당 [3] 코드를 어떻게 작성하느냐에 달려있지, 길이의 문제가 아니기 때문.