[자바 공부] 시소 짝꿍
문제
문제 설명
어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights
이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.
제한 사항
- 2 ≤
weights
의 길이 ≤ 100,000 - 100 ≤
weights
[i] ≤ 1,000- 몸무게 단위는 N(뉴턴)으로 주어집니다.
- 몸무게는 모두 정수입니다.
입출력 예시
입출력 예 #1
weights | result |
---|---|
[100,180,360,100,270] | 4 |
입출력 예 설명
{100, 100} 은 서로 같은 거리에 마주보고 앉으면 균형을 이룹니다.
{180, 360} 은 각각 4(m), 2(m) 거리에 마주보고 앉으면 균형을 이룹니다.
{180, 270} 은 각각 3(m), 2(m) 거리에 마주보고 앉으면 균형을 이룹니다.
{270, 360} 은 각각 4(m), 3(m) 거리에 마주보고 앉으면 균형을 이룹니다.
해결방안
solution#1
오류
해당 문제를 이중 for문으로 푼다면 n^2으로 시간초과가 나버린다. 그리고 중복을 고려 해야 하는데 중복이 있으면 짝꿍이 그만큼 똑같은 쌍으로 늘어나는데 예를 들어 100, 100 ,200 있으면 (100,200) (100,200) 형식으로 한쌍이 된다는 것을 고려해주어야 한다.
접근방법
먼저 해당 문제에 비율을 생각한다면 1:1 , 3:4, 2:4, 2:3일 때 경우에 해당한다. 오름 차순으로 정렬을 해주었기에 해당 비율만 접근하면 되고 기존 key값과 같으면 answer를 늘려주었다. 그리고 map에 그만큼 비율의 무게를 넣어주고 해당 무게의 value를 weight개수로 넣게 해주어 중복일 경우 따로 빼주는 것 없이 한번에 체크를 해주었다.