티스토리 뷰
< 해설 >
코딩테스트 초창기에 풀다가 못풀었던 나름 사연있는 문제.
보통 답으로 long long 을 요구하는 문제는 무지성 for문을 이용하면 시간초과가 나게 되어있다. 이거 나름 코딩테스트 꿀팁임.
동일한 몸무게에 대한 중복연산을 하지 않으려고 map을 사용했다.
map을 사용해서 요소 하나하나 비교하면서 2:4, 3:4, 2:3 의 비율을 가진 몸무게를 찾으면 된다.
여기서! 내가 헷갈렸던 부분.
만약 100짜리 몸무게를 가진 친구들이 4명이라고 하자. 그러면 100 몸무게를 가진 친구들끼리 시소를 탈 수 있는 값은 6번이 된다.
동일한 몸무게를 가진 친구들은 nC2, 즉 n * n-1 / 2를 해 주어야 한다.
그렇다면 만약 2:4를 만족하는 케이스인 100 과 200이 있다고 하자. 100 몸무게를 가진 친구가 2명, 200 몸무게를 가진 친구가 3명이라면 answer에는 2*3 인 6이 더해져야 한다. 나는 이거 안하고 그냥 answer += n 해서 오류파티 했음... ㄱ-
주어진 테스트 케이스로는 확인할 수 없는 부분이라 신경을 못쓴것 같다. 이 부분만 신경 쓴다면 금새 해결할 수 있을 것이다. (물론 난 몰라서 ㅈㄴ 오래 걸렸다.)
< 문제 >
어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.
제한 사항
- 2 ≤ weights의 길이 ≤ 100,000
- 100 ≤ weights[i] ≤ 1,000
- 몸무게 단위는 N(뉴턴)으로 주어집니다.
- 몸무게는 모두 정수입니다.
입출력 예
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) 거리에 마주보고 앉으면 균형을 이룹니다.
< 풀이 >
#include <string>
#include <vector>
#include <map>
using namespace std;
long long solution(vector<int> weights) {
long long answer = 0;
map<long long, long long> weightMap;
for(const auto& w :weights)
weightMap[w]++;
auto iter = weightMap.begin();
while(iter != weightMap.end())
{
long long w = iter->first;
// 2 : 3
if (w % 2 == 0)
{
if (weightMap.find(w / 2 * 3) != weightMap.end())
answer += weightMap[w / 2 * 3] * iter->second;
}
// 3 : 4
if (w % 3 == 0)
{
if (weightMap.find(w / 3 * 4) != weightMap.end())
answer += weightMap[w / 3 * 4] * iter->second;
}
// 2:4 -> 1:2
if (weightMap.find(w * 2) != weightMap.end())
answer += weightMap[w * 2] * iter->second;
// 같은 경우
if (weightMap[w] != 0)
answer += (weightMap[w] * (weightMap[w]-1)) / 2;
iter++;
}
return answer;
}
'공부 > 코딩테스트' 카테고리의 다른 글
[ 프로그래머스 C++ ] 호텔 대실 lv2 (0) | 2023.06.14 |
---|---|
[ 프로그래머스 C++ ] 숫자 변환하기 lv2 (0) | 2023.06.13 |
[ 프로그래머스 C++ ] 롤케이크 자르기 lv2 (0) | 2023.06.08 |
[ 프로그래머스 C++ ] 미로 탈출 lv2 (0) | 2023.06.07 |
[ 프로그래머스 C++ ] 단속카메라 lv3 (0) | 2023.06.06 |
- Total
- Today
- Yesterday
- 스택/큐
- 데디케이티드
- sort
- 고득점kit
- DFS
- C++
- 고득점 Kit
- UE5
- 너비우선탐색
- Ue
- IMGUI
- LV3
- Heap
- 디자인 패턴
- 누적합
- Unreal 5.1
- 재귀
- level3
- LV2
- 채팅서버
- 힙
- 정렬
- 완전탐색
- 프로그래머스
- 탐욕법
- greedy
- BFS
- 개인공부
- FPS
- 해시
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |