IT's 우

[java] 프로그래머스 - 숫자의 표현 본문

알고리즘/프로그래머스

[java] 프로그래머스 - 숫자의 표현

디우 2023. 8. 8. 16:54
728x90

📖 풀이한 문제

 

프로그래머스

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

programmers.co.kr


💡 문제에서 사용된 알고리즘

  • 투포인터

📜 코드 설명

  • 연속된 구간의 시작을 left, 끝을 right로 주었다. 연속된 구간의 합(left ~ right)은 num (초기화 : left = 1, right = 1, num = 1)
  • right가 n이라면 탐색의 끝(right 하나가 n을 충족하므로)이므로 answer을 하나 추가해 주고 반복문을 끝내주었다.
  • 그 외에 경우는
  1. num이 n인 경우 ( 연속된 구간이 n인 경우를 찾음) (포인터를 둘 다 하나씩 늘려준다.)
  • answer ++
  • right 값을 +1
  • num에는 right(늘린 값)을 더해주고 left(left도 오른쪽으로 옮길 것이므로 전 값을 빼준다.)를 빼준다.
  • left 값을 +1
  1. num이 n보다 작은 경우 (right 값을 하나 늘려준다.)
  • right 값을 +1해주고
  • num에 늘린 right 값 더해준다.
  1. num이 n보다 크다면 (left 값을 하나 늘려준다.)
  • num에 left 값을 빼주고
  • left 값을 +1 해준다.

 


📜 코드

public class 숫자의표현 {
    public int solution(int n) {
        int answer = 0;
        int left = 1;
        int right = 1;
        // left ~ right 연속된 구간의 합
        int num = 1;
        while (right <= n) {
            // right가 n이라면 탐색의 끝이므로 answer++
            if (right == n) {
                answer++;
                break;
            }
            // 현재 left~ right 구간의 합 num이 n이면 더 탐색하기 위해 right와 left를 오른쪽으로 하나씩 옮겨준다.
            // num에는 늘린 right를 더해주고, 늘리기 전 left를 빼준다.
            else if (num == n) {
                answer++;
                right++;
                num = num + right - left;
                left++;
            }
            // num이 n보다 작으면 right를 늘려주고, num에도 늘린 right를 더해준다.
            else if (num < n) {
                right++;
                num += right;
            }
            // num이 n보다 크다면 left를 빼주고 left를 하나 늘려준다.
            else if (num > n) {
                num -= left;
                left++;
            }
        }
        return answer;
    }
}
728x90
반응형