늘 겸손하게

LeetCode 890 - Find and Replace Return ( JavaScript ) 본문

코딩 문제/LeetCode

LeetCode 890 - Find and Replace Return ( JavaScript )

besforyou999 2021. 11. 15. 22:45

 

안녕하세요 besforyou입니다

 

이번 글은 LeetCode 890 - Find and Replace Return 입니다

 

문제 해석과 풀이가 꽤나 까다로운 문제였습니다.


문제 해설

 

문자열 배열 words와 문자열 pattern이 주어질때 패턴에 맞는 문자열을 배열에 담아 반환하라.

 

정답은 어떤 순서로 와도 상관없다.

 

패턴에 맞는 문자열이란 배열 words에서 현재 참조 중인 문자열과, 문자열 pattern에 있는 모든 문자 x를 p(x)로 바꾸었을때의 문자열이 동일하다면 패턴에 맞는 문자열이라고 합니다.

 

배열 words의 원소중에서 패턴에 맞는 문자열을 찾아서 배열에 저장한 뒤, 반환하는 함수를 만들어야합니다.


문제 풀이

 

단계순으로 설명하겠습니다.

 

1. 문자열 pattern의 문자들로 배열을 만듭니다.

 

이 배열은 문자열 pattern을 순차적으로 참조할때, 같은 문자가 있는 인덱스에는 같은 정수값이 저장되도록 해야합니다.

 

예로 문자열 abab를 순차적으로 참조할때 생성되는 배열에는 0101 이 저장되어야합니다.

또, 문자열 abb를 순차적으로 참조할때 생성되는 배열에는 011 이 저장되어야합니다.

또 , 문자열 abcd를 순차적으로 참조할때 생성되는 배열에는 0123 이 저장되어야합니다.

 

 

2. 문자열 배열 words의 문자열을 이용해 동일한 방법으로 배열을 만듭니다.

 

1번과 똑같은 방법으로 문자열을 이용하여 배열을 생성합니다.

 

 

3. 2.에서 생성한 배열과 1.에서 생성한 배열을 비교합니다.

 

배열에 저장된 원소값들이 동일하다면 정답들을 모아둘 배열에 저장합니다.

 

 

 

배열 words의 모든 문자열에 대하여 위 과정을 수행했다면 정답 배열을 반환합니다.

 


코드

 

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
32
33
34
35
36
37
var findAndReplacePattern = function(words, pattern) {
    let ans = [];
    let patternValue = [];
    const patternMap = new Map();
 
    for (let i = 0 ; i < pattern.length ; i++) {
        let letter = pattern.charAt(i);
        if (!patternMap.has(letter)) {
            patternMap.set(letter, patternMap.size);
            patternValue.push(patternMap.size);
        }
        else if (patternMap.has(letter)) {
            let num = patternMap.get(letter);
            patternValue.push(num);
        }
    }
 
    for (let i = 0 ; i < words.length ; i++) {
        let word = words[i];
        const map = new Map();
        let wordsValue = [];
        for (let i = 0 ; i < word.length ; i++) {
            let letter = word.charAt(i);
            if (!map.has(letter)) {
                map.set(letter, map.size);
                wordsValue.push(map.size);
            }
            else if (map.has(letter)) {
                let num = map.get(letter);
                wordsValue.push(num);
            }
        }
        if( JSON.stringify(patternValue) == JSON.stringify(wordsValue)) ans.push(word);
    }
    return ans;
};
 
cs

 

 


결과

 

 

메모리 사용량에서는 조금 부족하네요