백준 1120번

95qwer·2022년 5월 13일
0

잘못 생각한 것) 문자열의 포함 여부로 문제를 풀 생각한 것.

A의 문자열에서 한 개씩 빼며, B 문자열 포함 여부를 확인하고,
포함된 것을 확인했으면 B 문자열의 어디서부터 포함 시작(trigger)
인지 가져오기.

trigger부터 한 칸씩 -를 하면서 A 문자열과 비교해나가기(A 문자열의 끝까지)
조건 : trigger >= 0

잘못 생각한 코드)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bfr.readLine());

		char[] A = st.nextToken().toCharArray();
		String B = st.nextToken();
		int aLength = A.length;
		int bLength = B.length();

		int i = 0;
		int trigger = 0;
		int point = 0;
		int count = 0;
		boolean result = true;
		
		StringBuilder sb = new StringBuilder();
		if (aLength < bLength) {
			while (true) {
				for (; i < aLength; i++) {
					sb.append(A[i]);
				}

				if ((trigger = B.indexOf(sb.toString())) > -1) {
					for (int k = point; k >= 0; k--) {
						if (trigger >= 0 && A[k] != B.charAt(trigger--))
							count++;
					}
					break;
				}
				i = (++point);
				sb.delete(0, sb.length());
			}
		} else {
			for (int j = 0; j < aLength; j++) {
				if (A[j] != B.charAt(j))
					count++;
			}
		}
		if(result)
			System.out.println(count);
		else
			System.out.println(aLength);
		bfr.close();
	}
}

생각하면 할수록 조건이 복잡해져서 이 풀이는 아닌 것 같아 다른 아이디어로 풀어보기로 했습니다.
불현듯 스쳐지나가는, 이전 코드의 A 문자열 한 칸씩 증가시키며 포함 확인하기.

A 문자열은 그대로 두고, 어차피 A.length <= B.length이므로
B 문자열에서 idx를 한 칸씩 증가시키며 A와 모든 문자열을 를 확인해보고(어차피 최대 길이 50) 그중 가장 작은 값을 출력시키면 되지 않을까?라고 생각해봤습니다.
문제에서 앞뒤 문자열 추가는 페이크라고 생각하여 애초에 별 생각하지 않았습니다.
여기서 조건은 B 문자열의 남은 길이가 A의 남은 길이보다는 크거나 같아야 한다는 것입니다.

A 문자열 전체와 B 문자열의 [0] ~ A.length-1까지 비교, 서로 다른 문자의 개수 저장
A 문자열 전체와 B 문자열의 [1] ~ A.length-1까지 비교, 이전 값과 비교 후 더 작은 값 저장
...
A 문자열 전체와 B 문자열의 [B.length - A.length] ~ A.length-1까지 비교, 이전 값과 비교 후 더 작은 값 저장

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bfr.readLine());

		char[] A = st.nextToken().toCharArray();
		String B = st.nextToken();
		int aLength = A.length;
		int bLength = B.length();
		int count = 0;
		int min = 999;

		for (int i = 0; bLength - i >= aLength; i++) {
			for (int j = 0; j < aLength; j++) {
				if (A[j] != B.charAt(i + j))
					count++;
			}
			if(min > count)
				min = count;
			count = 0;
		}

		System.out.println(min);

		bfr.close();
	}
}
profile
한땀한땀오타없이

0개의 댓글