문제 설명
등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.
제한사항
- 2 < common의 길이 < 1,000
- -1,000 < common의 원소 < 2,000
- 등차수열 혹은 등비수열이 아닌 경우는 없습니다.
- 공비가 0인 경우는 없습니다.
입출력 예 설명
- [1, 2, 3, 4]는 공차가 1인 등차수열이므로 다음에 올 수는 5이다.
- [2, 4, 8]은 공비가 2인 등비수열이므로 다음에 올 수는 16이다.
내가 생각한 알고리즘은 다음과 같다.
먼저 for 문을 2번 반복한다. (2번만 반복해도 등차/등비를 알 수 있으므로)
for 문의 첫 번째 반복에서 다음을 구한다.
common의 두 번째 요소에서 첫 번째 요소를 뺀 값 >> (1)
common의 두 번째 요소에서 첫 번째 요소를 나눈 값 >> (2)
for 문의 두 번째 반복에서 다음을 구한다.
common의 세 번째 요소에서 두 번째 요소를 뺀 값 >> (3)
common의 세 번째 요소에서 두 번째 요소를 나눈 값 >> (4)
그 후 다음을 비교한다.
(1)
vs (3)
(2)
vs (4)
(1)
=== (3)
등차수열, (2)
=== (4)
등비수열로 구분
최종으로 다음에 올 숫자 구하기
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;
}
// 출처: 프로그래머스 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()
으로 가져왔다.
배열의 메소드를 다 외우진 못해도 많이 익혀두고 활용해야겠다고 느꼈다.
// 출처: 프로그래머스 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로 선언하니 가독성도 좋고 차이값의 변수를 따로 선언/할당 하지 않아도 어떤 의미인지 바로 이해할 수 있었다.
다른 사람들의 풀이를 많이 접해보고 가독성 좋은 변수명에 대한 연구가 필요하다고 느꼈다.