[이코테] 그리디 문제 풀이 - 볼링공 고르기

Gorae·2021년 6월 4일
0

알고리즘

목록 보기
3/19
post-thumbnail
본 내용은 나동빈 님의 ‘이것이 취업을 위한 코딩 테스트다 with 파이썬’ 책을 공부하며 쓴 글입니다.

Q5. 볼링공 고르기

문제 요약

A, B 두 사람은 서로 무게가 다른 볼링공을 고른다. N개의 볼링공에 각 공마다 무게가 적혀 있고, 같은 무게라도 서로 다른 공으로 간주됨. 무게는 1부터 M까지 자연수 형태. N,M 이 첫째줄에 주어지고, 둘째줄에 각 볼링공의 무게 K가 공백으로 구분돼 순서대로 주어짐. 볼링공을 고르는 경우의 수를 구하라.(1<=N<=1,000, 1<=M<=10)

풀이 순서

  1. 무게가 1부터 10으로 한정돼 있으므로 같은 무게를 가지는 볼링공의 수를 계산한다.
  2. A가 특정한 무게의 볼링공을 선택했을 때, B가 볼링공을 선택하는 경우의 수를 차례대로 계산한다. 이미 계산했던 경우는 제외한다.(조합)

나의 풀이

n,m = map(int, input().split())
weight = list(map(int, input().split()))
weights = [0] * len(weight)
sum = 0

for i in range(n):
    weights[weight[i]] += 1

for i in range(1, m+1):
    sum += weights[i] * (n - weights[i])
    n -= weights[i]

print(sum)

답안 예시

n,m = map(int, input().split())
data = list(map(int, input.split()))

# 1부터 10까지 무게를 담을 수 있는 리스트
array = [0] * 11

# 각 무게에 해당하는 볼링공의 개수 카운트
for x in data:
    array[x] += 1

result = 0

for i in range(1, m+1):
    n -= array[i]
    result += array[i] * n

print(result)

느낀점

  • 모범 답안이 훨씬 가독성이 좋고, 쓸데없이 반복되는 코드가 없었음을 확인했다. 순서만 바꿔도 코드가 짧아질 수 있으며, 변수를 어떻게 쓰느냐에 따라 가독성이 달라진다.
profile
좋은 개발자, 좋은 사람

0개의 댓글