Algorithm/Baekjoon(Node.js)

[JavaSrcipt] Baekjoon - 1157 : 단어 공부

비망노트 2021. 9. 13. 23:01

문제

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

입력

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

출력

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

 

예제입력 예제출력
Mississipi ?
zZa Z
z Z
baaa A

 

⭕ 풀이

const input=require('fs').readFileSync('/dev/stdin').toString();
const str=input.toUpperCase().split('');
					// input을 대문자로 바꾼후 배열생성

let AZ=[];
let asc=65;
for(let i=0;i<26;i++){
    AZ[i]=String.fromCharCode(asc)
    asc +=1;
}                   //여기까지 A-Z배열 생성


let countArr =[];
let max=0;
for(let j=0;j<26;j++){
    let count =0;
    for(let x=0;x<str.length;x++){
        if(AZ[j] == str[x]){
            count +=1;            
        }
    }
    if(count>max){
   	 max=count;
    }
    countArr.push(count);   
}           // A-Z 까지 알파벳 들어가는 갯수 배열 생성

let answer =[];
for(let y=0;y<26;y++){
    if(countArr[y]==max){
        answer.push(AZ[y])
    }
}            //max값과 갯수배열 [y]값과 같으면 AZ[y]자리에 해당하는 알파벳을 answer에 추가


console.log(answer.length>1 ? '?' : String(answer))

우선 입력받은값을 대문자로 바꾼뒤

A-Z 배열에 해당 문자들이 몇개씩들어가는지 갯수를 나타내는 배열을 생성하며

배열중 최대값을 받을 max를 만들어주었다.

그 뒤 만약 갯수배열의 0인덱스값과 max값이 같다면

AZ배열의 0인덱스값이 answer배열에 들어가는 for문을 만들어

answer배열 가장 많이 들어가는 알파벳을 지니고있다.

만약 2개이상이라면 answer.length가 2이상이 될테니 그경우 '?'를 

아니라면 해당 문자를 출력하도록 풀이햇다.

 

아직 많이 돌아간다는 느낌이 있지만

저 마지막for문을 생각해내느라 몇시간동안 고민했는데

정답이어서 다행이다..

 

✅ 다른분의 풀이

 

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

const result = new Array(26).fill(0);

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

const max = Math.max(...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));
[ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 1,
  0, 0, 4, 0, 0, 0, 0, 0, 0, 0 ]

첫 for문을 돌면 해당 위의 배열이 생성된다.

 

우선 알파벳갯수만큼 0으로 이루어진 배열을 생성한뒤.

 

예를들어 apple의 문자열을 입력받았다고 치면

i=0일때 input.charCodeAt(i) 하면 apple 의 0번째 인덱스인 a가 

아스키코드 97로 변환된다 거기서 

소문자 a의 아스키코드인 97을 빼면

result[0]을 가리키고 해당 인덱스를 ++한다.

그렇게 input 문자열의 갯수만큼 반복한다.

 

i=1이면  p는 아스키코드로 112이니까 -97 = 15

알파벳 15인덱스 즉 16번째는 p

해당인덱스를 ++ 한다.

 

무쳤다..

첫for문을 이해하는것부터 버겁다..

toLowerCase 를 사용하고 마지막에 index+65를 하여 다시 대문자로 변환해주는 이유는

메모리와 시간을 신경쓰신건가

 

 

-출처

https://www.acmicpc.net/problem/1157