Programmers

Programmers 문제 풀이 23

백단비 2023. 6. 19. 12:12

문제 설명 : 다음에 올 숫자

 등차수열 혹은 등비수열 common이 매개변수로 주어질 때,

 마지막 원소 다음으로 올 숫자를 return 하는 solution함수??

 

 

제한사항

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

 

입출력 예

 

common result
[1,2,3,4] 5
[2,4,8] 16

 

문제 풀이 

접근)) 그냥 길이가 3이상이니까

2번째 원소 -1번째 원소 === 3번째 원소 - 2번째 원소 이면 등차수열

2번째 원소 / 1번째 원소 === 3번째 원소 / 2번째 원소 이면 등비수열

그다음 공차 구해주고 풀면 끝이겠지 생각해서 풀었다.

function solution(common) {
	const last = common.length - 1
	if(common[2]-common[1] === common[1]-common[0]) {
		return (common[last]) + common[1] - common[0]
	}
	if((common[2] / common[1]) === (common[1] / common[0])) {
		return (common[last]) * (common[2] / common[1])
	} 
}

=> 생각해보니 if를 두 번 쓸게 아니라 그냥 else 하고 return 해주면 되는 거였다.

어차피 등차 등비밖에 없었으니까....

 

문제 설명 : 연속된 수의 합

연속된 세 개의 정수를 더해 12가 되는 경우는 3,4,5이다. 두 정수 num과 total이 주어진다.

연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return 하는 solution함수??

 

제한사항

  • 1≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

 

입출력 예

 

num total result
3 12 [3,4,5]
5 15 [1,2,3,4,5]
4 14 [2,3,4,5]
5 5 [-1,0,1,2,3]

 

문제 풀이

접근1) for문 두 개 돌려서 num의 숫자만큼 배열하나 만들어서 연속된 수를 넣으면 될 것 같았다

그다음 연속된 수는 reduce로 합쳐서 합계 sum과 total을 비교해서 맞으면 retrun 해주고,

틀리면 sum과 answer를 초기화시켜서 다시 for문이 진행되도록 하게 했다.

function solution(num, total) {
	var answer = [];
	let sum = 0
	for(let i = -100; i <= 100; i++) {
		for(let j = i; j < i+num; j++){
			answer.push(j)
		}
		sum = answer.reduce((a,b) => a+b)
			if(sum === total){
				return answer
			}else{
				sum = 0
				answer=[]
			} 
		}
	return answer;    
}

 

접근 2) 수열을 아시는 분이 있다면 식은 더 간단해진다.

등차수열의 첫항은 a 일반항은 a+(n-1) d (:n은 몇 번째 항인지에 대해 d는 공차)

L을 마지막항이라고 하면 등차수열의 합은 아래와 같아지는데 등차수열의 합을 이용해 첫항을 구하면 다음과 같다.

a = (2 * 합 / n  -  n + 1) / 2

그럼 첫항은 a이고 배열을 만들어서 하나씩 넣어주면 문제가 풀린다.

위 문제에 대입해 보면

a = (2 *total / num - num + 1) / 2가 된다.

function solution(num, total) {
	const a = ((2 * total / num) - num + 1) / 2
	return Array(num).fill(a).map((v,i) => v+i)
}

 => a로 채워진 배열을 만들어서 공차는 1이기 때문에

index 대로 값을 더해주면 오름차순으로 담아진 배열이 완성된다.

 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

320x100

'Programmers' 카테고리의 다른 글

Programmers 문제 풀이 25  (0) 2023.06.21
Programmers 문제 풀이 24  (0) 2023.06.20
Programmers 문제 풀이 22  (0) 2023.06.18
Programmers 문제 풀이 21  (0) 2023.05.22
Programmers 문제 풀이 20  (0) 2023.05.21