본문 바로가기
코딩 테스트/코딩 테스트 - 문제

(프로그래머스) 시소 짝꿍

by 안스 인민군 2023. 2. 1.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

처음 내가 한 말못된 풀이

나는 combination을 이용하엿으나 시간 초과가 난다....

이유는100.000이란 범위가 주어졌기 때문이다.

from itertools import combinations
def solution(weights):
    combi = list(combinations(weights,2))
    
    result = 0
    for com in combi:
        if com[0] == com[1]: result += 1
        a = min(com[0],com[1])
        b = max(com[0],com[1])
        if b*2 == a*3: 
            result += 1
        elif b*2 == a*4: 
            result += 1
        elif b*3 == a*4: 
            result += 1

    return result

정답

1. 모든 값을 Counter함수를 이용하여 분류하였다.

2. 분류한 값중 1이 넘는 것은 조합식을 이용하여 값을 더하였다.

(이유는 3일경우 3개를 섞어서 짝을 만들 수 있으니까 3C2)

3. 이제 중복된건 2번에서 해결하였으니까 set함수를 통해 list(weight)를 만들어 준다.

4. 이제 (3/4,2/3,2/4)라는 리스트(check)를 만들어 item *check 가  weight에 있는지 확인하고

    4-1 확인했다면 아까 만든 카운트 함수에서 count[item *check] 와 count[item] 의 갯수를 가져와 곱한 후 결과값에 더한  다. (이유는 count에는 중복인 예를 들면 예시처럼 10같은게 있으니까 갯수를 곱하는게 맞음)

5. 결과값을 출력한다.

from collections import Counter
def solution(weights):
    result = 0
    count = Counter(weights)
    for key in count:
        if count[key] > 1:
            result += (count[key])*(count[key]-1)//2
    
    list1 = list(set(weights))
    for li in list1:
        for check in (2/4,3/4,2/3):
            if li*check in list1:
                result += count[li*check] * count[li]
    
    return result