CK 006 | 백준 1157번 : 단어공부 (javaScript)

This Is Empty.·2021년 8월 14일
0

codekata

목록 보기
6/35

문제

🔗 1157번 : 단어공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

내가 작성한 코드

const fs = require('fs')
//let input = fs.readFileSync('/dev/stdin').toString().trim();

let input = "Mississipi"
let charCount = {};

function getKeyByValue(object, value) {
  return Object.keys(object).find(key => object[key] === value);
}

for(let char of input.toUpperCase()) {
  charCount[char] = charCount[char] ? charCount[char] + 1 : 1 ;
}

let max = Math.max(...Object.values(charCount))

let maxLength = Object.values(charCount).filter( (v,i) => {
  return Object.values(charCount)[i] === max
}).length

console.log(maxLength > 1 ? "?" : getKeyByValue(charCount,max))

풀이에 사용한 방법은

  1. 객체를 사용하여 알파벳 : 등장횟수charCount변수에 담는다. 문제의 조건이 대문자로 반환하는 것이므로 사전에 toUpperCase()를 이용하여 대문자로 담는다.
  2. 제일 많이 사용된 알파벳의 숫자를 max변수에 담는다.
  3. 만약 제일 많이 등장한 알파벳이 하나가 아닐 경우 ? 를 출력해야 하므로 filter메소드를 이용하여 배열에 담고 배열의 길이를 구해 maxLength 변수에 담는다.
  4. 만약 maxLength 변수의 길이가 1보다 클 경우 ?를, 아니면 객체 값을 키를 찾는 함수를 이용하여 해당 알파벳을 반환한다.

다른 사람의 풀이

let input = require('fs').readFileSync('/dev/stdin').toString().toLowerCase();

const result = new Array(26).fill(0); // a-z를 위한 배열을 만들어주고 0의 값으로 채움 

for (let i = 0; i < input.length; i++) {
	result[input.charCodeAt(i) - 97] ++;
}

const max = Math.max(...result); /// result 배열 값을 다 돌린다
const index = result.indexOf(max);

let isSame = false;

for (let j = 0; j < 26; j++) {
	if (result[j] === max && index != j) {
		isSame = true;
		break;
	}
}

console.log(isSame ? "?" : String.fromCharCode(index + 65)); // 다시 알파벳으로 나타내주기 위함 

알파벳의 아스키코드를 사용해서 풀었다.

charCodeAt() : 메서드는 주어진 인덱스에 대한 UTF-16 코드를 나타내는 0부터 65535 사이의 정수를 반환합니다.
fromCharCode() : 메서드는 UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환합니다.

a-z의 아스키코드는 97-122번 A-Z의 아스키코드는 65-90번이다.

profile
Convinced myself, I seek not to convince.

0개의 댓글