Programming Language/JavaScript

[JS]객체, 배열 연습문제

마손(Mason) 2022. 4. 26. 10:33

Q1.

객체, 키, 수를 입력받아 주어진 키에 해당하는 값이 배열인 경우, 수가 가리키는 인덱스에 해당하는 요소를 리턴해야 합니다.

function getElementOfArrayProperty(obj, key, index) {
  let arrProperty = obj[key];
  if (Array.isArray(obj[key])){
    return arrProperty[index]
  }
}
  1. 우선 객체에 주어진 키에 해당하는 값이 배열인지 판단한다.
  2. 배열이라면, index에 해당하는 요소를 리턴한다.

Q2.

배열과 객체를 입력받아 배열의 각 요소들을 객체의 키로 했을 때 그 값을 추출하여 만든 새로운 객체를 리턴해야 합니다.

function select(arr, obj) {
  let newObj = {};

  for (const arr_key in arr){
    for (const obj_key in obj){
      if (arr[arr_key] === obj_key){
        newObj[obj_key] = obj[obj_key]
      }
    }
  }
  return newObj
}
  1. 배열(arr)의 각 요소와 객체(obj)의 키 값이 같은지 판단한다.
  2. 두 값을 비교하기 위해 2번의 loop가 필요함으로 for...in으로 각 값들을 순회한다.
  3. 비교한다.
  4. 값이 같다면 새로운 객체에 할당한다. 이때 인자가 변수이므로, 꼭 obj[key] = value방식으로 할당하도록 한다.

Q3.

객체와 키를 입력받아 키에 해당하는 값이 배열인 경우, 마지막 요소를 리턴해야 합니다.

function getLastElementOfProperty(obj, property) {
  let arrProperty = obj[property];

  if (Array.isArray(obj[property])){
    return arrProperty[arrProperty.length -1]
  }
}
  1. 객체의 키에 해당하는 값이 배열인지 판단한다. Array.isArray()를 사용한다.
  2. 해당 배열의 마지막 요소를 리턴한다.

Q4.

배열과 수를 입력받아 수가 가리키는 인덱스에 해당하는 객체의 'name' 속성 값을 리턴해야 합니다.

function getValueOfNthElement(arr, num) {
  if (arr.length === 0){return 'no name'}
  else{
    if (num >= arr.length){
      return arr[arr.length - 1].name
    }
    else{
      return arr[num].name
    }
  }
}

Q5.

문자열을 입력받아 문자열을 구성하는 각 문자(letter)를 키로 갖는 객체를 리턴해야 합니다. 각 키의 값은 해당 문자가 문자열에서 등장하는 횟수를 의미하는 number 타입의 값이어야 합니다.

//실패

function countAllCharacters(str) {
  let count = 0
  if (str === ''){return {}}
  else {
    let arr = str.split('')
    let newArr = Array.from(new Set(arr))
    let newObj = new Object()

    for (let arr_key in arr){
      for (let newArr_key in newArr){
        if (arr[arr_key] === newArr[newArr_key]){
          count = count + 1
          newObj[newArr[newArr_key]] = count
        }
        
      }
      count = 0
    }

    return newObj
  }
}
  1. str의 각 문자열을 배열로 받아, arr[index]로 접근하면 될 듯하여 str.split('')으로 문자열의 각 문자로 구성된 배열을 만듦.
  2. 예를 들어, 'banana'가 입력되었을 때 {b:1, a:3, n:2}와 같이 출력되어야 하므로 문자열의 중복을 제거한 배열을 Array.from(new Set(arr))를 활용하여 만듦.
  3. return 해줄 배열을 만듦.
  4. ['b', 'a', 'n', 'a', 'n', 'a'] 배열과 ['b', 'a', 'n'] 배열을 조건문으로 비교하며 count를 더해주는 방향으로 개수를 세려 했으나, 각 문자열 별로 서로 다른 count가 필요함을 깨닫고 문제에 봉착함.
  5. 이것저것 콘솔 찍어보다가 실패함.
// 성공

function countAllCharacters(str) {
  let obj = {}
  if(str === ''){return {}}
  else{
    for(let i = 0; i < str.length; i ++ ){
      if (obj[str[i]] === undefined){
        obj[str[i]] = 0
      }
      obj[str[i]] ++
    }
  }
  return obj
}
  1. 문자열을 다시 배열로 받아 인덱스로 접근하고자 하는 생각이 잘못됨. 2번 일하게 되는 것임. String도 str[index]를 통해 충분히 접근 가능함.
  2. Object 타입의 데이터에 key: value 값을 넣기 위한 방법은 obj[key] = value 라는 점이 자꾸 잊힘. 기본적인 방법대로 하면 쉽게 Object 타입의 데이터를 만들 수 있음.
  3. 우선 Object의 모든 value 값은 undefined이므로, number 타입인 0으로 초기화해줌. 조건문을 활용함.
  4. 카운트를 위해 value ++ 를 사용하여 리턴함.

Q6.

문자열을 입력받아 가장 많이 반복되는 문자(letter)를 리턴해야 합니다.

function mostFrequentCharacter(str) {
  let obj = new Object() // 객체생성
  let onlyStr = str.replace(/(\s*)/g, "") // str의 띄어쓰기 제거
  let mostFrequentTime = 0 
  let mostFrequnetWord = '' // 초기화

  if (str === ''){return ''} // 빈문자열 입력에 대한 처리
  else {
    for (let i = 0; i < onlyStr.length; i ++){
      if (obj[onlyStr[i]] === undefined){
        obj[onlyStr[i]] = 0
      }

      obj[onlyStr[i]] ++ // 문자열 당 반복횟수를 객체 {}에 저장
      console.log(obj[onlyStr[i]])

      if (obj[onlyStr[i]] > mostFrequentTime){ // 가장 많이 반복되는 횟수를 표시
        mostFrequentTime = obj[onlyStr[i]]
        console.log(mostFrequentTime)
        mostFrequnetWord = onlyStr[i]
      } 
    }
    return mostFrequnetWord
  }
}
  1. 앞서 진행했던 코플릿에 반복 횟수를 객체 {}에 저장한다.
  2. 가장 많이 반복되는 문자를 찾기 위해 조건문으로 최대 횟수를 찾는다.
  3. 횟수에 해당하는 문자를 할당한다.
  4. 그 문자를 리턴한다.
function mostFrequentCharacter(str) {
  let obj = { mostCount: 0, mostFrequent: '' };
  for (let i = 0; i < str.length; i++) {
    if (str[i] === ' ') {
      continue;
    }

    if (obj[str[i]] === undefined) {
      obj[str[i]] = 0;
    }
    obj[str[i]] += 1;

    if (obj[str[i]] > obj['mostCount']) {
      obj['mostCount'] = obj[str[i]];
      obj['mostFrequent'] = str[i];
    }
  }
  return obj['mostFrequent'];
}

변수를 활용하여 훨씬 깔끔하고 가독성 좋게 코드를 짤 수도 있다. 확실히 변수를 잘 다루는 것이 중요한 듯하다.