JavaScript 코딩 연습 / The Most Wanted Letter
              
          2020. 3. 25. 17:55ㆍToday I solved/Problems
문제 / 웹사이트
알파벳 현상수배 (The Most Wanted Letter) / CheckiO
난이도
Simple / 초급
내용
알파벳으로 이루어진 문장에서, 대소문자 구분 없이 가장 많은 빈도로 나타난 알파벳을 추출하는 함수를 작성하세요.
※ 가장 많은 빈도로 나타나는 알파벳이 여럿일 경우, 알파벳 순서로 맨 앞의 알파벳 하나만을 추출합니다.
예시
mostWanted("Hello World!") == "l"
mostWanted("How do you do?") == "o"
mostWanted("One") == "e"
mostWanted("Oops!") == "o"
mostWanted("AAaooo!!!!") == "a"
mostWanted("abe") == "a"
모범 답안
"use strict";
function mostWanted(data) {
    s = data.toLowerCase().split("").sort()
    max = 0
    for(c of "abcdefghijklmnopqrstuvwxyz".split("")){
        n = s.indexOf(c) >= 0 ? s.lastIndexOf(c) - s.indexOf(c) + 1 : 0
        if(n > max){
            max = n
            maxc = c
        }
    }
    return maxc
}
// Comments to think about
	// avoid using indexOf and lastIndexOf inside the for loop because they are both O(n)
"use strict";
function mostWanted(data) {
    let C = {'a': 0}, winner = 'a';
    for (let x of data.toLowerCase())
        if (x.match(/[a-z]/)) {
            if (x in C) C[x]++; else C[x] = 1;
            if (C[x] > C[winner] || C[x] == C[winner] && x < winner) winner = x;
        }
    return winner;
}
"use strict";
function mostWanted(data) {
    const chars = "abcdefghijklmnopqrstuvwxyz";
    let wanted = {char: '', count : 0};
    for (let char of chars) {
        var count = data.toLowerCase().split(char).length;
        if (count > wanted.count) {
            wanted.char = char;
            wanted.count = count;            
        }
    }        
    return wanted.char;  
}
공부해야 될 부분
- for ... of 명령문: 반복가능한 객체(Array, Map, String, arguments 등)에 대해 반복되는 루프를 생성
 - JavaScript에서의 알파벳 문자열 배열 간단 호출방법
- "abcdefghijklmnopqrstuvwxyz".split("")
 
 
개선해야 될 부분
- 최대값, 최소값 추출 방식
- 내 답안의 방식: 전체 데이터를 map(), filter() 등을 이용해 변환시킨 후 Math.max(), Math.min()을 사용
 - 모범 답안들의 방식: 초기에 count 값을 선언한 뒤 반복문에서 최대/최소값이 갱신되는 경우에만 count를 갱신
 
 
내 답안
"use strict";
function mostWanted(data) {
    let dataArr = data.toLowerCase().split('');
    let dataObj = {};
    
    dataArr.forEach((ltr, index, arr) => {
        if (ltr <= 'z' && ltr >= 'a') {
            let ltrCount = arr.filter(elm => elm === ltr).length;
            dataObj[ltr] = ltrCount;
        }
    });
    const mostCount = Math.max(...Object.values(dataObj));
    let mostCountLtr = Object.keys(dataObj).filter((ltr, index) => Object.values(dataObj)[index] === mostCount);
    
    const result = mostCountLtr.sort()[0];
    return result;
}
- 푸는 데 걸린 시간: 1시간 23분
 
'Today I solved > Problems' 카테고리의 다른 글
| Parallels Desktop에서 Mac의 로컬 React 앱에 접근하기 (0) | 2025.04.28 | 
|---|---|
| JavaScript 코딩 연습 / K번째 수 (0) | 2020.03.17 | 
| JavaScript 코딩 연습 / 모의고사 (0) | 2020.03.17 | 
| JavaScript 코딩 연습 / 완주하지 못한 선수 (0) | 2020.03.13 | 
| JavaScript 코딩 연습 / Weak Point (0) | 2020.03.12 |