https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

서로주고 받은 선물내역을 조사해서 받은것보다 준게 많은 사람은 인센티브를 받는데 인센티브 동점자가 생기면 동점자의 수를 출력한다. 서로주고 받은게 같다면 인센티브가 없다. 로직은 어렵지 않는데 조건이 까다롭다.

서로 주고 받은 내역의 행렬은 dict을 이용 간단히 할수 있는데 모든이에게 주고 받은 선물지수계산은 사람마다 행과 열을 합의 차를 계산해야하는데 

def solution(friends, gifts):
    matrix = [[0 for _ in range(len(friends))] for _ in range(len(friends))]
    bonus = [[0 for _ in range(len(friends))] for _ in range(len(friends))]
    friendid = {name:id for id,name  in enumerate(friends) }
    #print(friendid)
    for gift in gifts:
        togift = gift.split()
        #print(togift)
        matrix[friendid[togift[0]]][friendid[togift[1]]] += 1
    giftindex = [[0,0,0] for _ in range(len(friends))]
    # 선물지수 계산을 위해 받고 준걸 정리
    for i in range(len(matrix)):
      for j in range(len(matrix)):
        giftindex[i][0] +=  matrix[i][j]
        giftindex[i][1] +=  matrix[j][i]
    # 선물지수 계산
    for i in range(len(giftindex)):
      giftindex[i][2] = giftindex[i][0] - giftindex[i][1]

    # 서로 주고 받은것 계산
    bonussum = [ 0 for _ in range(len(bonus))]
    for i in range(len(bonus)):
      for j in range(len(bonus[0])):
        bonus[i][j] = matrix[i][j] - matrix[j][i]
        bonussum[i] += 1 if bonus[i][j]>0 else 0
        if bonus[i][j] == 0 and giftindex[i][2] > giftindex[j][2]:
          bonussum[i] += 1
    return max(bonussum)

friends = ["a", "b", "c"]
gifts = ["a b", "b a", "c a", "a c", "a c", "c a"]
solution(friends, gifts)

다른 분이 푼게 나보다 10줄이나 간결해서 분석해 보왔다. 선물지수 p계산을 2줄로 끝냈다.

    for i in range(l):  #준것합 -  받은것합을 계산해서 선물지수 p에 저장
        p[i] = sum(gr[i]) - sum([k[i] for k in gr])

for 문아래 이중sum을 넣어 3중 반복문을 만들어 수평과 수직행렬을 한번에 계산한다. 칭찬해주고 싶다.

def solution(friends, gifts):
    f = {v: i for i, v in enumerate(friends)} # 이름을 키로 dict을 만든다
    l = len(friends)
    p = [0] * l #
    answer = [0] * l #받을 보너스의 개수를 저장
    gr = [[0] * l for i in range(l)]
    for i in gifts:  #선물을 주고 받은 내역을 풀어서
        a, b = i.split()
        gr[f[a]][f[b]] += 1  #선물을 주고 받은 내역을 메트릭스에 저장
    for i in range(l):  #준것합 -  받은것합을 계산해서 선물지수 p에 저장
        p[i] = sum(gr[i]) - sum([k[i] for k in gr])

    for i in range(l):
        for j in range(l):
            if gr[i][j] > gr[j][i]: #내가 준게 커야하고
                answer[i] += 1
            elif gr[i][j] == gr[j][i]: #같다면 
                if p[i] > p[j]:        #선물지수가 커야한다.
                    answer[i] += 1
    return max(answer)

friends = ["a", "b", "c"]
gifts = ["a b", "b a", "c a", "a c", "a c", "c a"]
solution(friends, gifts)

+ Recent posts