[Java] 숫자의 표현

소슬잎·2023년 11월 17일

프로그래머스 문제

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

풀이 후기

1. 분석

홀수인 약수 구하는 문제라고 하는데 자세한 이유는 잘 모르겠고 하라는 대로 풀었다. 질문하기에는 효율성 관련해서 얘기가 좀 있던데 이상하게 나는 전부 통과는 했다.

다 풀고 난 다음 고민한 건 좀 더 경량화할 부분이 보인다는 점. 이건 결과를 초기화하지 않고 자신의 값을 총합에서 뺀 다음에 다음 숫자로 넘기면 더 효율적이지 않을까해서 조금 고쳤다.

  1. 1에서 연속은 1+2+3+4+5=15 (이때 add=5이며 1을 빼준다.)
  2. 2로 넘어감, 1을 빼서 2에서부터 시작한 합을 구함
  3. 2+3+4+5 = 14. 15보다 작으니, i+add를 더함
  4. 1번에서 1을 뺐던 이유는 5 다음으로 6을 더해야 하기 때문이다. 원래 6을 더할 예정이었기에 (i=1, add=5) i가 증가한 만큼 add를 뺐음.
  5. 그 뒤로 반복.

저런 느낌이었는데 다시 보니까 간단하게 줄일 수 있어서 또 줄였다. 정확히는 쓸모없는 연산을 정리했음. 긴 설명 없이 '맨 앞에서 하나 빼고, 부족하면 맨 뒤에 하나 더한다.' 한 문장으로 요약이 가능할 것 같다. 근데 다 풀고나니 이런 풀이를 보고 '투 포인터'라고 한다. 뭔가 그런걸 배웠던거 같기도 하고...

2. 실행 결과

3. 코드

1차

class Solution {
    public int solution(int n) {
        int answer = 0;
        int sum = 0;
        int add = 0;
        
        for(int i = 1; i < n / 2 + 1; i++){
            sum -= i - 1;
            
            while(sum < n){
                sum += i + add;
                add++;
            }
            
            if(sum == n){
                answer++;
            }

            add--;
        }
        
        return answer + 1;
    }
}

2차

class Solution {
    public int solution(int n) {
        int answer = 0;
        int sum = 0;
        int add = 1;
        
        for(int i = 1; i < n / 2 + 1; i++){
            while(sum < n){
                sum += add;
                add++;
            }
            
            if(sum == n){
                answer++;
            }

            sum -= i;
        }
        
        return answer + 1;
    }
}
profile
그냥 바보

0개의 댓글