말하는 컴공감자의 텃밭

프로그래머스 숫자의 표현 <3점> - 자바(java) 본문

알고리즘/Programmers - Java

프로그래머스 숫자의 표현 <3점> - 자바(java)

현콩 2023. 7. 3. 17:46
728x90

 

 

프로래머스 숫자의 표현
쉬워 보였다

 

문제는 N이 만약 연속된 수로 나타내지는 값을 출력하는 문제였다.

아이 쉬워

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        if ( n % 2 == 0){
        answer = 1;
        }else answer = 2;
        
        for (int i = (n / 2 +1); i >= 2; i--) {
            if (n % i == 0) {
                answer++;
            }
        }
        
        return answer;
    }
}
 
cs

처음엔 종이에다 슥슥 규칙을 찾아봤다.

그러다 생각해보니 연속적인 수가 홀수면, 예를들어 12 3,4,5 로 나타낼 수 있는데

"이건 4 * 3이 잖아. 약수네~~!" 이래버렸다.

그래서 반 쪼개고 원래 n포함 시키고, 홀수라면 2개 연달아서 표현이 가능하니까

ex) 13 -> 6,7 // 12 -> 2개 연달아 X

answer 초기값을 홀수 짝수로 구분해서 작성했었다.

게임하면서 풀어서 그런가 넘무 단순하게 생각했고~ 이후 종이에 끄적이면서 규칙을 찾아봤다.

 

프로래머스 숫자의 표현
대충 끄적이다가..

 

여전히 약수 느낌이 나다가 7까지 합인 28을 보니 공식이 보였다.

연속적인 수는 결국, 가운데 수 * 양쪽으로 펼쳐진 친구들의 수 이기 때문에 28은 가운데 4 * 7 -> 28 => 1~7의 합이 된다.

이는 28의 약수 홀수 7을 나타내고.

 

다른 수들도 마찬가지 홀수 약수가 많은 63을 쪼개봤다.

63

홀수 약수 21, 9, 7, 3, 1 >> 5개

63

31 32

20   21  22

   6   7   8  9  10  11 12

  3   4  5   6  7  8  9 10 11

. . . 5개!

 

 

물론 연속적인 수들의 합을 배열에 두고, 같으면 ++ 하는 방법도 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
    public int solution(int n) {
        int answer = 0;
        
 
        for (int i = 1; i <= n; i += 2) {
            if (n % i == 0) {
                answer++;
            }
        }
        
        return answer;
    }
}
 
cs
728x90
Comments