본문 바로가기
창고

[알고리즘] "객체생성" 을 활용한 문제 풀이

by KimHarry 2022. 2. 11.

# 서론

 - 문제 개요

 - 어떻게 문제를 풀어야할까?

 - 풀이 이후 문제점

 

# javascript에서의 객체 생성 방법

 

# 객체 생성을 활용한 문제 풀이

 - 맨 처음 코드

   - 개선해야 할 점

 - 정리가 된 코드

   - 후기 (꼭 객체를 활용해서 풀어야하나?)

 


## 서론

 

 문재 개요

(오늘의 문제는 2019 Kakao RECRUITMENT 에서 출제된 '실패율' 이다.)

 

 이 문제는 제목 그대로 게임내의 스테이지 실패율을 구하고 조건에 따라 실패율이 높은 스테이지 부터 내림차순으로 스테이지 번호가 담겨있는 배열을 return 하는것이 주 목표이다.

 

 

 어떻게 문제를 풀어야할까?

 

 맨처음에는 간단하게 배열 몇가지를 정의하고 정렬시킨 이후에 배열간의 비교를 통해 조건에 맞게 순서를 return 시키면 되겠지 라고 생각했다.

 

 하지만 평소처럼 그저 숫자만 집어넣고 배열을 정렬하고 비교하려 했지만 무언가 구조가 복잡해지고 내가 짠 코드지만 코드가 어느것이 무슨역할이고 무슨 배열이였는지 헷갈리기 시작했다.

 

 그래서 어떻게 하면 더욱 코드를 직관적이고 실행속도를 단축시키면서 인상적인 코드를 만들 수 있을까 생각하다 객체라는 개념이 떠올랐다. 그래서 구글링을 통해 객체활용법들을 보고 문제를 해결하였다.

 

 

 풀이 이후 문제점

 

 하지만 책에서나 인강에서 객체를 접해보았지만 직접 활용해본적은 없었기에 약간 헤맸던것같다. 객체를 활용하여 문제를 풀이를 해본것은 이번이 처음이였기 때문에 정리가 안된느낌이 너무나 많이 들었고 더해서 불필요한 내용들도 있는것 같았다.

 


 

## javascript에서의 객체 생성 방법 3가지

 

 자바스크립트에서 객체 생성방법에는 여러가지가 있다.

 

 Object() 생성자 함수 사용, 객체 리터럴 이용 방식, 생성자 함수 이용 이렇게 3가지가 있는데

(사실 더 있을지도!? 아님 말고.)

 

 이번 문제를 풀때에는 이러한 방법들 중에서 생성자 함수 이용 방법을 사용하기로 하였다

 

 왜냐하면 생성자 함수를 호출할 때 다른 인자를 넘김으로써 같은 형태의 서로다른 객체, 이 문제에서는 stage별로 서로 다른 객체를 생성할 수 있기 때문이다.

 


 

## 객체 생성을 활용한 문제 풀이

 - 맨 처음 풀이

function solution(N, stages) {
  const userTotal = stages.length;
  const userState = [];
  const failProb = [];
  const answer = [];
  let userCount = stages.length;

  const exArr = [];

  class Example {
    constructor(stage, prob) {
      this.stage = stage;
      this.prob = prob;
    }
  }

  // userState 정의 (라운드마다 유저 수 구하기.)
  for (let i = 0; i < N; i++) {
    let temp = 0;

    for (let j = 0; j < userTotal; j++) {
      if (stages[j] == i + 1) temp++;
    }

    userState.push(temp);
  }

  // userState와 userCount를 활용하여 실패율 배열(failProb) 정의하기
  failProb.push(userState[0] / userCount);

  for (let i = 1; i < N; i++) {
    failProb.push(userState[i] / (userCount - userState[i - 1]));
    userCount -= userState[i - 1];
  }

  // 정렬하고 어떻게 순서 나열할것인가.
  // 확률이 같을때? 어떻게 할것인가.
  // 객체 활용?, 그냥 노가다? 가독성은?

  for (let i = 0; i < N; i++) {
    exArr.push(new Example(i + 1, failProb[i]));
  }

  exArr.sort(function (a, b) {
    return a.prob > b.prob ? -1 : a.prob < b.prob ? 1 : 0;
  });

  for (let i = 0; i < N; i++) {
    answer.push(exArr[i].stage);
  }

  return answer;
}

 

 일단 주석이 없다면 정말 코드가 알아보기 힘들것 같아 보인다. 그리고 급하게 풀이하느라 변수명도 제대로 정의하지 못했을 뿐더러 객체를 생성하는 방법도 현 시점 개발자들 사이에서 선호하는 방식이 맞는건지도 잘 알지 못한다.

 

   - 개선해야 할 점

    변수명 수정하기, 선호도 높은 객체 생성 방식 채택, do clean Code!!

 

 

 - 개선된 코드

function solution(N, stages) {
  const answer = [];
  const userState = [];
  const stageState = [];
  let userTotal = stages.length;

  class Example {
    constructor(stage, failureRate) {
      this.stage = stage;
      this.failureRate = failureRate;
    }
  }
  
  // userState 정의 (라운드마다 유저 수 구하기)
  for (let i = 0; i < N; i++) {
    let temp = 0;

    for (let j = 0; j < userTotal; j++) {
      if (stages[j] == i + 1) temp++;
    }

    userState.push(temp);
  }

  // 라운드별 객체 생성.
  stageState.push(new Example(1, userState[0] / userTotal))
  userTotal -= userState[0];

  for (let i = 1; i < N; i++) {
    const stage = i + 1;
    const failureRate = userState[i] / userTotal
    
    stageState.push(new Example(stage, failureRate));
    userTotal -= userState[i];
  }

  stageState.sort((a, b) => b.failureRate - a.failureRate);

  for (let i = 0; i < N; i++) {
    answer.push(stageState[i].stage);
  }

  return answer;
}

 

   - 후기

     그런데 꼭 객체를 써서 풀어야 했었나 싶긴하다. 객체로만 하려다가 문득 이러한 생각이 들었기 때문이다.

(아니 굳이 객체 쓸게 아니라 2차원 배열 쓰면 끝나는거 아닌가?)

 

     사실 어느걸 쓰든 정답이긴 하지만 나는 배워가는 과정이기 떄문에 새로운 방법으로 무언가를 해보았다는것에 큰 의미를 두고 싶다. 처음이라 약간 힘든 과정이였지만 조금더 자바스크립트에 대한 지식의 폭을 넓혀가고 있다는 느낌은 곧 내가 성장하고있다는 증거이기도 하니까 라고 생각하기로 했다.