pile·
백엔드·8퍼센트8퍼센트·

파이썬 코드 골프

파이콘 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자가 된다.
  • 남은 여지: 계속 들여다보면 한 글자씩 더 줄어들지만 글에서는 여기서 멈춘다.
  • 저자의 태도: 회사에서는 절대 하면 안 되는 기법을 쓰게 되는 데서 오는 재미를 이유로 들고, 컨퍼런스를 즐기는 또 다른 방법으로 코딩 경기 참가를 권한다.
  • 코드 골프의 위치: 짧은 코드 만들기가 목적이라 보통 어려운 문제가 나오지 않는다. 대신 풀이가 복잡하면 아무리 줄여도 짧아지지 않아 접근 자체를 단순하게 잡는 것이 먼저다.
  • 변수 대체의 원리: 같은 이름이 여러 번 등장하면 짧은 이름에 한 번 담아두고 그 이름을 쓰는 편이 전체 문자수에서 이득이다. 등장 횟수가 적으면 오히려 손해라 세어보고 결정한다.
  • 다중 대입: 여러 줄에 걸친 대입을 하나로 묶으면 줄바꿈과 반복되는 등호 주변 문자를 함께 줄일 수 있다.
왜 읽나파이썬 표현을 어디까지 압축할 수 있는지 단계별 수치와 함께 보고 싶다면, 반대로 실무 코드에서 무엇이 가독성을 지탱하는지도 같이 드러난다.
8퍼센트
8퍼센트 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·twilio-engTwilio Engineering·

    Programmable Messaging에서 Verify API로 마이그레이션하기

    Twilio의 Programmable Messaging API로 자체 OTP 솔루션을 운영하던 서비스가 Verify API로 전환하는 방법을 코드 예시와 함께 설명한다. Verify는 OTP 전송·검증을 위한 전용 API로, 전화번호 구매, 토큰 생성, DB 저장·만료 관리를 내부에서 처리해 개발자가 직접 구현할 코드를 크게 줄인다.

    요약 이어보기
    #authentication#twilio#sms+2
  2. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 2부

    포스타입 백엔드 엔지니어가 벡터 기반 개인화 추천 시스템을 실제 운영하며 맞닥뜨린 성능 장애와 용량 문제를 해결한 과정을 담은 2부다. 수백만 개의 벡터 KNN 검색이 피크 시간대에 전체 Elasticsearch 검색 성능을 흔드는 문제부터 클러스터 OOM 사태까지, 쿼리 최적화와 인프라 분리 두 가지 경로로 근본 해결에 이른다.

    요약 이어보기
    #elasticsearch#vector-search#recommendation-system+2
  3. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 1부

    포스타입이 태그 기반 추천의 한계를 극복하고 벡터 임베딩 기반 개인화 추천 시스템을 구축한 과정을 담은 1부다. 유사한 콘텐츠가 다른 용어를 쓰거나 동일한 태그가 전혀 다른 톤의 콘텐츠를 가리키는 문제를 임베딩 벡터로 해결하고, OpenSearch의 HNSW ANN 검색으로 수백만 벡터를 실시간 검색하는 시스템을 구축해 구매율 15% 향상을 달성했다.

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2