입력으로 주어진 음식들 중에서 두 개를 선택했을 때, 맛있는 정도의 합이 2의 지수가 되는 경우의 수를 찾는 문제이다.
문제를 봤을 때, 바로 조합을 이용하는 방법이 생각났지만, 시간 복잡도 상 당연히 조합은 안 되었다.
그래서 일단 맛있는 정도를 Key, 등장 횟수를 value로 하는 해쉬맵을 만들고, 해당 해쉬맵을 순회하면서
모든 경우의 수를 찾는 시간복잡도 O(N)의 방법으로 해결했다.
여담으로 리트코드 채점 서버가 좀 이상한 거 같다.
같은 코드를 제출해도 수행시간이 2배까지도 차이가 났다...
음... 백준처럼 채점 서버에 제출이 몰리면 순차적으로 수행하는 게 아니라 그냥 동시에 돌리는 건가
C++
더보기
class Solution {
public:
int countPairs(vector<int>& deliciousness) {
vector<int> two;
for(int i = 0;i < 22; ++i)
two.push_back(pow(2,i));
unordered_map<int, long long> meals;
for(size_t i=0;i<deliciousness.size();++i)
if (meals.find(deliciousness[i])!=meals.end())
++meals[deliciousness[i]];
else
meals[deliciousness[i]] = 1;
int cnt{};
long long temp;
for(auto it = meals.begin(); it!=meals.end(); ++it){
int t = 0;
while(t < 22 && it -> first * 2 >= two[t]) ++t;
if (t != 0 && it -> first * 2 == two[t - 1]){
temp = it -> second;
cnt = (cnt + temp * (temp - 1) / 2 % 1000000007) % 1000000007;
}
for(;t < 22; ++t){
temp = two[t] - it -> first;
if (meals.find(temp)!=meals.end()){
cnt = (cnt + it -> second * meals[temp] % 1000000007) % 1000000007;
}
}
}
return cnt;
}
};
Python
더보기
class Solution:
def countPairs(self, deliciousness: List[int]) -> int:
two = [1<<i for i in range(22)]
meals = dict()
for d in deliciousness:
if d in meals:
meals[d] += 1
else:
meals[d] = 1
cnt = 0
for meal in meals.keys():
t = 0
while t < 22 and meal * 2 >= two[t]:
t += 1
if (t != 0 and meal * 2 == two[t - 1]):
temp = meals[meal]
cnt = (cnt + temp * (temp - 1) / 2 % 1000000007) % 1000000007
while t < 22:
temp = two[t] - meal
if temp in meals.keys():
cnt = (cnt + meals[meal] * meals[temp] % 1000000007) % 1000000007
t += 1
return int(cnt)
728x90
'Problem Solving > Leet Code' 카테고리의 다른 글
1705 Maximum Number of Eaten Apples (0) | 2021.01.11 |
---|---|
1704 Determine if String Halves Are Alike (0) | 2021.01.11 |
1713 Minimum Operations to Make a Subsequence (0) | 2021.01.08 |
1712 Ways to Split Array Into Three Subarrays (0) | 2021.01.08 |
1710 Maximum Units on a Truck (0) | 2021.01.07 |