이번주에는 그로스 해킹 5장 ~ 6장을 읽고 저만의 생각을 정리하는 시간을 가져보도록 하겠습니다.

5장

그로스 해킹의 시작

1 단계: 데이터를 활용할 수 있는 업무 환경 만들기

2단계: 데이터 파이프라인 구축하기

3단계: 데이터 활용을 위한 역량과 문화 갖추기

4단계: 성장 실험

  • '데이터의 중요성을 공감한다' '데이터를 기반으로 업문를 진행하는 프로세스와 역량을 갖추고 있다' 는 전혀 다른 차원의 이야기이다.
  • 그로스 팀의 업무 범위
    • 핵심 지표 선정 및 관리
    • 데이터 파이프라인 설계 및 구축
    • 주제별 데이터 분석
    • 데이터 추출 및 분석 요청 대응
    • 데이터 기반으로 일하는 문화 만들기
  • 데이터 분석과 관련된 IaaS, PaaS, SaaS를 잘활용한 덕분이다
  • 클라우드 분석 환경
    • 데이터를 수집하고 분석할 수 있는 기본적인 환경을 구축할 때 클라우드 분석 환경이 눈부시게 발전하면서 인프라 구축을 위한 엔지니어링이 크게 감소하였다.
    • 아마존 EMR, 구글 GCP, 마이크로소프트 AZURE
  • ETL(Exract, Transforms, Load) 서비스
    • 여기저기에 산재되어 있는 데이터를 수집하고 분석하기 편한 형태로 변환하고 원하는 데이터베이스에 최종적으로 적재하는 일련의 과정을 의미한다
    • Fivetran, stitch 등의 자동화 서비스가 있다.
  • Bi 서비스
    • '원하는 데이터를 추출하는 것' '데이터에서 인사이트를 찾아내고 이를 바탕으로 의사결정하는 것'은 여전히 큰 간극이 존재한다.
    • 다양한 직군의 실무자들이 데이터에 손쉽게 접근하고 이를 통해 인사이트를 얻을 수 있는 환경을 만들기 위해 적절한 시각화를 통해 지표를 한눈에 볼 수 있도록 대시보드 만들고 로 데이터를 쉽게 확인할 수 있는 시스템을 구축해야 한다.
    • 태블로, 구글 데이터 스튜디오, 슈퍼셋, 리대시 등이 있다.
  • 데이터 파이프라인 만들기
    • 어떤 데이터를 쌓을 것인가?
    • 어떤 형태로 쌓을 것인가?
    • 어디에 쌓을 것인가?
    • 어떻게 꺼내서 볼것인가?
  • 행동 로그 분석을 위한 데이터 파이프라인
    • 행동 로그 설계의 핵심은 이벤트의 속성(property)을 어떤 수준으로 함께 남길 것인가를 정의하는 부분이다.
    • 발생하는 모든 이벤트를 기록해야 한다는 생각을 버리고 분석에 필요한 이벤트를 정확하게 적재하는 것이 핵심이다.
  • A/B 테스트
    • 가설: 독립변수, 종속변수가 무엇인지 정의하고 종속변수의 목표수준 명확히 정하는 형태
    • 시험집단/ 통제집단: 사용자들을 어떤 기준으로 구분하고 어떤 비율로 할당할 것인지 정의
    • 독립변수 : 설명변수 또는 예측변수
    • 종속변수 : 독립변수에 의해 영향을 받을 것으로 기대되는 변수
    • 통제변수 : 실험결과에 영향을 미칠 수 있기 대문에 실험집단/ 통제집단 모두에서 동등한 조건을 가져야 하는 변수
    • 샘플크기 : 가설 검증에 필요한 실험 참가자의 숫자 의미
    • 실험기간 : 샘플 크기를 고려했을 때 가설 검증을 위한 데이터를 수집하는데 필요 기간 정의
    • 유의 사항
      • 통제 변수를 깊이 고민하지 않은 상태에서 단순히 홀/짝 구분을 한다고 해서 랜덤 샘플링이 잘 됐다고 볼 수는 없다.
      • 실험하기 전에 샘플 크기를 미리 정해야 한다.
      • 실험 설계에 따라 적합한 계산기를 사용해야한다.
      • 무가설, 통제 변수 관리 실패, 단순 평균 비교, 연보기 + 조기 중지, 시간의 흐름에 따른 차이를 살펴보지 않는것은 주의해야한다.
      • 과거의 A/B 테스트 경험을 지나치게 신뢰하는 것, 국지적 최적화의 함정을 유의 해야한다.
    • 테스트 결과 분석하는 방법
      • P-value에 대한 이해 : p값은 귀무가설 하에서 고나찰된 검정통계량 만큼의 극단적인 값이 관찰될 확률을 의미한다.

6장

  • 그로스 조직의 목표
    • 가장 중요한 목표는 핵심 지표 개선
    • 성장 DNA를 전파하는 조직이 되어야 한다.
    • 구성원
      • 그로스 PM
      • 그로스 엔지니어
      • 그로스 마케터
      • 그로스 디자이너
      • 그로스 데이터 분석가
    • 제일 중요한 구성원은 성장실험을 할 수 있는 멤버를 보유하는 것이다.
    • UX 디자이너로 불리길 원한다면 단순한 마인드셋 정도가 아니라 실제로 사용자를 중심에 놓고 일하는 프로세스와 사용자 데이터를 획득하고 분석해서 업무에 활용할 수 있는 역량을 갖춰야한다.
    • 직군에 '그로스'를 붙이려면 그에 맞게 일하는 프로세스와 역량을 갖춰야 한다.
  • 그로스 조직의 구조
      • 리포팅라인: 그로스 조직의 상위 의사결정권자가 누구인가?
      • 전담 인력 구성: 그로스 업무만 전담해서 진행하는 인력을 얼마나 배치할 것인가?
      • 협업 구조: 사내 다른 조직과 어떤 구조로 커뮤니케이션하는가?
    • 그로스펑셔널 팀 구조 : 기능 조직에 소속된 각 직군별 담당자들이 모여서 목적 조직을 구성
    • 독립 팀 구조: 기존의 기능 조직과는 별개로 독립된 그로스 조직을 새롭게 만드는 형태
    • 복합 구조: 그로스 펑셔널 팀과 독립팀의 장점과 단점을 절충한 형태이다.
  • 그로스 조직이 일하는 방식
    • 데이터 기반으로 가설을 세우고
    • 실험을 바탕으로 이를 검증하고
    • 배움을 축적하는 과정을 반복한다.
    • 그로스 조직이 일하는 방식에서 가장 핵심이 되는 부분은 프로세스 전반에 걸쳐 목표와 실행이 서로 영향을 주고받아야 한다는 점이다.
      • 목표 지표 정의하기
      • 아이디에이션과 데이터분석
        • 다양한 아이디어를 생각하고 구체화하면서 아이디어 공급로를 채우는 것이 아이디에이션이다.
        • 아이디에이션은 특정 시기에만 하는게 아니라 스프린트의 전체 기간동안 지속적으로 진행해야한다
        • 좋은 아이디어는 여러 데이터와 시행착오를 거쳐서 조금씩 다듬어가는 과정을 통해 만들어진다.
      • 플래닝
        • 아이디어 공급로에 있는 아이디어의 우선순위를 정의하고 실험 대상이 되는 아이디어를 선별하는 프로세스를 의미
        • 임팩트(impact) : 이 실험이 성공하면 얼마나 큰 효과가 있는가?
        • 자신감(Confidence): 이 실험이 성공할 거라고 얼마나 확신하는가?
        • 난이도(Ease): 이 실험을 하기 위한 리소스가 얼마나 드는가?
      • 실험 준비, 진행, 분석
        • 개요: 실험을 하게 된 배경, 실험의 책임자가 누구인지, 각 파트별 담당자가 누구인지
        • 가설: 실험을 통해 검증하고자 하는 가설
        • 설계: 대상자, 실험 범위, 독립변수, 종속 변수, 통제변수, 측정방법
        • 목표: 종속 변수의 목표 수준
        • 일정: 실험을 위한 개발 및 배포 일정 , 실험 기간
      • 회고
        • 이번 스프린트를 통해 배운 것
        • 지금처럼 유지하거나 더 많이 할 것
        • 더 적게 하거나 다른 방법으로 할 것
  • 그로스는 톱 다운
    • 경영진을 설득하지 않아도 되는 그로스 조직은 출발선에서 이미 한참 앞서 있는 셈이다.
    • 경영진의 의지는 말이 아니라 투자하는 리소스로 증명된다.
    • 제품 개발과 그로스해킹 및 성장실험은 서로 대체제가 아니라 보완재로 활용돼야 한다.
    • 데이터가 흐르는 그로스 조직으로 만들어야한다.
    • 협업 문화를 만들어야한다.

3주동안 그로스 해킹 책을 읽어보았습니다. 정말 좋은 내용이 많았고 2번째 읽는거였지만 여전히 새로운 책입니다.

이번에 책을 읽으면서 얻은 인사이트를 바탕으로 더욱 성장할 수 있었으면 좋겠습니다.

좋은 기회에 이 책을 다시 읽어서 너무 좋았습니다.

감사합니다.

'책 서평' 카테고리의 다른 글

파이썬으로 배우는 통계학교과서  (1) 2024.12.18
그로스 해킹 3~4장  (0) 2024.11.18
밑바닥부터 시작하는 딥러닝 5를 읽고  (0) 2024.11.15
그로스 해킹 1장 ~ 3장  (2) 2024.11.10

안녕하세요! 오늘은 간단하면서도 재미있는 프로그래밍 문제를 함께 풀어보려고 합니다. 문제는 다음과 같습니다:

문제: 여러 학교의 한 해 동안 술 소비량 데이터가 주어졌을 때, 가장 많이 술을 마신 학교의 이름을 출력하라.

 

문제의 배경

입학 OT 때 누구보다도 열심히(?) 놀았던 당신은 자연스럽게 1학년 과대를 맡게 되었습니다. 조인트 엠티를 기획하던 중, 주변 학교 중에서 가장 술 소비가 많은 학교가 궁금해졌습니다. 각 학교의 술 소비량이 주어졌을 때, 가장 많이 술을 마신 학교를 찾는 프로그램을 만들어봅시다.

 

문제 설명

입력

  1. 첫 줄에 테스트 케이스 수 T가 주어집니다.
  2. 각 테스트 케이스의 첫 줄에는 학교의 수 N이 주어집니다.
  3. 이어서 N줄에 걸쳐 각 학교 이름 S와 해당 학교의 술 소비량 L이 주어집니다.
    • 예: Yonsei 20000

출력

  • 각 테스트 케이스마다 가장 술 소비량이 많은 학교 이름을 한 줄씩 출력합니다.

조건

  • 학교의 수 N은 1 이상 100 이하.
  • 소비량 L은 0 이상 10,000,000 이하.
  • 같은 테스트 케이스 내에서 소비량이 동일한 학교는 없습니다.

 

풀이 접근

  1. 입력 데이터를 처리하기
    첫 번째 줄에서 테스트 케이스 수 T를 입력받습니다.
    각 테스트 케이스는 학교의 수 N과 학교 이름 및 소비량 정보가 주어지므로 이를 반복문으로 처리합니다.
  2. 가장 많이 마신 학교 찾기
    각 학교의 이름과 술 소비량을 비교하며 최대 소비량과 그에 해당하는 학교 이름을 기록합니다.
  3. 결과 출력
    테스트 케이스마다 가장 많이 술을 마신 학교의 이름을 출력합니다.

코드 구현

# 테스트 케이스 수 입력
T = int(input("테스트 케이스 수를 입력하세요: "))

# 테스트 케이스 처리
for _ in range(T):
    # 학교의 수 입력
    N = int(input("학교의 수를 입력하세요: "))
    max_school = ""  # 술 소비량이 가장 많은 학교 이름 저장
    max_liquor = 0   # 최대 술 소비량 저장
    
    # N개의 학교 데이터 입력
    for _ in range(N):
        school, liquor = input("학교 이름과 술 소비량을 입력하세요: ").split()
        liquor = int(liquor)
        
        # 최대 소비량과 비교하여 업데이트
        if liquor > max_liquor:
            max_liquor = liquor
            max_school = school
    
    # 결과 출력
    print(max_school)

 

 

코드 설명

1. 테스트 케이스 수 입력

  • 첫 줄에 테스트 케이스 수 T를 입력받습니다.
  • T번 반복하면서 각각의 테스트 케이스를 처리합니다.

2. 학교 데이터 처리

  • 각 테스트 케이스에서 학교의 수 N과 이름-소비량 데이터를 입력받습니다.
  • 최대값 비교를 통해 가장 많이 술을 마신 학교와 그 소비량을 기록합니다.

3. 결과 출력

  • 각 테스트 케이스마다 최대 소비량을 가진 학교의 이름을 출력합니다.

 

예제 실행

입력 예제

2
3
Korea 10000
Yonsei 20000
Ewha 30000
2
SeoulTech 5000
KU 7000

 

출력 예제

Ewha
KU

 

실행 과정 설명

  1. 첫 번째 테스트 케이스:
    • Korea: 10000, Yonsei: 20000, Ewha: 30000 데이터를 비교하여 Ewha가 가장 많이 소비했으므로 출력.
  2. 두 번째 테스트 케이스:
    • SeoulTech: 5000, KU: 7000 데이터를 비교하여 KU가 가장 많이 소비했으므로 출력.

핵심 포인트

  • 입력 데이터 처리: 여러 테스트 케이스를 하나씩 처리하는 반복문 사용.
  • 최댓값 비교: 각 학교의 소비량을 비교하여 현재까지의 최댓값과 이름을 갱신.
  • 문제 해결 능력 향상: 데이터를 순차적으로 처리하면서 최대값을 구하는 방식은 다양한 문제에서 활용 가능!

마무리

이 문제는 간단한 반복문과 조건문을 활용하여 데이터를 처리하는 능력을 기르는 데 매우 유용합니다. 여러분도 직접 코드를 작성하고 실행해 보세요! 😊

궁금한 점이나 피드백이 있다면 댓글로 남겨주세요!

TODAY TIL

🔍 문제 소개

이번 포스팅에서는 배열에서 K번째 수를 찾는 문제를 다룹니다. 이 문제는 정렬 알고리즘의 기초를 연습하기에 적합하며, 간단한 구현으로도 해결할 수 있는 문제입니다. 문제를 이해하고, 순서대로 해결 방법과 코드를 공유하겠습니다!

 

📝 문제 설명

문제

  • 크기가 N인 배열 A가 주어집니다.
  • 배열 A를 오름차순으로 정렬했을 때, 앞에서부터 K번째 수를 출력하세요.

입력 조건

  1. 첫 번째 줄: 정수 N과 K
    • 1 ≤ N ≤ 5,000,000, 1 ≤ K ≤ N
  2. 두 번째 줄: 배열 A의 원소들
    • -10⁹ ≤ Aᵢ ≤ 10⁹

출력 조건

  • 배열을 정렬했을 때 앞에서부터 K번째 수를 출력합니다.

💡 풀이 방법

이 문제는 크게 3단계로 해결할 수 있습니다:

  1. 배열 입력받기
  2. 오름차순 정렬하기
  3. K번째 수 추출하기

🛠️ 코드 구현

Python을 사용하여 문제를 해결하는 코드는 다음과 같습니다:

# 입력 받기
import sys
input = sys.stdin.read
data = input().split()

# N: 배열의 길이, K: 찾고자 하는 위치
N, K = int(data[0]), int(data[1])
A = list(map(int, data[2:]))

# 배열을 정렬
A.sort()

# K번째 수 출력 (1-based index이므로 K-1 사용)
print(A[K - 1])

 

🔎 코드 설명

1️⃣ 입력 받기

  • Python의 sys.stdin.read를 사용해 입력 데이터를 한 번에 받습니다.
  • 첫 번째 줄에서 N(배열 길이)과 K(찾고자 하는 위치)를 가져옵니다.
  • 두 번째 줄에서 배열 A를 리스트로 변환합니다.

2️⃣ 배열 정렬

  • 배열 A를 sort() 메서드를 사용해 오름차순 정렬합니다.
    Python의 sort()는 Timsort 알고리즘을 기반으로 작동하며, 시간 복잡도는 **O(N log N)**입니다.

3️⃣ K번째 수 추출

  • 배열은 0부터 시작하는 0-based index입니다. 따라서 K번째 수를 찾으려면 A[K-1]을 사용합니다.

🧩 예제 풀이

예제 입력

5 2
4 1 3 2 5

 

풀이 과정

  1. 배열의 길이 N = 5, K번째 위치 K = 2
    배열 A = [4, 1, 3, 2, 5]
  2. 배열 정렬:
A.sort() → [1, 2, 3, 4, 5]

 

3. K번째 수 추출:

A[K-1] = A[1] = 2

 

4. 출력 결과:

2

 

⏱️ 시간 복잡도 분석

  1. 배열 정렬: 정렬의 시간 복잡도는 O(N log N)
  2. K번째 수 추출: 상수 시간 O(1)

따라서 전체 시간 복잡도는 **O(N log N)**입니다.


📌 추가 팁: 더 효율적인 방법은 없을까?

만약 배열이 매우 커서 메모리나 시간 효율이 중요하다면, Quickselect 알고리즘을 사용해 K번째 수를 찾을 수 있습니다. Quickselect는 평균적으로 **O(N)**의 시간 복잡도로 실행됩니다. 그러나 이 문제에서는 Python의 내장 정렬을 사용하는 것이 가장 간단하고 안정적인 방법입니다.


✅ 마무리

배열에서 K번째 수를 찾는 문제는 정렬 알고리즘과 리스트 활용법을 연습할 수 있는 좋은 문제입니다. 이번 포스팅에서는 Python의 기본 정렬 메서드인 sort()를 사용하여 문제를 간단히 해결했지만, 다른 알고리즘을 적용해보는 것도 추천합니다!

TODAY TIL

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 일정 기준 이상으로 만들고 싶어합니다. 이 문제를 해결하기 위해 Python에서 **우선순위 큐(Priority Queue)**를 사용하여 효율적으로 푸는 방법을 소개합니다.

 

문제 설명

Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 아래의 규칙을 사용해 음식을 섞습니다:

  1. 스코빌 지수가 가장 낮은 두 개의 음식을 선택합니다.
  2. 이 두 음식을 섞어 새로운 음식의 스코빌 지수를 계산합니다: 섞은 음식의 스코빌 지수=가장 낮은 스코빌 지수+(두 번째로 낮은 스코빌 지수×2)\text{섞은 음식의 스코빌 지수} = \text{가장 낮은 스코빌 지수} + (\text{두 번째로 낮은 스코빌 지수} \times 2)
  3. 모든 음식의 스코빌 지수가 K 이상이 될 때까지 위 과정을 반복합니다.

입력 조건:

  • scoville: 각 음식의 스코빌 지수가 담긴 배열 (길이: 2 이상 1,000,000 이하).
  • K: 목표 스코빌 지수 (0 이상 1,000,000,000 이하).

출력 조건:

  • 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 반환합니다.
  • 불가능한 경우 -1을 반환합니다.

문제 해결 접근법

이 문제는 최소값과 두 번째 최소값을 반복적으로 선택하는 작업이 필요하므로, **우선순위 큐(Priority Queue)**를 사용하는 것이 효율적입니다. Python에서는 heapq 모듈을 사용해 이를 간단히 구현할 수 있습니다.

 

풀이 과정

  1. 힙으로 변환
    • heapq.heapify()를 사용해 입력 배열을 최소 힙으로 변환합니다.
    • 힙 구조를 사용하면 최소값을 빠르게 추출할 수 있습니다.
  2. 반복 작업
    • 가장 작은 두 값을 추출하여 새로운 값을 계산합니다.
    • 계산된 값을 다시 힙에 삽입하고, 섞은 횟수를 증가시킵니다.
  3. 종료 조건
    • 힙에서 가장 작은 값이 K 이상이면 작업을 종료하고 섞은 횟수를 반환합니다.
    • 힙에 하나의 값만 남았는데도 K 이상이 되지 않으면 불가능하므로 -1을 반환합니다.

Python 코드

import heapq

def solution(scoville, K):
    # 1. 배열을 최소 힙으로 변환
    heapq.heapify(scoville)
    mix_count = 0

    # 2. 반복적으로 가장 작은 두 값을 섞음
    while len(scoville) > 1:
        # 최소 두 개 값을 꺼내 섞기
        first = heapq.heappop(scoville)  # 가장 작은 값
        if first >= K:
            return mix_count  # 모든 값이 K 이상이므로 종료
        second = heapq.heappop(scoville)  # 두 번째로 작은 값
        new_scoville = first + (second * 2)
        heapq.heappush(scoville, new_scoville)  # 섞은 값 삽입
        mix_count += 1

    # 3. 힙에 하나만 남은 경우 확인
    if scoville[0] >= K:
        return mix_count
    else:
        return -1  # 모든 값을 K 이상으로 만들 수 없는 경우

 

예제 실행

입력

scoville = [1, 2, 3, 9, 10, 12]
K = 7

 

실행 과정

  1. 초기 힙 구성: [1, 2, 3, 9, 10, 12]
  2. 첫 번째 섞기:
    • 선택: 1, 2
    • 새 값: 1 + (2 * 2) = 5
    • 힙 상태: [3, 5, 9, 10, 12]
    • 섞은 횟수: 1
  3. 두 번째 섞기:
    • 선택: 3, 5
    • 새 값: 3 + (5 * 2) = 13
    • 힙 상태: [9, 10, 12, 13]
    • 섞은 횟수: 2
  4. 세 번째 섞기:
    • 선택: 9, 10
    • 새 값: 9 + (10 * 2) = 29
    • 힙 상태: [12, 13, 29]
    • 섞은 횟수: 3
  5. 종료 조건 확인: 힙의 최솟값이 12로 K 이상이므로 종료.

출력

solution(scoville, K)  # 결과: 3

 

결과 및 시간 복잡도 분석

  1. 결과: 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 최소 3번 섞어야 합니다.
  2. 시간 복잡도:
    • 힙 연산(삽입, 삭제)의 시간 복잡도: O(log⁡N)O(\log N)
    • 최대 N번 반복하므로 총 시간 복잡도: O(Nlog⁡N)O(N \log N)

핵심 포인트 정리

  • 힙 사용의 효율성: 최소값과 두 번째 최소값을 빠르게 추출하고 삽입.
  • 종료 조건의 이해: 모든 값이 K 이상이 되는 순간 종료.
  • 예외 처리: 모든 값을 K 이상으로 만들 수 없는 경우 -1 반환.

이 풀이를 통해 효율적인 문제 해결 방법과 Python에서 힙을 사용하는 기법을 배울 수 있었습니다. Leo의 매운맛 도전, 이제 여러분도 성공시켜 보세요! 🔥

TODAY TIL

다솜이는 사람의 마음을 읽는 기계를 이용해 국회의원 선거에서 자신을 찍지 않을 사람들을 매수하려고 합니다. 목표는 다른 후보들의 득표수를 초과하는 것입니다. 이 글에서는 다솜이가 최소 몇 명을 매수해야 당선될 수 있는지를 계산하는 방법을 설명합니다.

 

문제 설명

  1. 입력 조건:
    • 후보 수 NN이 주어집니다.
    • 각 후보의 득표수가 순서대로 입력됩니다.
    • 기호 1번 후보가 다솜이입니다.
  2. 출력 조건:
    • 다솜이가 매수해야 하는 사람의 최소 수를 출력합니다.
  3. 제약 조건:
    • 후보 수 NN: 최대 50
    • 각 후보의 득표수: 최대 100
  4. 예제 입력/출력

입력:

3
5
7
7

 

출력:

2

 

해결 방법

문제를 해결하기 위해 다음과 같은 단계로 접근합니다:

  1. 입력 데이터를 읽기:
    • 후보 수와 각 후보의 득표수를 리스트로 저장합니다.
    • 다솜이의 득표수는 따로 저장하고, 나머지 후보들의 득표수를 관리합니다.
  2. 매수 작업 반복:
    • 다른 후보들의 득표수를 내림차순으로 정렬합니다.
    • 가장 많은 득표수를 가진 후보를 매수하여 다솜이의 득표수를 증가시킵니다.
    • 다솜이의 득표수가 다른 모든 후보보다 많아질 때까지 이 작업을 반복합니다.
  3. 매수 횟수 계산:
    • 매수 횟수를 카운트하면서, 다솜이의 득표수가 다른 후보들보다 많아질 때 결과를 출력합니다.

Python 코드

# 입력받기
N = int(input())  # 후보 수
votes = [int(input()) for _ in range(N)]  # 각 후보의 득표수

# 초기 설정
dasom_votes = votes[0]  # 다솜이의 득표수
other_votes = votes[1:]  # 다른 후보들의 득표수
bribes = 0  # 매수한 사람 수

# 매수 작업
while other_votes and max(other_votes) >= dasom_votes:
    # 가장 많은 득표수를 가진 후보의 표를 매수
    max_index = other_votes.index(max(other_votes))  # 최대값의 인덱스 찾기
    other_votes[max_index] -= 1  # 표 매수 (1 감소)
    dasom_votes += 1  # 다솜이의 표 증가
    bribes += 1  # 매수 횟수 증가

# 결과 출력
print(bribes)

 

코드 설명

  1. 입력 처리:
    • 후보 수 NN과 각 후보의 득표수를 입력받아 리스트로 저장합니다.
    • 다솜이의 득표수는 dasom_votes에, 나머지 후보들의 득표수는 other_votes 리스트로 관리합니다.
  2. 매수 작업:
    • while 루프를 통해 다솜이의 득표수가 다른 후보들의 최대 득표수를 초과할 때까지 반복합니다.
    • 가장 많은 득표수를 가진 후보의 표를 하나 매수하고, 다솜이의 득표수를 증가시킵니다.
  3. 결과 출력:
    • 매수 횟수는 bribes 변수에 저장되며, 반복이 끝나면 최솟값이 출력됩니다.

예제 실행

입력

3
5
7
7

 

출력

2

 

추가 설명

이 코드의 핵심은 다솜이의 득표수가 다른 후보들보다 많아질 때까지 반복적으로 매수하는 것입니다. 가장 득표수가 많은 후보를 우선 매수하는 전략을 사용하여 최솟값을 계산합니다.


최적화 고려사항

  • 후보 수 NN이 최대 50이므로, 매수 작업의 복잡도는 적절한 수준입니다.
  • max\text{max} 연산을 사용하는 만큼, 리스트 길이에 따라 작업 시간이 영향을 받을 수 있습니다.

마무리

이 문제는 그리디 알고리즘을 활용하여 반복적으로 최대값을 줄이는 전략을 사용합니다. 매수 전략을 효율적으로 구현하여 다솜이가 국회의원에 당선되도록 만드는 과정을 함께 배웠습니다.

코드와 예제 실행 결과를 참고하여 자신만의 해결 방법을 구현해 보세요! 😊

+ Recent posts