Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- AJAX
- 서버 컴포넌트
- JavaScript
- git flow start
- fetch pull 차이
- Main
- HTML
- 끝까지 잘 마무리하기
- js
- freecodecamp
- 차이점
- 백준
- git flow finish
- 다시 홧팅
- 바닐라JS
- javascript30
- Mac
- 힘들었던 한주
- jQuery
- git
- 개발일지
- TS
- 책으론 원리만
- CSS
- api 라우트
- 실무는 공식문서로
- Next.js
- axios
- 공부할 거 넘많다~
- 클라이언트 컴포넌트
Archives
- Today
- Total
다다의 개발일지 6v6
[백준] 1157번. 단어 공부 ( for in 구문, || 연산자의 역할 ) 본문

우선 풀이 전략으로
- 대소문자 구분을 하지 않으므로 -> 모두 대문자로 만들어줬다. toUpperCase()
소문자(toLowerCase())가 아니라 대문자로 만들어준 이유는 출력을 대문자로 하라고 했기 때문! - 주어진 단어를 하나하나 쪼개서 count를 세준다. (count 객체 생성)
- count 객체를 순회하면서 가장 많이 나온 알파벳 배열 (mostCntChar)을 만든다.
왜 배열이냐? 같은 횟수만큼 나온 알파벳이 여러개일 수도 있으니까 - 만약 마지막에 살아남은 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' (값 출력)
}
'Frontend > 코딩테스트 (JS)' 카테고리의 다른 글
| [백준] 2941번. 크로아티아 알파벳 ( 하.. 해결했다. ) + 정답 풀이 (0) | 2025.01.23 |
|---|---|
| [백준] 10988번. 팰린드롬인지 확인하기 ( 함수 밖에 있는 return이 왜 적용될까?) (0) | 2025.01.22 |