Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

[HackerRank - Easy] Weighted Uniform Strings - JavaScript
연습장/HackerRank 문제풀이

[HackerRank - Easy] Weighted Uniform Strings - JavaScript

2023. 1. 3. 19:56

🔗 문제 링크

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
    '연습장/HackerRank 문제풀이' 카테고리의 다른 글
    • [HackerRank - Easy] Beautiful Pairs - JavaScript
    • [HackerRank - Easy] Ice Cream Parlor - JavaScript
    • [HackerRank - Easy] Two Characters - JavaScript
    • [HackerRank - Easy] Super Reduced String - JavaScript
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바