시소 짝꿍 - 파이썬

구기성·2023년 1월 26일
0

알고리즘

목록 보기
25/31

시소 짝꿍

문제 설명

어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.

제한사항

제한 사항

  • 2 ≤ weights의 길이 ≤ 100,000
  • 100 ≤ weights[i] ≤ 1,000
    - 몸무게 단위는 N(뉴턴)으로 주어집니다.
    - 몸무게는 모두 정수입니다.

입출력예

weights = [100,180,360,100,270]
result = 4

입출력예 설명

{100, 100} 은 서로 같은 거리에 마주보고 앉으면 균형을 이룹니다.
{180, 360} 은 각각 4(m), 2(m) 거리에 마주보고 앉으면 균형을 이룹니다.
{180, 270} 은 각각 3(m), 2(m) 거리에 마주보고 앉으면 균형을 이룹니다.
{270, 360} 은 각각 4(m), 3(m) 거리에 마주보고 앉으면 균형을 이룹니다.

문제 풀이(실패)

  1. 콤비네이션을 통해 2개를 추출하는 경우의 수를 구하자
  2. 2개의 수에서 가장 큰 수와 가장 작은수를 나눠서 비율을 찾자
  3. [1, 4/3, 4/2, 3/2] 비율을 갖는 경우 answer값을 추가하자

코드(실패)

from itertools import combinations

def solution(weights):
    answer = 0
    case = list(combinations(weights, 2))
    case.sort(key=lambda x: (x[0]))

    for item in case:
        minNum = min(item[0], item[1])
        maxNum = max(item[0], item[1])
        temp = maxNum / minNum
        
        if temp in [1, 3/2, 4/3, 4/2]:
            answer += 1
        
    return answer

실패 이유

  1. 시간 초과가 발생한다.
  • 콤비네이션 결과가 생각보다 오래 걸린다. 그러므로 해당 문제에 적합하지 않았다. weight의 길이는 2이기 때문에 적합하지 않았다.

문제 풀이(성공)

  1. collections의 Counter를 통해 각 weigth 원소에 대해서 개수를 구함
  2. 같은 원소가 있는 경우 answer 추가를 미리 해줌
  3. 중복되는 원소들은 2번에서 처리를 해줬기 때문에 set을 통해서 제거
  4. 같은 원소에 대해서 처리를 했기 때문에 3/4, 2/3, 2/4의 비율을 가지는 weight 원소에 대해서 처리
  5. 비율에 맞는 원소가 있다면 answer값 증가

코드

from collections import Counter

def solution(weights):
    answer = 0
    count = Counter(weights)
    for k, v in count.items():
        if v > 1:
            answer += v * (v - 1) // 2
    
    weights = list(set(weights))
    for item in weights:
        for check in (3/4, 2/3, 2/4):
            if item * check in weights:
                answer += count[item] * count[item * check]
                
    return answer

0개의 댓글