[BOJ] 1157번 - 단어 공부

이수현·2022년 5월 22일
0

BOJ

목록 보기
3/4

단어 공부

제출 코드

const fs = require("fs");
const input = fs.readFileSync(0).toString().trim();

let temp = input.toUpperCase();
temp = temp.split("");
const result = {};
let temp2 = [];
//어떻게 체크를 할까?
// 일단 전달받은 문자열을 대소문자 구분하지 않기위해 대문자로 변환하자.
// ZZA => Z
temp.forEach((v) => {
    result[v] = (result[v] || 0) + 1;
});
let max = result[Object.keys(result)[0]];

for (let i = 0; i < Object.keys(result).length; i++) {
    if (result[Object.keys(result)[i]] > max) {
        max = result[Object.keys(result)[i]];
    }
}
Object.keys(result).find((k) => {
    if (result[k] === max) {
        temp2.push(k);
    }
});
if (temp2.length > 1) {
    console.log("?");
} else {
    console.log(temp2[0]);
}

접근 방식

  1. 출력은 알파벳 대문자니까 입력값을 처음부터 다 대문자로 변환하자.
  2. 변환한 문자열을 배열로 만들어준다.(객체에 넣을 때 forEach문을 사용하기 위해)
  3. 변환한 문자열 temp를 forEach문을 아용하여 result객체의 key로 value를 넣을 때, result[v] = (result[v] || 0) + 1; 라는 코드를 작성했다.
    => 위 코드는 만약 result[v]가 있다면 result[v]+1, 없다면 0 +1을 의미한다.
  4. 이렇게 result 객체에는 각 알파벳의 카운팅이 값으로 들어갔다.
  5. 카운팅을 구하기 위해 객체의 길이만큼 반복문을 돌린다.
  6. 반복문을 돌리면서 조건으로 객체의 값 중에 최댓값을 max에 담는다.
  7. 최댓값을 max에 담고 이 값으로 객체의 키를 찾기위해 find()함수를 이용하자.
  8. 객체의 키배열인 Object.keys(result)를 이용해 find함수로 result[k] === max이면 해당 키를 temp2라는 임시배열에 담는다.
  9. 임시배열에 담긴 배열이 2개 이상이라면 ?를 출력하고 1개라면 temp2[0]을 출력한다.

느낀점

아직 많이 부족한 것 같다. 자료 구조도 공부를 시작했지만, 공부한 것을 아직까지 제대로 생각하며 코드를 작성하지 못하고 있다.
계산 단계를 최대한 최소화하여 시간 복잡도를 줄이고 싶은데, 아직 부족하다..
물론, 위 코드가 시간 복잡도가 다른 정답 코드들에 비해 높은지 비슷한지 모르지만...
코드가 길어지면서 이런 생각이 드는 것 같다..
공부를 더 열심히 하고, 꾸준히 풀어서 이런 잡생각이 안들게 하자..

0개의 댓글