본문 바로가기

Coding Test/Problem Number

[Java] 수들의 합5 [2018번]

https://www.acmicpc.net/problem/2018

  • 예제 입력1
15
  • 예제 출력1
4

  • 문제 접근
    • 1부터 N까지의 배열을 생성
    • 더하는 수의 개수는 고정이 아님
  • 문제 해결
    • 1 ~ N까지 배열 생성
    • 시작 ~ 마지막의 합이 N을 넘을 경우 종료
      • Ex) N = 30
        • start = 14, end = 15 ⇒ 14 + 15 ⇒ 29
        • 15(start) + 16(end) ⇒ 31 > 30
        • 즉, 15이후 부터는 30이 만들어지는 경우가 없음
    • 투 포인터로 아래의 규칙 생성
      • 조건 : end가 배열 길이보다 작을 때까지 반복
      • start ~ end의 합이 N보다 작다면 ⇒ end 1증가
      • start ~ end의 합이 N보다 크다면 ⇒ start 1증가
      • start ~ end의 합이 N과 같다면 ⇒ start, end, count 1증가
      • end가 배열 길이보다 작고, start ~ end의 합이 N보다 크면 종료
  • 슈도 코드
goal (목표값 저장)
matchCount(경우의 수 저장)
A[goal+1] (배열 선언)
for(i=1 ~ goal만큼 반복){
	goal[i] = i 저장
}
start (시작값 1 저장)
end (끝값 2 저장)
while(A[start] + A[end]가 goal보다 작거나 같을때까지){
	sum (누적합)
	for(i = start ~ end 반복) sum에 누적
	if(sum이 goal보다 작다면) end 1증가
	else if(sum이 goal보다 크다면) start 1증가
	else { // sum과 goal이 같다면
		start 1증가
		end 1증가
		matchCount 1증가
	}
}
  • 코딩하기
public static void main(String[] args) throws Exception{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int goal = Integer.parseInt(br.readLine());
    int[] A = new int[goal + 1]; // 인덱스 0은 사용하지 않음
    int matchCount = 1;
    for(int i = 1; i < goal; i++){ // 1 ~ N까지의 배열 초기화
        A[i] = i;
    }
    int start = 1, end = 2; // 1 + 2부터 시작
    while(end < A.length){ // 마지막 인덱스가 배열 길이 이상이 되면 종료
        int sum = 0; // 누적 합 변수
        for(int i = start; i <= end; i++) sum += A[i]; // start ~ end 누적합
        if(sum < goal) end++; // 합계가 목표보다 작으면 end를 늘려 합계를 높임
        else if(sum > goal) start++; // 합계가 목표보다 클 경우 start를 늘려 합계를 줄임
        else { // 합계와 목표값이 같을 경우
            start++; end++; matchCount++; // 경우의 수 1 카운트, 시작값과 끝값을 1씩 증가
        }
        // end가 배열 길이보다 작을 때 start + end의 값이 목표보다 커지면 종료
        // 목표값이 1억일 때, 5000만 ~ 9999까지의 연산을 방지
        if(end < A.length && A[start] + A[end] > goal) break;
    }
    System.out.println(matchCount);
}

'Coding Test > Problem Number' 카테고리의 다른 글

[Java] 행렬 곱셈 [2740번]  (0) 2024.07.18
[Java] 2차원 배열의 합 [2167번]  (0) 2024.07.18
[Java] 수들의 합2 [2003번]  (0) 2024.07.18
[Java] 참외밭 [2477번]  (0) 2024.07.17
[Java] 평균은 넘겠지 [4344번]  (0) 2024.07.17