이 영역을 누르면 첫 페이지로 이동
codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

페이지 맨 위로 올라가기

codesche's blog

[자료구조]슬라이딩 윈도우 With 투 포인터

  • 2022.12.26 13:17
  • 알고리즘 지식/자료구조

참고 : https://deergum.github.io/algorithm/algorithm-BJ10025/

 

슬라이딩 윈도우 알고리즘은 2개의 포인터로 범위를 지정한 다음 범위(window)를 유지한 채로 이동(sliding)하며 문제를 해결하는 알고리즘입니다. 부분 배열들을 활용해 특정 조건을 일치시키는 알고리즘이라는 점을 놓고 보면 투 포인터 알고리즘이랑 거의 유사한 방식입니다. 다만 부분 배열의 길이(크기)가 고정적이기 때문에 가변적인 배열의 길이(크기)를 가질 수 있는 투 포인터 알고리즘과는 좀 다릅니다. 창문을 왼쪽부터 오른쪽으로 밀면서 창문 안에 있는 값들을 부분 배열이라고 생각하시면 됩니다.

 

또 다른 차이점은 투 포인터 알고리즘은 부분 배열의 길이가 가변적이기에 부분 배열의 구간을 정할 2개의 포인터 변수가 필요한 반면, 슬라이딩 윈도우 알고리즘은 부분 배열의 길이를 고정적으로 잡기에 포인터 변수가 2개일 필요가 없다는 것입니다. 고정적인 부분 배열의 크기를 나타내는 변수가 있을 경우 포인터 하나만 있어도 부분 배열 크기를 알고 있기에 각 배열의 끝이 어딘지 알 수 있습니다.

 

주황색 칸이 3의 고정 길이를 가지는 부분 배열이라고 가정하겠습니다. 만약 부분 배열의 합을 구하는 문제일 때, 오른쪽으로 한 칸 옮기더라도 옮기기 전 부분 배열과 옮기고 난 후에는 겹치는 부분이 존재합니다. 즉, 기존 구간에서 빠지게 되는 가장 왼쪽 칸의 값은 삭제하고 새 구간에 포함되는 값을 추가해주시면 됩니다.

○ 예제

백준 10025번 - 게으른 백곰

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

 

10025번: 게으른 백곰

첫 줄에 정수 N과 K가 들어온다. 둘째 줄부터 N째 줄까지, 공백을 사이에 두고 각 양동이의 얼음의 양을 나타내는 gi와 양동이의 좌표를 나타내는 xi가 주어진다.

www.acmicpc.net

*문제풀이

슬라이딩 윈도우 알고리즘으로 풀기 위해 윈도우를 처음에 지정한 다음 한칸씩 옆으로 이동하는 방식으로 진행해주시면 됩니다.

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.io.*;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
 
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
 
        int arr[] = new int[1000001];
 
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int g = Integer.parseInt(st.nextToken());       // 얼음의 양
            int x = Integer.parseInt(st.nextToken());       // 좌표
 
            arr[x] = g;
        }
 
        int window = 0;
        for (int i = 0; i < k + 1 && i < arr.length; i++) {
            window += arr[i];
        }
 
        int max = 0;
        for (int i = 0; i < arr.length; i++) {
            int low = i - k - 1;
            int high = i + k + 1;
 
            if (low > 0) {
                window -= arr[low];
            }
 
            if (high < arr.length) {
                window += arr[high];
            }
 
            if (max < window) {
                max = window;
            }
        }
 
        bw.write(max + "\n");
        bw.flush();
    }
 
}
 
Colored by Color Scripter
cs

'알고리즘 지식 > 자료구조' 카테고리의 다른 글

[자료구조]버블 정렬  (0) 2022.12.30
[자료구조]원형 큐  (0) 2022.12.27
[자료구조]브루트 포스  (2) 2022.12.25
[자료구조]투 포인터  (2) 2022.12.24
[자료구조]스택(Stack), 큐(Queue)  (1) 2022.12.23

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [자료구조]버블 정렬

    [자료구조]버블 정렬

    2022.12.30
  • [자료구조]원형 큐

    [자료구조]원형 큐

    2022.12.27
  • [자료구조]브루트 포스

    [자료구조]브루트 포스

    2022.12.25
  • [자료구조]투 포인터

    [자료구조]투 포인터

    2022.12.24
다른 글 더 둘러보기

정보

codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

  • codesche's blog의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (76)
    • Algorithm (15)
      • 백준 (3)
      • 프로그래머스 (10)
      • inflearn 알고리즘(Java) (2)
    • 블로그소개 (1)
    • Back-End (11)
      • Java (10)
      • SpringBoot (1)
    • Database (2)
      • MySQL (0)
      • MariaDB (1)
      • Redis (0)
      • 개념, 이론 (1)
    • Front-End (0)
      • html, css, javascript (0)
    • Git (2)
    • 알고리즘 지식 (11)
      • 자료구조 (11)
    • Study Cafe (21)
      • 기술면접 (6)
      • Clean Code 스터디 (14)
      • CS 스터디 (0)
      • 개발용어 (1)
    • 주간 에세이 (10)
    • DevOps (3)
      • 배포, Front&Back 연동 (1)
      • AWS (0)
      • Docker (1)
      • 이론 (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • git commit
  • 주간에세이
  • 자바 변수
  • java
  • 자바 기초
  • 자료구조
  • 클린코드
  • 개발자 현실

나의 외부 링크

정보

The Code의 codesche's blog

codesche's blog

The Code

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © The Code. Designed by Fraccino.

티스토리툴바