프로그래머스 숫자의 표현

박은빈·2022년 10월 20일

코딩

목록 보기
8/19

자연수 n이 주어질때 그 자연수를 만들 수 있는 연속된 숫자의 합들의 개수를 구하여라

ex) n = 15

  • 1+2+3+4+5 = 15
  • 4+5+6 = 15
  • 7+8 = 15
  • 15 = 15

해결방식

딱 보자마자 떠오른 공식이 있다.
바로 가우스가 초딩때 만든 등차수열의 공식이다

만약 1부터 100까지의 합을 구한다고 하면
거꾸로 뒤집은 수를 나란히 두라고 했다
그렇게되면 1은 100와 만나고 2는 99, 3은 98...
이렇게 각 숫자의 합이 101이 되게된다.
이러한 숫자가 100개 즉 숫자의 개수만큼있게된다
그리고 이 수에서 2를 나누어주면 합이 나오게된다

이 공식을 이용해봤다
시작이 x, 끝이 y, 수의 개수가 z라고 할때
합 n은

n = (z*(x+y))/2

가 되게된다
이 공식을 이용해 코드를 짰다

class Solution {
    public int solution(int n) {
        int answer = 1;
        int num = 1;
        int n2 = n*2;
        boolean tf = true;
        
        while(tf) {
        	for(int i=num+1; i<=n/2+1; i++) {
            	if(n2 == (i-num+1)*(num+i)) {
                	answer++;
                    break;
          		} else if (n2 < (i-num+1)*(num+i)) {
                    break;
                }
        	}
            if(num == n/2+1) {
                tf = false;
            }
        	num++;
        }
        
        return answer;
    }
}

먼저 답인 answer에 1을 주었다.
이유는 더하기가 아닌 자기 그 자체도 카운트되기때문이다

그리고 num (x)를 주고
나누기2를 n과 붙여서 n2를 선언시켰다
이유는 밑에 반복문에 계속 2를 나누는거보다 한번 2를 곱하는게 더 효율적이기 때문이다

그리고 무한 while문을 돌리고 그 안에 for문을 통해 같은수를 찾았다.
num+1부터 시작해서 n/2+1까지 돈다
이 이유는 num이 x이고 i가 y이기때문에 +1을 주었고
n/2+1은 연속된 자연수의 합은 아무리 커도 n/2+1이하이기 때문이다

그렇게 if문을 통해 위에서 만든 공식을 넣어서 값이 일치하면 answer++을 해주었다

그리고 num이 n/2+1즉 연속된 자연수의 최대값에 도달하면 멈추게 만들었다

profile
안녕하세요

0개의 댓글