(1) 개념
시작 인덱스와 종료 인덱스 지정
- 시작 인덱스를 오른쪽으로 한 칸 이동하는 것은 연속된 자연수에서 왼쪽 값을 '삭제'하는 것
- 종료 인덱스를 오른쪽으로 한 칸 이동하는 것은 연속된 자연수의 범위를 한칸 더 확장하는 것
- 같을 때는 경우의 수 1 증가 시키고 종료 인덱스 오른쪽 이동
(2) 이동 원칙
문제 1. 백준 2018번 연속된 자연수의 합 구하기
🔎 접근법
: N의 최대값이 10,000,000이므로 O(n) 복잡도 알고리즘 사용
1. sum이 n보다 작을 때:
2. sum이 n보다 클 때:
import java.util.Scanner;
class Main {
public static void main(String[] args) {
/* 백준 2018번 연속된 자연수의 합 구하기 */
Scanner sc = new Scanner(System.in);
// 1) 값 초기화
int n = sc.nextInt();
int count = 1; // n 자체를 선택할 경우 카운트
int sum = 1;
int start_index = 1;
int end_index = 1;
// 2) 계산
while(end_index != n) {
if(sum > n) { // 합이 정해진 수보다 클 경우 (빼준다-> start 움직이기)
sum -= start_index;
start_index++;
}
else if (sum < n) { // 합이 정해진 수보다 작을 경우 (더해준다 -> end 움직이기)
end_index++;
sum += end_index;
}
else { // 합이 N과 같을 경우 (count 횟수 올린다 후에 end 움직이기)
count++;
end_index++;
sum += end_index;
}
}
System.out.println(count);
}
}
문제 2. 백준 1940번 주몽의 명령
🔎 접근법
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
/* 백준 1940번 주몽의 명령 */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 1) 값 초기화
int n = Integer.parseInt(br.readLine());
int sum = Integer.parseInt(br.readLine());
int [] in = new int[n];
StringTokenizer line = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
in[i] = Integer.parseInt(line.nextToken());
}
// 정렬
Arrays.sort(in);
int count = 0; // 횟수
int start = 0; // 시작 포인터
int end = n-1; // 끝 포인터
// 2) 계산
while (start < end) { // 교차 시 중지
int nSum = in[start] + in[end];
if(nSum > sum) end--; // 정해진 합보다 클 경우 end 포인터 감소
else if (nSum < sum) start++; // 정해진 합보다 작을 경우 start 증가
else {
count++;
end--;
start++;
}
}
System.out.println(count);
}
}
문제 3. 백준 1253번 좋은 수 구하기
🔎 접근법
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
/* 백준 1253번 좋은 수 구하기 */
// 1. 변수 초기화
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer line = new StringTokenizer(br.readLine());
int [] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(line.nextToken());
}
int count = 0;
// 2. 정렬
Arrays.sort(nums);
// 3. 계산
for(int i = 0; i < n; i++) {
int start = 0; // 값을 찾기 위해서 다시 처음부터 시작해야 하니 while문 밖에 선언
int end = n-1;
int find = nums[i]; // 찾을 값
while(start < end) {
if (start == i) {
start++;
continue;
}
if (end == i) {
end--;
continue;
}
int nSum = nums[start] + nums[end];
if (nSum == find) {
count++;
break; // 좋은 수를 찾았으니 다음 i로 넘어감
} else if (nSum < find) {
start++;
} else {
end--;
}
}
}
System.out.println(count);
}
}