티스토리 뷰

알고리즘

백준 1522

kOsari 2023. 7. 3. 19:15

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

 

1522번: 문자열 교환

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

www.acmicpc.net

 

문제 이해

해당 문제의 경우 a가 연속으로 있기 위해선 몇개의 b를 교환해야 하는 가에 대한 문제이다.

해당 문제의 경우 모든 a가 연속으로 있으면 된다는 것을 기억하고 슬라이딩 윈도우 방식으로 풀었다.

https://soeasyalgo.tistory.com/49

 

슬라이딩 윈도우 알고리즘

이번 포스트에서는 앞서 살펴봤던 투포인터와 아주 유사한 슬라이딩 윈도우에 대해 살펴보자. https://soeasyalgo.tistory.com/47 투포인터 이번에 살펴볼 투 포인터나 다음에 살펴볼 슬라이딩 윈도우는

soeasyalgo.tistory.com

슬라이딩 윈도우에 대해선 위에 설명을 참조하자

 

문제 풀이

a의 개수를 세고 a의 개수만큼을 슬라이딩 윈도우로 설정한다.

처음 부터 끝까지 윈도우에서 b가 얼마나 포함 되었는지 확인하고 

가장 적게 포함된 b의 개수를 출력한다.

import java.util.*;


public class test39 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();

        int min = Integer.MAX_VALUE;

        int aCnt = 0;
        //a의 크기를 계산 
        for(int i=0; i<str.length(); i++) {
            if(str.charAt(i) =='a') {
                aCnt++;
            }
        }
        
        //b의 크기를 계산
        //해당 슬라이딩 윈도우에서 b가 존재 하면 해당 b만큼은 교환을 해줘야 a가 연속으로 있을 수 있다.
        for(int i=0; i<str.length(); i++) {
            int bCnt = 0;
            //처음 부터 끝까지 반복하는데 a의 크기만큼 반복
            for(int j=i; j<i+aCnt; j++) {
                //j가 범위를 넘어갈 수 있기에 나머지만큼만 계산
                int idx = j%str.length();
                //b만큼을 더함
                if(str.charAt(idx) =='b') {
                    bCnt++;
                }
            }
            //b가 가장 적게 나온 윈도우를 선택
            min = Math.min(min, bCnt);
        }
        System.out.println(min);
    }
}

'알고리즘' 카테고리의 다른 글

백준 1092  (0) 2023.07.05
백준 1083  (0) 2023.07.04
백준 1359  (0) 2023.07.01
백준 2553  (0) 2023.07.01
백준 2346번  (0) 2023.06.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함