다희의 코딩 성장일기

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

Algorithm/백준 BOJ

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

ilmiodiario 2022. 1. 13. 23:43

[ 문제 ]  [백준] 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를 어떻게 교환하지?에서 머물러있으면 이렇게 못풀듯..

Comments