반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자료구조
- flutter
- 플러터 동작
- 앱아이콘 변경
- Java
- 싱글톤
- 완전탐색
- 재귀
- 비동기 처리
- 알고리즘
- 프리즈드
- 초기화
- Widget Tree
- linebreak
- zwj
- Android
- IOS
- 코틀린
- 에러
- Lazy
- 플러터
- Kotlin
- dfs
- 자바
- dart
- 프로그래머스
- element tree
- Render object tree
- Singleton
- 거리알고리즘
Archives
- Today
- Total
모바일 개발하는 자바리안의 메모장
자바(JAVA) - 부분합(백준 : 1806) 본문
반응형
https://www.acmicpc.net/problem/1806
유호석 강사님의 알고리즘 강의 중, 투포인터를 배우며 접한 예제 문제.
두개의 포인터를 활용하여 [정답을 찾기 위해 봐야 하는 것들]에 접근할 수 있는 알고리즘이다.
즉, 답을 구하기 위한 정말 필요한 데이터에만 접근하여 전체적인 탐색범위를 크게 압축할 수 있는 알고리즘이다.
이번 예제는 주어진 수열에서 L(eft), R(ight) 두 포인터를 활용하여,
확인한 범위를 줄이고 늘리며,,, 연속된 수의 합, 그리고 길이를 구할 수 있었다.
실행 순서는 다음과 같다 :
1. 수열의 맨 왼쪽부터 확인할 L포인터에 대한 For 반복문 실행
2. 확인된 수의 합계를 저장하는 sum 변수에서 이전에 확인한 L - 1번째 숫자 뺴줌
3. Sum이 S값 이상이 될때까지 & R포인터가 n을 초과하지 않을때까지 a[R]을 sum에 더해줌
* 더해준 뒤엔 R 우측으로 한 칸 이동 > R++
4. sum이 S이상일 경우, 더 짧은 거리 ans에 입력
5. ans값이 초기값과 동일할 경우 > 불가한 case로 ans에 0 입력
6. ans값 출력
<코드>
* 기본 코드 템플릿은 존경하는 류호석 강사님이 제공해주셨습니다.
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static FastReader scan = new FastReader();
static int n, S;
static int[] a;
static void input() {
n = scan.nextInt();
S = scan.nextInt();
a = new int[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = scan.nextInt();
}
}
static void pro() {
int R = 0, sum = 0, ans = n + 1;
// 왼쪽부터 확인하는 L포인터
for (int L = 1; L <= n; L++) {
// ㅣ 이동하며 a[L - 1]만큼 sum에서 감소
sum -= a[L - 1];
// L ~ R까지의 합이 S이상일때까지 R포인터 값 증가
while(R + 1 <= n && sum < S) {
sum += a[++R];
}
// 합이 S 이상일, 더 짧은 거리로 ans 갱신
if(sum >= S) {
ans = Math.min(ans, R - L + 1);
}
}
// 존재하지 않는 경우에 대한 처리
if(ans == n + 1) ans = 0;
System.out.println(ans);
}
public static void main(String[] args) {
input();
pro();
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public FastReader(String s) throws FileNotFoundException {
br = new BufferedReader(new FileReader(new File(s)));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
}
반응형
'Java > Java.algorithm' 카테고리의 다른 글
자바(JAVA) - 124 나라의 숫자(Programmers : 12899) (0) | 2022.03.13 |
---|---|
자바(JAVA) - 짝지어 제거하기(Programmers : 12973) (0) | 2022.03.13 |
자바(JAVA) - 가사검색(Programmers : 60060) (0) | 2021.06.10 |
자바(JAVA) - 문자열 압축(Programmers : 60057) (0) | 2021.06.10 |
자바(JAVA) - 소수 찾기(Programmers : 42839) (0) | 2021.06.10 |
Comments