[백준/node.js] 1157번 단어 공부

dk.han·2021년 9월 4일
0
post-thumbnail

문제

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

입력

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

출력

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

예제 입/출력

Mississipi / ?
zZa / Z
baaa / A

풀이

const fs = require('fs');
let input = fs.readFileSync('input.txt').toString().split('\n');

solution(input[0])

function solution(str) {
    
    let lowStr = str.toLowerCase(); // 대소문자를 구분하지 않기 때문에 소문자로 변경,
    let obj = {}; // 문자를 key로 넣고 value를 count로 쓰기 위해 obj 만들어주고

    for(let i=0; i<lowStr.length; i++){
        
        if(obj[lowStr[i]] === undefined) {
            obj[lowStr[i]] = 1;  //key가 없을 땐 value를 1로 설정해서 넣어주고
        } else {
            obj[lowStr[i]] += 1 //key가 있으면 +1을 해주는 로직
        }
    }
    // obj는 for문으로 다 해결이 된거고,
   //이제 여기서 가장 높은 값을 가지는 property를 가려내야 한다
  
    let result ='';
    let count=0

    for(char in obj){ // obj 전체 property를 확인 해야 하므로 for in 사용
        if(obj[char] > count){ // count와 value 비교 해서 value가 더 크면
            count = obj[char]; // count값 교체해주고
            result = char.toUpperCase(); // result도 대문자로 변환해서 교체해준다.
        } else if (obj[char] === count){ //만약 count와 value가 같은 값이 있다면
            result ='?'; // result를 ?로 교체해준다.
        }
    }
    console.log(result);
}

느낀점.

크게 어려운 문제는 아니었지만 조금 고민하게 만드는 문제였다.
처음부터 객체를 이용해야 겠다는 생각을 하지 못했기 때문에, 어떻게 count를 할건지에 대해서 많이 고민했다.
이렇게 반복되는 문자열 같은 경우는 객체에 key로 설정하고 value로 count를 하면 굉장히 유용하다는 것을 이 문제를 통해 느끼게 됬다.
그리고 객체 안의 데이터를 이용하기 위해서 result, count 변수를 설정하고
if 문을 통해 원하는 값을 뽑아 낼 수 있어서 사용하기가 굉장히 편했다.

앞으로 반복되는 무언가를 뽑아내기 위해서는 배열보다는 객체!!
이것을 꼭 기억해두자.

0개의 댓글