한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램을 작성하세요.
첫 번째 줄에 문자열 s와 문자 t가 주어진다. 문자열과 문자는 소문자로만 주어집니다.
문자열의 길이는 100을 넘지 않는다.
첫 번째 줄에 각 문자열 s의 각 문자가 문자 t와 떨어진 거리를 순서대로 출력한다.
예제 입력
teachermode e
예제 출력1 0 1 2 1 0 1 2 2 1 0
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
char ch = sc.next().charAt(0);
for (int i : solution(str, ch)) {
System.out.print(i + " ");
}
}
public static int[] solution(String str, char ch) {
int[] answer = new int[str.length()];
int p = 1000;
for (int i=0; i<str.length(); i++) {
if (str.charAt(i) == ch) {
p = 0;
answer[i] = p;
}
else {
p++;
answer[i] = p;
}
} // end for
p = 1000;
for(int i=str.length()-1; i>=0; i--) {
if (str.charAt(i) == ch) {
p = 0;
//answer[i] = p;
}
else {
p++;
answer[i] = Math.min(answer[i], p);
}
}
return answer;
}
}
우선 예제입력인 teachermode e 를 살펴보면 가장 가까운 e로부터의 거리를 출력한다고 알 수 있다.
또한 문자열의 길이는 100을 넘지 않는다고 한다.
그렇기 때문에 answer [] 에 각 문자가 떨어져있는 거리를 구하기 위해서 우선 p라는 변수를 하나 생성하고 문자 최대 길이인 100보다 넉넉하게 큰 수인 1000으로 초기화 시켰다.
그 이후 str 배열을 돌면서 str[i]가 입력한 문자일 경우 p를 0으로 초기화하고 그렇지 않다면 p++를 해주었다.
그 결과 answer[] 에는 순서대로 1001, 0, 1, 2, 1, 0, 1, 2, 2, 1, 0 이 담기게 된다.
하지만 최단거리를 구해야하기 때문에 역순으로도 돌며 다시 배열에 값을 저장해야되는데 이때 기존의 answer[i] 값과 p 값을 비교하여
더 작은 값을 집어넣어야한다.