🔗 문제 링크
https://www.hackerrank.com/challenges/weighted-uniform-string/problem
Weighted Uniform Strings | HackerRank
Determine if a string contains uniform substrings of certain weights.
www.hackerrank.com
✏️ 풀이
function weightedUniformStrings(s, queries) {
const chars = {};
s.match(/(.)\1{0,}/g).forEach(str => {
if (!chars[str[0]]) {
chars[str[0]] = str.length;
} else {
chars[str[0]] = Math.max(chars[str[0]], str.length);
}
});
const set = Object
.entries(chars)
.reduce((acc, [key, value]) => {
for (let i = 1; i <= value; i++) {
acc.add((key.charCodeAt(0) - 96) * i);
}
return acc;
}, new Set());
return queries.map(query => set.has(query) ? 'Yes' : 'No');
}
문자열 s에서 등장한 각 알파벳별로 해당 알파벳으로 구성된 uniform string의 최대 길이를 chars에 저장한다.
(ex 'aaaabbaaacbcc' => chars = { a: 4, b: 2, c: 2 })
그 다음, chars를 순회하면서 각 알파벳별 weight를 1부터 uniform string의 최대 길이까지 각각 곱한 값을 Set에 추가한다. 이렇게 하면 set에는 문자열 s의 모든 uniform contiguous substring들의 weight가 중복 없이 담기게 된다.
최종적으로 queries를 순회하면서 set에 query가 존재하는지 여부를 통해 Yes, No로 변환하면 된다.
💡 새로 알게 된 점
정규표현식에서 \1, \2, \3 이런식으로 그루핑한 문자열을 재참조할 수 있다.
const str1 = 'aabbccaabbcc';
const str2 = 'aabbccddeeff';
const str3 = 'aabbccbbccaa';
const results = [str1, str2, str3].map(str => /(.{2})(.{2})(.{2})\1\2\3/.test(str));
// [true, false, false]
이를 활용하여 문자열을 동일한 문자가 연속되어 등장하는 문자열들로 나눌 수 있다.
const str = 'aabbbccccdddddeaabbcced';
const uniformStrings = str.match(/(.)\1{0,}/g);
// ['aa', 'bbb', 'cccc', 'ddddd', 'e', 'aa', 'bb', 'cc', 'e', 'd']
'연습장 > HackerRank 문제풀이' 카테고리의 다른 글
[HackerRank - Easy] Beautiful Pairs - JavaScript (0) | 2023.01.05 |
---|---|
[HackerRank - Easy] Ice Cream Parlor - JavaScript (0) | 2023.01.05 |
[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 |