🔗 문제 링크
https://www.hackerrank.com/challenges/icecream-parlor/problem?isFullScreen=true
✏️ 풀이
function icecreamParlor(m, arr) {
const prices = arr.reduce((acc, v) => {
if (acc[v]) {
acc[v]++;
} else {
acc[v] = 1;
}
return acc;
}, {});
const firstPrice = Number(
Object.keys(prices).find(key =>
m === key * 2
? prices[key] > 1
: prices[m - key]
)
);
const secondPrice = m - firstPrice;
if (firstPrice === secondPrice) {
return arr.map((price, index) => price === firstPrice ? index + 1 : 0).filter(Boolean);
}
return [firstPrice, secondPrice]
.map(price => arr.findIndex(v => v === price) + 1)
.sort((a, b) => a - b);
}
먼저 아이스크림의 가격별 개수를 세서 prices에 저장한다. 그 다음 prices의 keys, 즉 가격들을 순회하면서 해당 가격의 아이스크림에 대해 (m - 아이스크림의 가격)과 동일한 가격의 아이스크림이 존재하는 경우를 찾는다. 두 아이스크림 가격이 동일한 경우에는 해당 가격의 아이스크림 개수가 2 이상이어야 하고, 동일하지 않은 경우에는 1개 이상만 존재해도 된다.
두 아이스크림 가격을 찾았다면 인덱스를 구하여 반환하면 된다. 가격이 같은 경우에는 findIndex로 둘 다 찾기 어려워서 먼저 map으로 인덱스를 찾고 나머지 아이스크림들은 0으로 변경한 후에 filter로 두 아이스크림만 골라서 반환하였다. 가격이 다른 경우에는 findIndex로 인덱스를 찾되, 두 아이스크림 가격의 대소관계가 다를 수 있으므로 마지막에 오름차순 정렬하여 반환하였다.
function icecreamParlor(m, arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] + arr[j] === m) {
return [i + 1, j + 1];
}
}
}
}
arr의 길이가 10,000이어서 O(n^2)으로 1억번의 연산이 필요하여 시간 초과가 날 줄 알았지만, 이 문제의 경우에는 위와 같이 풀어도 통과가 된다.
'연습장 > HackerRank 문제풀이' 카테고리의 다른 글
[HackerRank - Easy] Beautiful Pairs - JavaScript (0) | 2023.01.05 |
---|---|
[HackerRank - Easy] Weighted Uniform Strings - JavaScript (0) | 2023.01.03 |
[HackerRank - Easy] Two Characters - JavaScript (0) | 2023.01.03 |
[HackerRank - Easy] Super Reduced String - JavaScript (0) | 2023.01.03 |
[HackerRank - Easy] Flatland Space Stations - JavaScript (0) | 2023.01.01 |