Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_1522] 문자열 교환 본문

Study/Problem Solving

[BOJ_1522] 문자열 교환

monitor 2023. 9. 3. 16:50

슬라이딩 윈도우 기법을 오랜만에 적용 해보아서 처음에 꽤나 헤맸던 문제다.

 

aaabbaa 라는 문자열이 있으면 a의 갯수만큼 카운팅해서 그때의 존재하는 b의 갯수를 세면 총 옮겨야 하는 교환의 횟수가 된다.

 

ababababab -> 중 a가 5개다. 즉, a 5개가 연속되면 된다. 그럼 여기서 ababa의 경우를 보면 b 두개 빼고 그 위치에 a 나머지 두개를 넣는다고 생각하면 된다.

 

이런식으로 생각을 하면 떠오르기가 쉬운데 처음에 캐치하기 힘들었던것 같다.

 

그리고, 문제 조건 중 원통의 구조로 마지막과 처음이 이어진 circle_queue 처럼 생각을 해야 하는 부분이 있다.

 

슬라이딩 윈도우가 처음이라면 블로그에 정리하였으니 찾아보면 좋을 것 같다. 

 

슬라이딩 윈도우

슬라이딩 윈도우(Sliding Window)는 배열 또는 문자열에서 연속적인 요소의 부분집합을 찾는 데 사용되는 알고리즘 기술 알고리즘은 주어진 문제의 해결을 위해 윈도우을 움직이면서 데이터를 처리

tester-1.tistory.com

 

아래는 슬라이딩 윈도우 기법을 사용해서 푼 풀이이다.

package Sliding_Window;
import java.util.*;
import java.io.*;
public class BOJ_1522 {
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");
        String str = tk.nextToken();
        int acnt = 0;
        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) == 'a'){
                acnt++;
            }
        }
        int windowSum = 0;
        for(int i = 0; i < acnt; i++){

            if(str.charAt(i) == 'b') {
                windowSum++;
            }
        }
        int sum = Integer.MAX_VALUE;
        for(int i = acnt; i < str.length(); i++){
            if(str.charAt(i-acnt) == 'b'){
                windowSum--;
            }
            if(str.charAt(i) == 'b') {
                windowSum++;
            }
            sum = Math.min(sum,windowSum);
        }
        for(int i = str.length(); i < str.length() + acnt; i++){
            int before = (i-acnt)%str.length();
            if(str.charAt(before) == 'b'){
                windowSum--;
            }
            int after = i%str.length();
            if(str.charAt(after) == 'b') {
                windowSum++;
            }
            sum = Math.min(sum,windowSum);
        }
        System.out.println(sum);
    }
}

 

 

 

1522번: 문자열 교환

a와 b로만 이루어진 문자열이 주어질 때,  a를 모두 연속으로 만들기 위해서 필요한 교환의 회수를 최소로 하는 프로그램을 작성하시오. 이 문자열은 원형이기 때문에, 처음과 끝은 서로 인접해

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_1205] 등수 구하기  (0) 2023.09.05
슬라이딩 윈도우  (0) 2023.09.03
[BOJ_1446] 지름길  (0) 2023.08.27
[BOJ 15989] 1,2,3 더하기4  (0) 2023.08.26
[BOJ 7568] 덩치  (0) 2023.08.20