Search
Duplicate

golfscript로 코드 골프해 보기

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
golfscript
잡지식
Scrap
태그
프로그래밍 언어
9 more properties

1. 코드 골프란?

코드 골프(code golf)는 어떤 문제를 가장 짧은 코드로 구현하기 위해 경쟁하는 것을 말합니다.
가독성, 시간복잡도를 모두 제쳐두고 오직 더 짧은 코드만을 위해 대결합니다.
실제 골프 또한 주어진 코스를 가장 적은 타격 횟수로 완주해야 한다는 점이 비슷하여 이런 이름이 붙여졌습니다.

2. 코드 골프 맛보기

간단한 문제로 코드 골프를 한번 체험해봅시다.
백준 18108번 문제입니다.
입력값을 정수로 받은 뒤, 543을 빼고 출력하면 되는 간단한 문제네요.
우선 C언어로 이 문제를 한 번 풀어봅시다.
#include <stdio.h> int main() { int a; scanf("%d", &a); printf("%d", a-543); }
C
복사
불필요하게 필요한 문구가 많아 82byte나 나오는 모습입니다.
같은 코드를 파이썬으로 작성해 볼까요?
a = int(input()) print(a-543)
Python
복사
같은 로직의 C언어 코드에 비해 훨씬 줄어든 29byte가 되었습니다.
이제 코드를 더 줄여봅시다.
print(int(input())-543)
Python
복사
변수 a를 생략하면 무려 23byte까지 줄였습니다!
파이썬도 훌륭하지만, 코드 골프의 최강자는 따로 있습니다.
바로 오늘의 주인공인 golfscript입니다.
이름에서부터 알 수 있듯이 오직 코드 골프만을 위해 태어난 언어입니다.
설명에 들어가기 전, 같은 문제를 golfscript로 푼 코드를 봅시다.
~543-
Plain Text
복사
같은 문제를 단 5byte만에 풀어내는 위엄을 보여줍니다.
처음 작성한 C언어 코드에 비해 16.4배, python 코드에 비해 4.6배나 짧은 코드입니다.
이거.. 정말 재밌어 보이는데요?
golfscript, 한번 해봅시다.

3. golfscript 시작하기

golfscript를 실행할 준비를 해봅시다.
1.
Ruby 설치하기
golfscript는 Ruby 기반으로 제작된 golfscript 전용 인터프리터를 이용해 실행됩니다.
따라서 Ruby를 우선 설치해야 합니다.
공식 사이트나 Homebrew를 이용하여 Ruby를 설치해 줍니다.
brew install ruby
Bash
복사
2.
golfscript 인터프리터 설치
여기서 golfscript.rb가 인터프리터입니다.
3.
golfscript 실행
이제 모든 준비가 끝났으니, 방금 clone 받은 폴더 안으로 들어가서 코드를 작성하고 실행하면 됩니다.
기본적인 실행 방법은 다음과 같습니다.
echo <입력> | ruby golfscript.rb <golfscript 코드가 적힌 파일명>
Bash
복사
예시로 풀어본 문제의 예시를 입력해 보면, 잘 실행됨을 확인할 수 있습니다.

4. golfscript의 기본 개념

golfscript는 스택 구조의 언어입니다.
또한, 후위 표기법(Postfix Notation)을 사용해 연산을 진행합니다.
후위 표기법을 쉽게 익히기 위해 사칙연산을 통해 연습해 봅시다.
1 3 + 2 *
Plain Text
복사
위의 5가지 문자가 스택으로 왼쪽부터 들어온다고 생각해 봅시다.
숫자가 들어오면 그대로 스택에 쌓이고, 연산자가 들어오는 경우는 스택의 top에 있는 2개 원소를 연산합니다.
stack input 1 1 3 1 3 + 4 2 4 2 * 8
Plain Text
복사
후위 표기법은 이런 식으로 연산이 진행됩니다.
golfscript도 이와 같은 방식으로 작동합니다!

5. golfscript의 문법

golfscript는 한 연산자에 매우 많은 기능들을 넣어놨습니다.
다 정리하기에는 무리가 있으니 몇 가지 연산자 예시만 살펴봅시다.
1.
~
인자를 한 개만 받는 연산자입니다.
인자에 정수가 들어왔을 경우 비트연산을 수행합니다. ex) ~ 9 → -10
인자에 string이나 block 자료형이 들어올 경우 개수를 반환합니다. ex1) ” 1 2 + “ ~ → 3 ex2) { 1 2 + } ~ → 3
인자에 배열이 들어올 경우 해당 배열을 unpack 합니다. (python의 *과 같은 역할) ex) [ 1 2 3 ] ~ → 1 2 3
2.
\
인자를 2개 받는 연산자입니다.
stack의 상위 2개의 요소를 swap 합니다. ex) 1 2 3 \ → 1 3 2
3.
p
스택의 top에 있는 요소를 제거한 뒤, 개행 문자와 함께 출력합니다.
더 자세한 내용은 아래 공식 사이트에서 학습해 보세요.
언어와 정말 잘 맞는 홈페이지 디자인

6. 마치며

개발에서 가장 중요한 것은 보기 좋은 코드, 효율 좋은 코드입니다.
따라서 개발할 때 무분별한 코드 골프는 피해야 합니다.
하지만 재밌으면 된 거 아닐까요?
이번 글을 통해 지루한 코딩 생활 중 잠시 쉬어갈 수 있는 코드 골프를 즐겨보셨으면 좋겠습니다.