카테고리 없음

객체 코플릿 문제풀이

JJ_hyun 2022. 5. 12. 00:29

최근 우분투 설치를 마쳤으나,, 한글이 적히지 않아 문제를 해결한다고 며칠이 걸렸다,, 현재는 이상 무 ! 

객체에 대해 배우는데 어려움이 좀 있었다. 특히 문제를 추상적으로 풀어야 할 때 어려움을 느꼈다.

복습 차원에서 다시 되내어 본다. 

 

Q. 문자열을 입력 받는데, 입력받은 문자열을 키로 갖는 객체를 리턴해야 한다. 

각 키의 값은 해당 문자가 문자열에 등장하는 횟수를 의미하는 number 타입이여야 한다. 

주의 : 빈 문자열을 받으면 빈 객체를 리턴해야 한다. 

 ex. let output = countAll('banana')

console.log(output) // {b: 1, a: 2, n: 2}

 

의사코드 

입력받은 문자열을 순회 하면서 값을 비교하고, 값이 같으면 +1을 해주면 되겠다. 

리턴은 객체로 해줘야 하니, 해당 배열을 빈 객체에 담아줘야 할 것이다.

for 문으로 str[i] 를 순환하면서 객체에 값이 있으면 객체로 넣어줘야겠다.

** 내가 생각하지 못했던 부분 => 그럼 숫자값을 어떻게 카운트 해주지? 였는데 설명을 들으니

어느 타이밍에 추가를 해줘야 하는지 알았다.

for 문이 끝나기 직전, 조건문이 끝나고 카운트를 올려줘야 했다.

 

function countAll(str) {

let obj = {} // 값을 리턴할 빈 객체

 

for(let i = 0; i < str.length; i++){ // str[i] 를 반복해줄 반복문

  if ( obj[str[i]] === undefined ) { // 빈객체 obj 안에 키 값으로 해당 문자가 없다면,, -> 내가 생각해내지 못했던 부분

    obj[str[i]] = 0 // obj객체에 str[i] 을 넣고, 숫자는 0 으로 한다. -> 내가 생각해내지 못했던 부분

  }

obj[str[i]]++ // 조건문이 나오자 마자 1이 더해진다. -> 이런 방법으로 추가를 할 수 있다는것에 놀램.

}

return obj

}

 

Q. 문자열을 입력받아 가장 많이 반복되는 문자를 리턴해야 한다. 

주의 : 띄어쓰기는 제외. 

가장 많이 반복된 문자가 다수일 경우 처음 문자를 리턴할 것.

빈 문자열일 경우 빈 문자열을 리턴할것.

ex.

let output = mostFrequentCharacter('apples not oranges');
console.log(output); // --> 'p'

 

의사코드

전 문제랑 비슷한 유형, 대신 제일 큰 수의 키값인 문자열을 리턴 

빈 변수 3개를 선언하는데, 각각 숫자, 문자, 객체 가 되어야 겠다. 

숫자는 카운팅을 할 때 쓸 것이고, 문자는 마지막에 리턴할 값을 담을 것이고, 객체는 비교를 위해 쓸 것이다. 

 

일단 전 문제의 방법을 따라 해 본다.

 

function mostFrequentCharacter(str) {

 

let count = 0;

let string = '';

let obj = {};

 

for ( let i = 0; i < str.length; i++ ) {

  if( obj[str[i]] === undefined ) {

    obj[str[i]] = 0;

  }

  obj[str[i]]++ // 여기까지가 obj 값으로 문자는 키 로 숫자는 값으로 들어간 상황

// (ex. {a: 1, b: 1, ... }

  if ( obj[str[i]] > string ) { // 이 조건문이 크기를 비교해 주는 조건문, 반복을 할 때 마다 string 에 obj[str[i]] 를 할당해주고,

// 할당받은 string 은 그 다음 obj[str[i]] 와 비교하여 크면 다시 재할당을 해준다.

    string = obj[str[i]]

    count = str[i]

  }

}

return string;

}