잠을 늦게 잔 탓인가... 힘겨운 아침이었다.
누우면 잠들기가 아쉬워서 유튜브 보니까 시간이 너무 훅간다. 빨리 자려는 습관을 들여야겠다.
오늘은 아침부터 객체 코플릿을 진행하였다. 문제는 총 21문제!
생각보다 쉬웠다(?) 왠지 모르게 술술 풀렸다... 떠돌던 개념들을 잡으려고 코드스테이츠 레슨 외에 다른 강좌를 찾아보니 나도 모르게 실력이 늘었나보다.
오늘 그나마(?) 어려웠던 것들만 다시 복습 해보자.
1. 문자열을 구성하는 각 문자로 객체 만들기 값은 중복된 문자 만큼의 숫자.
ex) 'aaabbbccc' -> {a:3 b:3 c:3}
이게 조금 어려웠던 이유는 바로 빈 객체를 어떻게 채우느냐가 엄청난 고민거리였다. 난 레퍼런스를 조금(?) 참고 하여 풀었다.
function countLettet(str) {
let newObj = {};
if(str.length === 0){
return newObj;
} //위 조건문은 빈 문자열을 입력받은 경우 빈 객체를 리턴하라는 주의사항이 있었기 때문!
for(let n = 0; n < str.length; n += 1){
if(newObj[str[n]] === undefined){ //바로 이부분이다. 저게 왜 떠오르지 않았을까..?
newObj[str[n]] = 0;
}
newObj[str[n]] +=1;
}
return newObj;
}
결과는 아주 이쁘게 객체가 되어 나왔다. 10줄 가까이 쓰고 1줄 뽑아내는게 왜이렇게 짜릿한지 ... 이래서 코딩하나보다.
2. 문자열에서 가장 많이 반복되는 문자를 리턴
주의사항) 문자열에서 문자 수가 같다면 먼저 많이 (?) 나오는 문자를 리턴.
설명이 조금 힘드네... 책을 많이 읽어야겠다... 어쨌든 내려가다보면 무슨말인지 나온다.
위 문제를 풀고나서 이건 쉽겠는데? 생각했지만 큰 오산이었다. 일단 내가 만든 코드를 먼저 써보겠다.
function mostFreqLetter(str) {
let obj = {};
let value = 0;
let mostFrq = '';
if (str === '' || str === ' ') {
return ''
}
for (let n = 0; n <= str.length - 1; n += 1) {
if (str[n] === ' ') {
continue;
} else if (obj[str[n]] === undefined) {
obj[str[n]] = 0;
} else {
obj[str[n]] += 1;
}
}
for (let key in obj) { //단순하게 객체의 속성값을 순서대로 뽑아서 비교.
if (obj[key] > value) {
value = obj[key];
mostFrq = key;
}
}
return mostFrq;
}
아래 결과처럼 잘 나오는 듯 보인다.
그러나 문제는 ... 바로 주의사항!
주의사항에 따르면 위 'abcddcba' 에선 문자 모두 두 개씩 있고 d가 가장 먼저 두 번 중첩 되어 나오기 때문에 결과 값은 d로 나와야한다 밑의 문자열은 c가 나와야한다.
어떻게 해결을 했을까? 레퍼런스를 참고해보자.
function mostFreqLetter(str) {
let obj = {};
let value = 0
let mostFrq = '';
if(str === '' || str === ' '){
return ''
}
for(let n = 0; n <= str.length -1; n += 1){
if(str[n] === ' '){
continue;
}
else if(obj[str[n]] === undefined){
obj[str[n]] = 0;
}else{
obj[str[n]] += 1;
}
if(obj[str[n]] > value){ // for 문을 if로 그리고 str[n]을 사용하여 첫 문자부터 비교
mostFrq = str[n];
value = obj[str[n]];
}
}
return mostFrq;
}
if문을 위 for문에 걸리게하여 n번 째의 문자를 그대로 갖고와서 비교 문자열에서 앞 순서대로 갖고오면 객체에 어떤 순으로 정리 되어 있던 상관이 없는 것!
설명이 참 어렵다... ㅠㅠㅠㅠ 나중엔 말로도 설명이 가능하게 해야한댔는데 연습 좀 해야겠다.
결과는 성공적 ^^!
*느낀점
윈시형타입, 참조형타입, 전역변수, 지역변수, 스코프, 클로져! 어렵지만 필수적인 개념이란 걸 오늘 한번 더 느꼈다. 오늘 한 객체 코플릿도 참조형타입의 전형적인 모습을 보여줬다고 생각한다. 아직 모든 개념들이 명확하진 않지만 결국은 굳이 뇌를 거치지 않고도 습관적으로 굳어져야할 개념이다.