티스토리 뷰

반응형

 

기능개발 문제

 

문제는 링크에 잘 나와있으니 따로 첨부하지 않겠다. 

배운 것에 대한 내용을 적을 것이다. 

 

 

1.  map() 익숙해지기

map() 메소드를 그동안 몇 번 써보긴했는데 막상 백지상태에서 쓰는거랑 mdn에서 보고 쓰다가 백지상태에서 써보니 잘 써지지가않았다. 분명 아래의 코드를 map()을 이용하면 더 간단하다는 것을 알았음에도 사용하지 못했다. 

풀다보면 쓸 일이 많으니 더 익숙해져야겠다. 

 

// 내 코드 
 let days = [];
 
 for (let i = 0; i < progresses.length; i++) {
    days.push(Math.ceil((100 - progresses[i]) / speeds[i]));
  }
// map()사용하여 더 간결하게
const days = progresses.map((progress, index) =>
    Math.ceil((100 - progress) / speeds[index])
  );
  console.log(days);

 

 

2. 구현 능력 

어떻게 구현해야할지 아이디어는 생기는데 코드를 구현하는 것에서 어려움이 있다. 그나마 생각해서 for문 을 쓰며 테스트했는데 정답이아니었다. 결국 다른 분 답을 봤지만, 보는 거에 그치지 않고 어떤식으로 했는지 원리를 파악하며 사고력을 키울 것이다. 

 

사고를 기르자!

 

- FIFO

문제에서 '먼저 배포되어야 하는 순서대로 -' 라고 명시했다.

큐(queue)의 원리를 생각하자. 선입선출 원리이다. 문제에서도 명시했듯 뒤에 값이 더 커도 기다렸다가 앞에 있는 것부터 같이 배포되어야 했다.  프린트의 방식이라면 뒤에값이 더 크면 앞에있는 값을 뒷배열에 추가시키는 방법을 썼겠지만, 이 문제에서는 거기까지는 아니었고

무조건 앞에있는게 먼저 나가는게 원칙 이었다.

이 때는 첫 번째 값을 항상 기준으로 두고 나머지 배열값들을 비교하며 문제를 푸려는 사고를 가지자. 

 

- 개수를 반환해야 할 때 

최종적으로 개수를 반환해야 될 때 'let = count = 0 or 1' 변수를 초기값으로 선언하는 것

 

 

사실 내가 생각한 방법은 아래와 같은데, 이렇게 특정 조건에 따라서 배열안에 배열을 만들 때는 어떻게해야할까? 

 

  // 일 수대로 분리한다.
  // [[5],  [10, 1, 1],  [ 20, 1]]
  // 각 day의 day[0].length 를 세준다.  b[1].length

// 이 방법으로 하려면?

 

 

3. for 문에 초기값(initialization) 추가

 i = 0 외에  j = 0 도 추가시킬 수 있다. 

아래 두 for문은 방식은 같으나 초기값에 j를 추가, count변수 생성없이 바로 answer[j]에 값을 추가하는 것의 차이었다.

 

일반적인 방법

let answer = [];

let prodDay = 0

for (let i = 0; i < days.length; i++) {
    if ( prodDay < days[i]) {
        answer.push(1);
        prodDay = days[i]
    } else {
        let temp = answer.pop();
        answer.push(++temp);
    }
}
return answer;

 

 

초기값 j=0을 조건에 명시한 코드

쉼표 ' , ' 로 구분해주면 된다. 

  let answer = [0];
  
  let maxDay = days[0];

  for (let i = 0, j = 0; i < days.length; i++) {
    if (days[i] <= maxDay) {
      answer[j] += 1;
    } else {
      maxDay = days[i];
      answer[++j] = 1;
    }
  }

  return answer;

 

 

추가적으로 for문에 대해서 좀 더 찾아봤는데 모든 for문의 조건은 optional이라는 것을 알게 되었다. 

특히 condition block에서도 조건을 명시하지 않을 수 있는데 이 부분에서는 무한루프가 일어날 수 있으므로 break로 종료를 시켜주는 문이 필수적으로 있어야한다. 

for (let i = 0;; i++) {
   console.log(i);
   if (i > 3) break;
   // more statements
}

 

 

답안 

function solution(progresses, speeds) {
  let answer = [0];
  
  const days = progresses.map((progress, index) =>
    Math.ceil((100 - progress) / speeds[index])
  );

  let maxDay = days[0];

  for (let i = 0, j = 0; i < days.length; i++) {
    if (days[i] <= maxDay) {
      answer[j] += 1;
    } else {
      maxDay = days[i];
      answer[++j] = 1;
    }
  }

  return answer;
}
반응형