프로그래머스 코딩테스트 연습 회고록 - 1일차

H.GOO·2022년 11월 26일
0
post-thumbnail

프로그래머스 Lev.0 "다음에 올 숫자"

문제 설명

문제 설명
등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 2 < common의 길이 < 1,000
  • -1,000 < common의 원소 < 2,000
  • 등차수열 혹은 등비수열이 아닌 경우는 없습니다.
  • 공비가 0인 경우는 없습니다.

입출력 예 설명

  • [1, 2, 3, 4]는 공차가 1인 등차수열이므로 다음에 올 수는 5이다.
  • [2, 4, 8]은 공비가 2인 등비수열이므로 다음에 올 수는 16이다.




나의 풀이

내가 생각한 알고리즘은 다음과 같다.

  1. 먼저 for 문을 2번 반복한다. (2번만 반복해도 등차/등비를 알 수 있으므로)

  2. for 문의 첫 번째 반복에서 다음을 구한다.
    common의 두 번째 요소에서 첫 번째 요소를 뺀 값 >> (1)
    common의 두 번째 요소에서 첫 번째 요소를 나눈 값 >> (2)

  3. for 문의 두 번째 반복에서 다음을 구한다.
    common의 세 번째 요소에서 두 번째 요소를 뺀 값 >> (3)
    common의 세 번째 요소에서 두 번째 요소를 나눈 값 >> (4)

  4. 그 후 다음을 비교한다.
    (1) vs (3)
    (2) vs (4)

  5. (1) === (3) 등차수열, (2) === (4) 등비수열로 구분

  6. 최종으로 다음에 올 숫자 구하기


function solution(common) {
  let answer = 0;
  let preTolerance = 0; // 두 요소를 뺀 값 (등차수열 일 경우 차이값)
  let preMultiTolerance = 0;  // 두 요소를 나눈 값 (등비수열 일 경우 차이값)

  for (let i = 0; i < 2; i++) {
    const tolerance = common[i + 1] - common[i]; // 두 요소를 뺀 값
    const multiTolerance = common[i + 1] / common[i]; // 두 요소를 나눈 값

    if (i === 1) {  // for 문의 두 번째 반복에서 등차/등비 구분해주기
      if (preTolerance === tolerance) {  // 등차수열일 경우
        answer = common[common.length - 1] + tolerance;
      }
      if (preMultiTolerance === multiTolerance) {  // 등비수열일 경우
        answer = common[common.length - 1] * multiTolerance;
      }
    } else {  // for 문의 첫 번째 반복일 경우
      preTolerance = tolerance;  // 뺀 값(차이값)을 preTolerance 에 할당
      preMultiTolerance = multiTolerance;  // 나눈 값(차이값)을 preTolerance 에 할당
    }
  }
  return answer;
}



다른 사람 풀이 및 느낀점 - 1

// 출처: 프로그래머스 J 님 풀이

function solution(common) {
  // 등차수열일 경우
  if ((common[1]-common[0])==(common[2]-common[1])){
      return common.pop() + common[1] - common[0];
  }
  // 등비수열일 경우
  else{
    return common.pop()*common[1]/common[0];
  }
}

느낀점

  • 보자마자... 풀이가 이렇게 짧은 문제였구나.. 반성했다..

  • 제한사항에 common의 길이가 2보다 크다고 했으므로 사실 for 문 없이 index 값으로 간단히 풀 수 있는 문제였다.

  • 또한 나는 가독성을 위해 변수를 따로 선언해주었는데 새로운 변수를 선언하지 않고 푼 풀이가 가독성이 훨씬 좋을 수 있다는 점에서 놀랐다.

  • 배열에서 마지막 요소를 가져오기 위한 방법이 달랐다.
    나는 common[common.length - 1] 로 가져왔고 위의 풀이는 common.pop()으로 가져왔다.

  • 배열의 메소드를 다 외우진 못해도 많이 익혀두고 활용해야겠다고 느꼈다.



다른 사람 풀이 및 느낀점 - 2

// 출처: 프로그래머스 StarBlitz 님 풀이

function solution(common) {
  let n1 = common[0],
      n2 = common[1],
      n3 = common[2];

  return n2-n1 === n3-n2 ? common[common.length-1] + n2-n1 : common[common.length-1]*2;
}

느낀점

  • 이번 풀이는 삼항연산자를 사용하였다.

  • 다른 사람이 봤을 때 이해하기 쉽도록 변수명을 짓다보면 이름이 정말 길어지는 경우가 많다.
    n1, n2, n3로 선언하니 가독성도 좋고 차이값의 변수를 따로 선언/할당 하지 않아도 어떤 의미인지 바로 이해할 수 있었다.

  • 다른 사람들의 풀이를 많이 접해보고 가독성 좋은 변수명에 대한 연구가 필요하다고 느꼈다.

0개의 댓글