목차
- 개요
- 본문
- 1) 문제
- 2) 과정
- 3) 코드 전체
개요
이번에 알고리즘 스터디에서 JAVA를 이용해 백준 2559번 수열을 풀었습니다. 이를 정리해보고자 합니다.
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
본문
1) 문제
2) 과정
이중 for문 방식으로 풀고 싶었는데 자꾸 틀렸다고 떠서 방식을 바꿔 해결한 문제입니다. 푸는데는 3시간 정도 걸렸고 체감 난이도는 꽤 높았습니다.. n일 중에 연속되는 k일의 온도 합이 가장 컸을때의 온도합구하기가 문제의 핵심이라 생각하고 문제를 풀었고, 제가 문제를 풀며 사용했던 아이디어는 다음과 같습니다.
0) orgArr에 입력받은 수열의 값을 담으며 0~k까지의 합을 max에 미리 구한다.
1) while문을 돌며 왼쪽인덱스(left)와 오른쪽인덱스(right)를 한칸 옮겼을때의 값을 tmp에 담고
2) tmp와 max를 비교해 더 큰 값을 max에 넣어 연속된 k개의 최대합(max)을 갱신해간다.
3) 오른쪽인덱스가 끝에 도달하면 while문을 빠져나와 max를 출력하고 종료한다.
이번문제는 개선과정을 진행했으나 딱히 진척이 없어서 처음 푼 그대로 변화없이 끝났습니다.. 하지만 그럼에도 혹시나 에러로그와 개선과정이 궁금하시다면 맨 아래 전체코드의 깃헙링크에 들어가셔서 주석을 봐주세요!! 설명은 주석으로 최대한 달아뒀어요!! (주석을 다는 습관,, 너무 좋은 습관,,)
2-1) Input
// Variable
static BufferedReader br;
static StringTokenizer st;
// Method - for read input values
private static void readLine() throws IOException{st=new StringTokenizer(br.readLine());}
private static int nextInt() {return Integer.parseInt(st.nextToken());}
// Main
public static void main(String[] args) throws IOException{
// Input
br = new BufferedReader(new InputStreamReader(System.in));
readLine();
int n = nextInt(); // 온도를 측정한 전체날짜의 수
int k = nextInt(); // 연속되는 날의 수
readLine();
int max=0; // n개의 수 중 연속된 k개의 합중 가장 큰 값을 담을 변수
int[] orgArr = new int[n];
for(int i=0;i<n;i++) {
orgArr[i] = nextInt();
if(i<k) max+=orgArr[i]; // 미미 수열의 값을 더해 max를 초기화한다.
}
}
2-2) Logic & Output
public static void main(String[] args) throws IOException{
// Logic
int left = 0; // 왼쪽 인덱스
int right = k; // 오른쪽 인덱스
int tmp = max; // 임시 계산된 총합값을 담을 변수
while(right<n){ // 오른쪽인덱스가 n(끝)이 되기전까지
tmp+=(orgArr[right++]-orgArr[left++]);
// tmp-=orgArr[left++]; // 이전 tmp에서 제일 왼쪽값을 빼고 왼쪽인덱스를 오른쪽으로 한칸 옮기고
// tmp+=orgArr[right++]; // 이전 tmp에서 세로운 오른쪽값을 더하고 오른쪽인덱스를 오른쪽으로 한칸 옮김
max = Math.max(tmp,max); // tmp와 기존의 값(max)를 비교해 더 큰값으로 max를 갱신해나감
}
// Output
System.out.println(max);
}
3) 전체코드
그렇게 완성된 코드는 아래쪽에 링크된 깃헙 레포짓토리에 방문하여 확인해주세요!
앞서 말씀드렸듯이 소요시간, 아이디어, 에러로그 등 더 자세히 보실 수 있습니다.
https://github.com/Park1122/Algorithm-Study/blob/master/sujeong/two_pointers/BOJ2559.java
GitHub - Park1122/Algorithm-Study: 명지대학교 학생들이 모여서 만든 알고리즘 공부 및 코딩테스트 준비
명지대학교 학생들이 모여서 만든 알고리즘 공부 및 코딩테스트 준비를 위한 스터디입니다. Contribute to Park1122/Algorithm-Study development by creating an account on GitHub.
github.com
'알고리즘(JAVA 사용) > Two_Pointers' 카테고리의 다른 글
[알고리즘풀이]백준 2003: 수들의 합2 JAVA (0) | 2022.02.02 |
---|---|
[알고리즘풀이]백준 1806 : 부분합 JAVA (0) | 2022.02.02 |