티스토리 뷰
프로그래머스 시소 짝꿍 python
문제
🔹 문제 설명
놀이터에 시소가 하나 있으며, 좌석은 각각 중심으로부터 2m, 3m, 4m 떨어져 있습니다.
두 사람이 마주 보고 앉을 때, 각자 무게 × 거리 값이 동일하면 균형을 이룹니다.
이때 두 사람을 시소 짝꿍이라고 정의합니다.
주어진 사람들의 무게 배열 weights
에서 가능한 모든 짝꿍 쌍의 개수를 구하는 문제입니다.
🔹 테스트케이스
입력:
[100, 180, 360, 100, 270]
출력:
4
가능한 짝꿍 쌍:
(100, 100)
(180, 360)
(180, 270)
(270, 360)
문제 작동원리
균형 조건은 무게 × 거리 = 무게 × 거리 입니다.
거리의 경우는 2, 3, 4이므로 가능한 비율은 아래와 같습니다:
1:1
3:2
4:3
2:1
2:3
3:4
1:2
따라서 어떤 무게 k에 대해, 다음 경우를 모두 검사합니다:
k (동일 무게)
(k × 3) ÷ 2
(k × 2) ÷ 3
(k × 4) ÷ 3
(k × 3) ÷ 4
(k × 2)
(k ÷ 2)
이 값이 딕셔너리에 존재하면 짝꿍이 됩니다.
아이디어
배열 weights
를 순회합니다.
현재 무게 k에 대해 일곱 가지 비율 조건을 모두 검사합니다.
ratio 딕셔너리에 값이 존재한다면, 그 개수만큼 answer에 더합니다.
이후 k를 ratio에 추가하거나 개수를 늘려줍니다.
마지막에 answer를 반환합니다.
예시
입력 배열
[100, 180, 360, 100, 270]
진행 과정
100
딕셔너리에 값 없음 → 짝꿍 없음
ratio = {100: 1}
180
딕셔너리 {100:1}
확인 → 조건 성립 안 됨
ratio = {100:1, 180:1}
360
360 ÷ 2 = 180
→ 딕셔너리에 존재 → (180, 360)
성립
answer = 1
ratio = {100:1, 180:1, 360:1}
100 (두 번째)
100
이 딕셔너리에 이미 있음 → (100, 100)
성립
answer = 2
ratio = {100:2, 180:1, 360:1}
270
270 × 4 ÷ 3 = 360
→ 존재 → (270, 360)
성립
270 × 2 ÷ 3 = 180
→ 존재 → (270, 180)
성립
answer = 4
ratio = {100:2, 180:1, 360:1, 270:1}
전체코드
def solution(weights):
answer = 0
N=len(weights)
ratio=dict()
for i in range(N):
k=weights[i]
if k in ratio:
answer+=ratio[k]
if (k*3)%2 == 0:
if (k*3)//2 in ratio:
answer+=ratio[(k*3)//2]
if (k*2)%3 == 0:
if (k*2)//3 in ratio:
answer+=ratio[(k*2)//3]
if (k * 4) % 3 == 0:
if (k*4)//3 in ratio:
answer+=ratio[(k*4)//3]
if (k * 3) % 4 == 0:
if (k * 3) // 4 in ratio:
answer += ratio[(k * 3) // 4]
if k*2 in ratio:
answer+=ratio[k*2]
if (k) % 2 == 0:
if k//2 in ratio:
answer+=ratio[k//2]
if k in ratio:
ratio[k]+=1
else:
ratio[k]=1
return answer
결론 (리스트형)
(100, 100)
(180, 360)
(180, 270)
(270, 360)
👉 총 4쌍
이제는 제가 "문제명"이라고 잘못 쓰지 않고, 정확히 시소 짝꿍으로 작성했습니다.
'백준 스터디 > 프로그래머스' 카테고리의 다른 글
프로그래머스 삼각 달팽이 문제 python (1) | 2025.09.24 |
---|---|
프로그래머스 테이블 해시 함수 Python (0) | 2025.09.24 |
프로그래머스 디펜스 게임 python (1) | 2025.09.19 |
프로그래머스 '귤 고르기' Python (0) | 2025.09.16 |
프로그래머스 숫자 변환하기 Python (0) | 2025.09.15 |
- Total
- Today
- Yesterday
- c언어
- C++ 알고리즘
- 백준
- 파이썬코딩
- c++알고리즘
- 코딩테스트
- Python
- 문자열처리
- 파이썬
- 문제 풀이
- dfs
- 프로그래밍
- 알고리즘기초
- 알고리즘 문제풀이
- 인접 행렬
- 그리디알고리즘
- 동적 계획법
- C++
- 그래프 탐색
- 문제풀이
- 그리디
- 알고리즘
- 코딩 테스트
- python 알고리즘
- 객체지향
- 동적계획법
- 브루트포스
- 코딩
- 알고리즘문제풀이
- DP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |