Juni_Dev_log

(200211_TIL) "Anagram" 본문

CodingTest/Exercism

(200211_TIL) "Anagram"

Juni_K 2021. 2. 11. 14:22

▶ Anagram

Anagram

 

📌Problem

 

Introduction

An anagram is a rearrangement of letters to form a new word.

: 아나그램은 새로운 단어로부터 철자의 재배열로 이루어진다.

Given a word and a list of candidates, select the sublist of anagrams of the given word.

: 단어와 후보 목록들이 주어지면, 주어진 단어의 아나그램의 하위 목록을 선택한다.

Given "listen" and a list of candidates like "enlists" "google" "inlets" "banana" the program should return a list containing "inlets".

: listen 과 'enlists' 'google' 'inlets' 'banana' 같은 후보 목록들이 주어지면 프로그램은 'inlets' 가 포함된 목록을 반환해야한다.

 

 

(Thinking)

- 주어진 문자열을 철자 단위로 배열에 나눠서 담아보자. ex) listen -> ['l','i','s','t','e','n']

- 해당 배열을 for문으로 돌리면서 철자별로 if 문을 비교한다. (or for in array 를 통해서 해당 리스트에 해당 철자가 있는지 비교한다.)

- 있다면, 새로운 배열에 담고 없다면, 넣지 않는다.

- 배열을 반환한다.

- 아무것도 겹치는 것이 없다면 [] (빈 배열)을 반환한다.

- 대소문자는 구분하지 않는다. ex) Orchestra -> 'carthorse' (o)

- 반환되는 값은 후보 목록에 있는 값과 똑같아야한다. (대소문자 역시) ex) orchestra -> 'Carthorse' (목록에 있는 단어 그대로 반환)

- 문자열의 길이가 똑같아야하고, 한번에 하나씩만 사용해야한다. ex) tapper -> patter (x) (p가 1번 쓰임)

- 완전히 똑같은 단어는 반환하지않는다. (대소문자 역시) ex) Listen -> 'LISTEN' (X) (완전히 똑같은 단어)

 

💯 Solution

 

(첫 번째 시도)

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
38
39
40
41
42
43
44
45
46
export const findAnagrams = (give_word,give_list) => {
    var word = give_word;
    var list = give_list;
 
 
    // anagram에 적용되는 단어를 담을 배열
    let success_array = [];
 
    for(var i=0; i<list.length; i++){
        // 소문자로 변환 후, split()
        var word_array = word.toLowerCase().split('');
 
        console.log('i는 : '+i);
        // 문자열의 갯수가 맞는지 파악
        if(word_array.length !== list[i].length){
            continue;
        }
        // 문자열의 갯수가 같을 때
        else{
            //목록을 소문자 변환 후, split()
            var list_array =  list[i].toLowerCase().split('');
 
            // for문을 통해서 list_array에 들어가있는 알파벳과 word_array 알파벳 비교 후 겹치면 삭제
            for(var j=0; j<list_array.length; j++){
                console.log('j는 :'+j);
                // word_array 에 list_array에 알파벳이 들어있다면
                if(word_array.includes(list_array[j])){
                    // 소문자로 변환 후, split()
                    var word_array = word.toLowerCase().split('');
                    console.log('알파벳이 존재합니다.');
                    // word_array 에 list_array 의 값이 있으면 1개 삭제
                    word_array.splice(word_array.indexOf(list_array[j]),1);
                }
                else{
                    console.log('알파벳이 없습니다.');
                }
            }
 
            // 다 지우고 없다면, word_array 는 빈 배열이됨.
            if(word_array=[]){
                success_array.push(list[i]);
            }
        }
    }
    return success_array;
};
cs

=> 문제 발생!

 

발생하는 문제는, word_array 에서 똑같은 알파벳을 발견하면 splice() 로 지워버리는 구조이다.

만약 word_array를 다 지워서 [] 값으로 만들어버리면 이후 for문에서 알파벳이 겹치지 않는 경우도 success_array 에 append를 해버리게 된다.어떻게 해야 word_array 값을 유지하면서, 겹치는 알파벳을 제거하는 형식의 코드를 작성할 수 있을까?

 

 

(두 번째 시도)

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
export const findAnagrams = (str,arr) =>{
    let result = [];
    for(let i=0; i<arr.length; i++){
        if(CompareWord(str,arr[i])){
// CompareWord()가 참이라면, result 배열에 arr[i]를 push한다.
            result.push(arr[i])
        }
    }
    return result;
}
 
function CompareWord(str1,str2){
    // 주어진 문자열을 소문자로 변환
    let str1_low = str1.toLowerCase();
    let str2_low = str2.toLowerCase();
    // 아예 똑같을 경우에는 false를 반환 ex) str1_low = 'listen' / str2_low = 'listen'
    if (str1_low === str2_low) {
        return false
    }
    // 소문자화한 문자열을 split("")을 통해서 배열에 담고, sort()를 통해서 정렬한 후, join으로 한 문자열로 붙인다.
    let str1_sorted = str1_low.split("").sort().join();
    let str2_sorted = str2_low.split("").sort().join();
 
    // sort()로 정렬한 후, join()으로 합 문자열로 합친 후 비교
    if(str1_sorted === str2_sorted){
        return true
    }
 
    // if문에 들어가지 못한 경우
    return false
}
 
cs

 

📚 참고

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

 

Array.prototype.sort() - JavaScript | MDN

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다. 정렬 속도

developer.mozilla.org

 

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/join

 

Array.prototype.join() - JavaScript | MDN

join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다. separator Optional 배열의 각 요소를 구분할 문자열을 지정합니다. 이 구분자는 필요한 경우 문자열로 변환됩니다. 생략하면

developer.mozilla.org

 

'CodingTest > Exercism' 카테고리의 다른 글

(200209_TIL) "Perfect Numbers"  (0) 2021.02.09
(200208_TIL) "Difference Of Squares"  (0) 2021.02.08
(200207_TIL) 'Word Count'  (0) 2021.02.07
(200205_TIL) 'Raindrops'  (0) 2021.02.05
(200204_TIL) 'Hamming'  (0) 2021.02.04
Comments