주니어 기초 코딩공부/JAVA_programmers_코딩테스트

연속된 수의 합_programmers_lev00

jju_developer 2023. 1. 3. 15:05
728x90

<코딩 테스트>

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

 

<나의 풀이 과정>

1.      int[] answer = 답의 배열의 길이는 num와 같아야합니다.

2.      x + x+1 + x+2 + x+3 + x+4... 1부터 곱해야하는 수를 모두 모아 더하고 

맨 앞의 x를 구해야 합니다.
3.      for문을 이용하여 모두 
        for(int i = 1; i < num; i++){ // 1부터 num-1까지 모두 더하기
            xNum+=i;    
        }

 

공식: (num*(num+1))/2 = xNum

 

4.    이제 x를 찾아야합니다.         
        int x = (total - xNum) / num; // 연속되는 숫자 중 맨 처음 숫자
        // 1+2+3+4 다 더한 값에서 =10 이제 ttl 값 15를 빼면 5/5 =1

 

5.  x를 for문을 이용해서 하나씩 더해줍니다.

 

<나의 풀이 코드>

package com.programmers.level00.연속된수의합;

//연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 
//연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
public class Test {
	public static void main(String[] args) {
		System.out.println(solution(3, 12));// [3, 4, 5]
		System.out.println(solution(5, 15));// [1, 2, 3, 4, 5]
	}

	static int[] solution(int num, int total) {
        // 연속된 정수
        // ex) num = 5, total = 15
        // 연속된 정수 5개를 모두 더했을 때 15가 되는 정수들을 오름차순으로 배열에 담기
        // num이 5일때
		// x + x+1 + x+2 + x+3 + x+4 = 15
        // 5*x + (1+2+3+4) = 15  / num * x + (1+2+3+.....+num-1) = total
        // 5x = 15-10=5
        // x = 1
        int[] answer = new int[num];
        
        int xNum = 0; // 1부터 num-1 까지 모두 더한 숫자
        //x + x+1 + x+2 + x+3 + x+4... 1부터 곱해야하는 수를 모두 모아 더함.
        
        for(int i = 1; i < num; i++){ // 1부터 num-1까지 모두 더하기
            xNum+=i;                  // 공식있음 : (num*(num+1))/2 = xNum
        }
        
        int x = (total - xNum) / num; // 연속되는 숫자 중 맨 처음 숫자
        // 1+2+3+4 다 더한 값에서 =10 이제 ttl 값 15를 빼면 5/5 =1
        
        for(int i = 0; i < num; i++){ // 정답 배열에 숫자 x부터 1씩 증가한 값 더한값 넣어주기
            answer[i] = x + i;        // answer = [1,1+1,1+2,1+3,1+4]
        }
        
        return answer;
    }
}

<다른 사람 풀이>

class Solution {
        public int[] solution(int num, int total) {
                int[] answer = new int[num];
                int check = num*(num+1) / 2;
                int start = (total - check) / num + 1;
                for (int i = 0; i < answer.length; i++) {
                        answer[i] = start + i ;
                }
                return answer;
        }
}

<다른 사람 풀이>

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        
        int nSum = num * (1 + num) / 2;
        int start = (total - nSum) / num;

        for(int i=1; i<num+1; i++){
                answer[i - 1] = i + start;
        }
        
        return answer;
        
    }
}

//설명
/*
등차수열의 합 공식을 응용하여 문제를 풀이하였습니다.
첫번째 테스트 케이스를 대입 하여 풀어보겠습니다.
a. num = 3, total = 12
b. nSum = 3 * (1 + 3) / 2 ## nSum은 6
c. start = (12 - 6) / 3 ## start는 2
d. for문 돌며 1 ~ 3까지 반복하면서 answer배열에 i+start를 해줍니다.
e. answer 배열에 3,4,5가 저장됩니다.
*/

 

 

 

 

 

 

 

 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120913

 

프로그래머스

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

programmers.co.kr

 

728x90