설명
N입력으로 양의 정수 N이 입력되면 2개 이상의 연속된 자연수의 합으로 정수 N을 표현하는 방법의 가짓수를 출력하는 프로그램을 작성하세요.
만약 N=15이면
7+8=15
4+5+6=15
1+2+3+4+5=15
와 같이 총 3가지의 경우가 존재한다.
입력
첫 번째 줄에 양의 정수 N(7<=N<1000)이 주어집니다.
출력
첫 줄에 총 경우수를 출력합니다.
예시 입력 1
15
예시 출력 1
3
소스 코드 1
import java.util.Scanner;
public class Main {
public static int solution(int N) {
int ans = 0;
//2개의 자연수를 뽑아 답을 구한다해도 홀수의 경우 (N/2)+(N/2+1) 의 경우가 최대이므로 N/2+1까지만 루프
for (int i = 1; i <= N / 2 + 1; i++) {
int sum = 0;
//i부터 차례로 카운트해서 더하며 sum이 N을 넘지 않을 때 까지 반복
//만약 sum==N을 충족 못 시키면 ans 카운트 없이 그냥 넘어간다
for (int j = i; sum < N; j++) {
sum += j;
if (sum == N) {
ans++;
}
}
}
return ans;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println(solution(N));
}
}
소스 코드 2
import java.util.Scanner;
//연속된 자연수의 합 (투포인터)
public class Main {
public static int solution(int N) {
int ans = 0;
int lt = 1; //left를 1로 둔다.
int sum = 0;
//2개의 자연수를 뽑아 답을 구한다해도 홀수의 경우 (N/2)+(N/2+1) 의 경우가 최대이므로 N/2+1까지만 루프
for (int rt = 1; rt <= N / 2 + 1; rt++) {
sum += rt; //루프 마다(rt가 증가할 때 마다) rt를 sum에 더해준다
while (sum >= N) {
if (sum == N) { //같을 경우는 ans를 카운트 해준다.
ans++;
}
//sum이 N보다 작아질 때 까지 left를 올려주며 sum에서 빼준다.
sum -= lt;
lt++;
}
}
return ans;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println(solution(N));
}
}
소스 코드 3
import java.util.Scanner;
//연속된 자연수의 합 (수학)
public class Main {
//2개의 숫자로 15를 만드는 경우의 수
//먼저 1부터 차례로 두개를 뽑고 15에서 합을 뺀다 -> 15-(1+2) =12
//이 값이 뽑은 숫자의 개수(2개)로 나눴을 때 나머지가 0이라면 정답 -> 12%2=0
//왜 그렇게 되냐면 1과 2에 12/2값인 6을 하나씩 할당해주면 7과 8이 되어서 두 수의 합이 15가 된다.
public static int solution(int N) { //if 15
int ans = 0;
N--; //1 뽑고 N에서 빼주기
int cnt = 1; //연속된 자연수 개수 (현재 1)
while (N > 0) {
cnt++; //그 다음 수를 뽑고 (뽑은 개수와 수의 값은 일치)
N -= cnt; //그 수를 N에서 빼준다
if (N % cnt == 0) { //만약 N에서 cnt를 나눴을 때 나머지가 0이라면 (1~cnt 까지 모두 같은 값을 할당해줄 수 있다면)
ans++;//정답이므로 ans 카운트
}
}
return ans;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println(solution(N));
}
}
'algorithm' 카테고리의 다른 글
학급 회장 / HashMap 정리 (0) | 2024.05.13 |
---|---|
최대 길이 연속부분수열 (0) | 2024.05.13 |
연속 부분수열 (0) | 2024.05.11 |
최대 매출 (0) | 2024.05.11 |
공통원소 구하기 (0) | 2024.05.09 |