다희의 코딩 성장일기
[백준] 1522. 문자열 교환 (자바 JAVA) 본문
[ 문제 ] [백준] 1522. 문자열 교환 (자바 JAVA)
문제 링크 : https://www.acmicpc.net/problem/1522
1522번: 문자열 교환
a와 b로만 이루어진 문자열이 주어질 때, a를 모두 연속으로 만들기 위해서 필요한 교환의 회수를 최소로 하는 프로그램을 작성하시오. 이 문자열은 원형이기 때문에, 처음과 끝은 서로 인접해
www.acmicpc.net
# 접근 방법 및 풀이
- 아이디어를 떠올리기가 어려운 문제다.
- a를 모두 연속적으로 만들기 위해서 먼저 주어진 문자열에서 a의 길이를 센다.
- a가 연속적이라면 교환을 통해서 해당 a의 길이만큼 연속적으로 배치가 된다.
- 예를들어, "ababab"라면 a가 3개가 있으므로 a는 길이 3이된다.
- 따라서 a를 모두 연속적으로 만들기 위해선 "aaa"형태가 되어야한다.
- 주어진 문자열 0번째 인덱스부터 문자열 끝까지 시작해, 그 위치에서 a의 길이까지 살펴보면서 b가 있을경우 b를 a와 교환해주면 연속적인 a를 만들 수 있다.
- 이때 구하는건 교환 회수의 최솟값이므로 b와 a를 직접 교환해주는게 아니라, b가 있다면 b의 카운팅을 세주고 최솟값을 구하면 된다.
- ababab -> b = 1개
- ababab -> b = 2개
- ababab -> b = 1개
- ababab -> b = 2개
- ababab -> b = 1개
- ababab -> b = 2개
- 위와 같이 0인덱스부터 끝 인덱스 까지 살펴보면서 b의 개수를 카운팅해주고 그때 b의 최솟값이 최소의 교환회수가 된다.
- 자세한건 코드참조
# 주의할 점
- 문자열이 원형으로 이어져있으므로 나머지 연산자를 통해서 주어진 문자열의 범위에 넘어가면 다시 0번째 부터 살펴볼 수 있도록 구해야함.
JAVA 코드
package Gold;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class bj1522_문자열교환 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s = in.readLine();
int min = Integer.MAX_VALUE;
int a_len = 0;
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) == 'a')
a_len++;
}
for (int i = 0; i < s.length(); i++) {
int b_cnt = 0;
for (int j = i; j < a_len+i; j++) {
if(s.charAt(j % s.length()) == 'b')
b_cnt++;
}
min = Math.min(min, b_cnt);
}
System.out.println(min);
}
}
REVIEW
풀면 풀수록 새로운 문제 천지구나~~
a와 b를 어떻게 교환하지?에서 머물러있으면 이렇게 못풀듯..
'Algorithm > 백준 BOJ' 카테고리의 다른 글
[백준] 12100. 2048 (Easy) (자바 JAVA) (0) | 2022.01.19 |
---|---|
[백준] 1463. 1로 만들기 (자바 JAVA) (0) | 2022.01.18 |
[백준] 23290. 마법사 상어와 복제 (자바 JAVA) (0) | 2022.01.09 |
[백준] 23288. 주사위 굴리기 2 (자바 JAVA) (0) | 2022.01.07 |
[백준] 10597. 순열장난 (자바 JAVA) (0) | 2021.12.27 |
Comments