코테/백준

[백준/JAVA] 1522번: 문자열 교환

imname1am 2023. 9. 7. 11:08
반응형

🔺 문제

 

1522번: 문자열 교환

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

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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String str = br.readLine();
        int min = Integer.MAX_VALUE;
        
        int aCnt = 0;
        for(int i = 0 ; i < str.length() ; i++) {
            if(str.charAt(i) == 'a')
               aCnt++;
        }
        
        for(int i = 0 ; i < str.length() ; i++) { // [브루트포스] 0 ~ 마지막 인덱스까지
            int bCnt = 0;
            
            for(int j = i ; j < i + aCnt ; j++) { // 🔔 [슬라이딩 윈도우] 해당 인덱스 ~ 그 위치에서 a길이까지
                if(str.charAt(j % str.length()) == 'b')
                    bCnt++;
            }
            
            min = Math.min(min, bCnt);
        }
        
        System.out.println(min);
    }
}
cs
✅ 해결 아이디어
✔ 슬라이딩 윈도우 + 브루트포스
1. 주어진 문자열에서 a의 길이를 센다.
2. "교환 횟수의 최솟값" = b가 있다면, b 갯수를 카운팅하고 이 중 최솟값

 

0부터 끝 인덱스까지 시작해서,

그 위치에서 a의 길이까지 살펴보며 b 갯수 카운팅

• ababab -> b 1개 교환

• ababab -> b 2개 교환

• ababab -> b 1개 교환

.

.

.

=> 이 중 교환하는 최솟값이 최소 교환 횟수

 

 

💥 유의사항

• 문자열 범위를 넘어가면, 다시 0번째부터 살펴볼 수 있게하기 (∵ 문자열이 원형으로 이뤄졌으므로)

 

 


💬 느낀 점

와 어떻게 이런 생각을 하지,,? 

슬라이딩 윈도우 복습 좀 해야겄다,,

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[백준] 1522. 문자열 교환 (자바 JAVA)

[ 문제 ] [백준] 1522. 문자열 교환 (자바 JAVA) 문제 링크 : https://www.acmicpc.net/problem/1522 1522번: 문자열 교환 a와 b로만 이루어진 문자열이 주어질 때, a를 모두 연속으로 만들기 위해서 필요한 교환의

ilmiodiario.tistory.com

 

반응형