일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Node.js
- MYSQL
- 알고리즘
- MyPick31
- 개발
- 장고 프로젝트 순서
- Django
- 북마크만들기
- 독립영화플랫폼
- 장고 개발 순서
- 타사인증
- passport.js
- 자바스크립트
- ART_Cinema
- Exercism
- mongodb
- Bookmark
- 프로젝트
- 북마크앱
- Blog
- Django Blog
- 파이썬 웹프로그래밍 장고
- python
- til
- Algorithm
- 장고 프로젝트
- JavaScript
- 장고
- join()
- 예술영화추천
- Today
- Total
Juni_Dev_log
(200211_TIL) "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
developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/join
'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 |