[1스4코1파] 1명의 스위프트 개발자와 4명의 코틀린 개발자, 1명의 파이썬 개발자코딩 테스트 서막 : 1스4코1파

Rule :

하루에 1문제씩 풀기.
한 문제당 30분씩은 고민하기.
왜 그렇게 풀었는지 공유하기.
하루라도 놓친다면 벌금은 1,000원
백준 플래티넘, 프로그래머스 4단계, 개발자 탈퇴 시 모임 탈퇴 가능

START :

[3코1파] 2023.01.04~ (109일차)
[4코1파] 2023.01.13~ (100일차)
[1스4코1파] 2023.04.12~ (11일차)

Today :

2023.04.22 [109일차]

프로그래머스 LV 2
시소 짝꿍
https://school.programmers.co.kr/learn/courses/30/lessons/152996

문제 설명

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

제한사항

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

입출력 예

입출력 예 설명

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

문제 풀이 방법

안일하게 생각했던 나의 생각은 최대공약수를 생각했었는데.. 뭔가 로직으로 구현하면서 빈틈이 생겨서
다른 방법인
주어진 시소 weights 들을 순회하면서 2,3,4 곱한후 다음 인덱스의 값과 비교해서 같으면 +1 해주는 것...

응.. 틀렸쥬..

시간초과가 나서 저 로직은 안될 것 같아서
일단 서로 균형을 이루려면 1:1, 2:3, 2:4, 3:4 비율을 이루면 평행이 가능함을 알게됨

1:1은 counter로 세고 나머지는 for 문으로 해결

내 코드


from collections import Counter


def solution(weights):
    answer = 0
    
    counter = Counter(weights)
    for k,v in counter.items():
        if v>=2:
            answer+= v*(v-1)//2
    weights = set(weights) 

    for w in weights:
        if w*2/3 in weights:
            answer+= counter[w*2/3] * counter[w]
        if w*2/4 in weights:
            answer+= counter[w*2/4] * counter[w]
        if w*3/4 in weights:
            answer+= counter[w*3/4] * counter[w]
    return answer

증빙

다른 사람 풀이

내가 하려고 했던 방식이랑 유사해서 가져옴

여담

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글