백준 1157 단어 공부 [JavaScript]

김한주·2022년 11월 2일
0

문제

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

입력

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

출력

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

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

풀이

//주어진 단어에서 가장 많이 사용된 알파벳을 출력하는 문제
const fs = require("fs")
//대문자로 변경
const input = fs.readFileSync('/dev/stdin').toString().toUpperCase();

let count= new Array(26).fill(0);   //26길이만큼 0으로 배열 초기화
for(let i=0; i<input.length; i++){  //count에 나온 알파벳 수만큼 추가
    count[input.charCodeAt(i)-65]++;
}

var max = Math.max(...count);       //count배열에서 가장 큰 값
var index = count.indexOf(max);     //count배열에서 가장 큰 값의 처음 인덱스

let own = true;       //max값이 2개 이상인지 확인
for(let j=0; j<26; j++){    
    if(count[j] === max && j !== index){
        own = false;
    }
}

if(own == true){
    console.log(String.fromCharCode(index+65));
}
else{
    console.log('?');
}

해설

대문자로 입력값을 바꾸고 길이가 26인 count 배열을 만들었다. input의 길이만큼 반복하며 input의 알파벳을 아스키코드로 바꿔주고 -65(A)를 하여 A면 count[0]++, B면 count[1]++가 되게 하였다.
count에 input의 알파벳 수만큼 저장하게 한 것이다.
count에서 가장 큰 값이 input에서 가장 많이 사용된 알파벳의 횟수이고, 그 값의 인덱스로 몇 번째 알파벳인지 알 수 있다.
indexOf는 처음 인덱스를 반환하므로 같은 값이 2개 이상인 경우를 확인할 수 없었다.
따라서 가장 큰 값과 그것의 인덱스가 같은지 다른지를 판별하여 두개 이상일 경우 ?를 하나일 경우 알파벳을 출력해주었다.

  • toUpperCase()를 사용해서 대문자로 입력값을 받았다.
  • 길이가 N인 배열 arr을 선언하면서 동시에 값을 초기화하고 싶은 경우)
    fill() 메서드는 배열의 시작 인덱스부터 끝 인덱스의 이전까지 정적인 값 하나로 채웁니다.
const array1 = [1, 2, 3, 4];

// fill with 0 from position 2 until position 4
console.log(array1.fill(0, 2, 4));
// expected output: [1, 2, 0, 0]

// fill with 5 from position 1
console.log(array1.fill(5, 1));
// expected output: [1, 5, 5, 5]

console.log(array1.fill(6));
// expected output: [6, 6, 6, 6]
  • charCodeAt() 메서드는 주어진 인덱스에 대한 UTF-16 코드를 나타내는 0부터 65535 사이의 정수를 반환합니다.
  • Math.max() 함수는 입력값으로 받은 0개 이상의 숫자 중 가장 큰 숫자를 반환합니다.
console.log(Math.max(1, 3, 2));
// expected output: 3

console.log(Math.max(-1, -3, -2));
// expected output: -1

const array1 = [1, 3, 2];

console.log(Math.max(...array1));
// expected output: 3
  • indexOf() 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환합니다.
  • String.fromCharCode() 메서드는 UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환합니다. (아스키코드를 문자열로)
profile
HANJUMON의 성장과정!

0개의 댓글