다다의 개발일지 6v6

[백준] 1157번. 단어 공부 ( for in 구문, || 연산자의 역할 ) 본문

Frontend/코딩테스트 (JS)

[백준] 1157번. 단어 공부 ( for in 구문, || 연산자의 역할 )

dev6v6 2025. 1. 23. 12:28

문제!

 

우선 풀이 전략으로

  1. 대소문자 구분을 하지 않으므로 -> 모두 대문자로 만들어줬다. toUpperCase()
    소문자(toLowerCase())가 아니라 대문자로 만들어준 이유는 출력을 대문자로 하라고 했기 때문!
  2. 주어진 단어를 하나하나 쪼개서 count를 세준다. (count 객체 생성)
  3. count 객체를 순회하면서 가장 많이 나온 알파벳 배열 (mostCntChar)을 만든다.
    왜 배열이냐? 같은 횟수만큼 나온 알파벳이 여러개일 수도 있으니까
  4. 만약 마지막에 살아남은 mostCntChar 배열에 속한 문자가 1개면
    딱 가장 많이 사용된 알파벳이 한문자 존재 하는거니까 그거 출력하면 되고
    여러개 였다면 "?" 출력!
const fs = require("fs");
const word = fs.readFileSync(0, "utf-8").toString().trim().toUpperCase();

const count = {};

for (const w of word) {
  count[w] = (count[w] || 0) + 1; // 있으면 원래 거에 1더하고 없으면 0으로처리하고 1더하기.
}

let mostCnt = -Infinity;
let mostCntChar = [];

for (const char in count) {
  if (count[char] > mostCnt) { // 새로운 최댓값 발견!
    mostCntChar = [char]; // 초기화
    mostCnt = count[char];
  } else if (count[char] === mostCnt) { // 이미 같은 count 수 존재
    mostCntChar.push(char); // 기존 배열에 추가
  }
}

if (mostCntChar.length === 1) {
  console.log(mostCntChar[0]);
} else console.log("?");

더 자세히 뜯어서 설명하자면

const count = {};

for (const w of word) {
  count[w] = (count[w] || 0) + 1; // 있으면 원래 거에 1더하고 없으면 0으로처리하고 1더하기.
}

이 부분에서 for of 구문으로 count 객체를 채워준다.

이때  중요한건 ( count[w] || 0 ) + 1; 부분인데 

만약 "abca" 라는 단어에서

맨 처음 a는 count 객체에 들어 있지 않으므로 count["a"] 는 undefined 인데 +1을 할 수 없으므로 0으로 만들어 준다. ( || 을 이용)
마지막 a는 이미 객체에 있으므로 count["a"] + 1을 수행하면 된다.

|| 연산자의 역할

  • ||는 "왼쪽이 Falsy 값일 경우 오른쪽 값을 사용"이라는 의미를 가짐.
    ||(or) 연산자는 왼쪽이 Falsy면 무조건 오른쪽 값을 봐야 하기 때문에 오른쪽에 의해 값이 정해짐.
  • undefined, null, 0, false, NaN, ""(빈 문자열)은 모두 Falsy 값으로 간주됨.
  • 따라서, count[w] 가 undefined라면 0이 대신 사용되는 것.

for (const char in count) {
  if (count[char] > mostCnt) { // 새로운 최댓값 발견!
    mostCntChar = [char]; // 초기화
    mostCnt = count[char];
  } else if (count[char] === mostCnt) { // 이미 같은 count 수 존재
    mostCntChar.push(char); // 기존 배열에 추가
  }
}

 

다음은 for in 구문에 대해서 설명해보려고 한다. 

for i of "abc"는 단어 abc가 있으면 i가 a, b, c 문자 자체를 순회하는 반복문을 의미하고

for i in "abc"에서 i는 인덱스를 말하는 거 라고 알고 있었다. ( 이건 배열의 경우였다 )

 

사실 정확하게는 for in 구문은 객체의 키(key)를 순회하는 반복문이다.

위에 예시에서 배열이었을 때는 key가 index여서 index를 의미한 것이고

이번 문제에서 객체 { a: 2, b: 1, c: 3, }key char자체를 의미하기 때문에

for ( const char in count) 에서 char 는 a, b, c를 의미하는 것이다.

 

배열(Array)은 인덱스를 키(key)로 가지는 객체이다.

 

차이점: for...of vs for...in

1. for...in:

  • 객체의 키(key)를 순회합니다.
  • 배열에서 사용하면 인덱스(index)를 순회합니다.
const arr = ['a', 'b', 'c']; 
for (const key in arr) { 
  console.log(key); // 0, 1, 2 (인덱스 출력)
}

 

 

2. for...of:

  • iterable 객체(배열, 문자열, Map, Set 등)의 값(value)를 순회합니다.
 
const arr = ['a', 'b', 'c']; 
for (const value of arr) { 
  console.log(value); // 'a', 'b', 'c' (값 출력)
}