알고리즘
백준 1120번 문자열 - 자바
Won's log
2023. 10. 30. 14:44
1120번은 브루트포스 문제이다.
문제는 다음과 같다.
입출력 결과는 다음과 같다.
결론부터 말하자면 구지 문자열 A 앞뒤로 알파벳을 추가할 필요가 없다고 생각이 들었다.
왜냐면! 어차피 문자열 A이 B에 동일하게 있는지 확인을 하면 된다고 생각하여
각각의 문자열을 비교/대조하면 된다고 생각하였다.
우선 각각의 값을 받아야하므로 BufferedRreader을 사용하였다.
입력되는 값들이 공백으로 띄어져 있으므로 각각의 값을 받기 위해 StringTokenizer을 사용하였다.
이후에 최소값과 비교하기 위해 최대값을 가진 변수를 초기화하였다.
이중 for문을 사용해서 문자열 A와 B의 인덱스를 확인하였다.
첫 번째 for문는 B를 순회하며 길이를 파악하는 용도!
두 번째 for문은 A를 순회하며 길이를 파악하고
A와 B의 문자열을 반복해서 확인한다.
이를 통해 차이가 난 갯수(difference)가 점가되어 마지막에는 최소값을 선택하는 방법!
완성 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 사용자로부터 입력받은 문자열을 공백으로 구분하여 토큰으로 분리
// 입력 문자열에서 분리된 두 개의 토큰을 문자열 A와 B에 저장
String A = st.nextToken();
String B = st.nextToken();
int minDifference = A.length(); // 차이 중에 최대값
for (int i = 0; i <= B.length() - A.length(); i++) {
// i 변수는 B 문자열을 순회하는 인덱스
// A의 길이가 B의 길이와 같아질 때까지 실행
int difference = 0; // 반복에서의 차이 값을 저장하는 difference 변수를 초기화
for (int j = 0; j < A.length(); j++) {
// j 변수는 A 문자열을 순회하는 인덱스
if (A.charAt(j) != B.charAt(j + i)) { // A와 B의 해당 위치의 문자를 비교 && 다른 문자인 경우를 확인
difference++; // 다른 문자가 발견되면 difference 값을 증가
}
}
minDifference = Math.min(minDifference, difference);
// 현재까지의 최소 차이(minDifference)와 현재 차이(difference)를 비교하여 최소값을 선택
}
// A와 B의 길이가 같을 때의 차이를 출력합니다.
System.out.println(minDifference);
}
}
위 방법이 정답은 아니기에 다른 방법으로도 풀어보고 개선해가야겠다고 다짐하였다.
부족한 부분이 많으므로 첨언이 있으시다면 환영입니다!