[문자열] 10.가장 짧은 문자거리
설명
한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램을 작성하세요.
입력
첫 번째 줄에 문자열 s와 문자 t가 주어진다. 문자열과 문자는 소문자로만 주어집니다.
문자열의 길이는 100을 넘지 않는다.
출력
첫 번째 줄에 각 문자열 s의 각 문자가 문자 t와 떨어진 거리를 순서대로 출력한다.
예시 입력 1
teachermode e
예시 출력 1
1 0 1 2 1 0 1 2 2 1 0
<<풀이>>
우선 내가 처음에 했던 풀이다. ㅋㅋ 이 코드를 자세히 보면 모순이 있음을 알 수 있다.
일단 첫 번째 모순은
첫 시작이 찾는 값이 아닌데도 불구하고 거리가 1이라고 계산하며 시작한다. 내가 말로만 하면 무슨 말인지 인지 못할거다. 해보면 무슨 말인지 인지 한다 !!
만약, abbbbbe 중 찾는 문자가 e라면 가장 첫번째 문자 a는 e와 1거리만큼 있다고 되는 셈이다.
사실상 찾는 문자 e라는 것을 만나는 순간 부터 정확하게 위치 거리가 된다.
그렇기 때문에 대략 크기를 잡는 것이 필요했다.
import javax.print.DocFlavor;
import java.util.ArrayList;
import java.util.Scanner;
class Main{
public ArrayList<Integer> solution(String str, char e) {
ArrayList<Integer> list = new ArrayList<>();
int count = 0;
for (char x : str.toCharArray()) {
if (x != e) {
count++;
list.add(count);
} else {
count = 0;
list.add(count);
}
}
count = 0;
for (int i = str.length() - 1; i >= 0; i--) {
if (str.charAt(i) != e) {
count++;
if (list.get(i) > count ) {
list.add(i, count);
System.out.println(list);
}
} else {
count = 0;
}
}
return list;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
String str = in.next();
char e = in.next().charAt(0);
for (int a : T.solution(str, e)) {
System.out.print(a);
}
}
}
===> 해결
우선 p = 1000으로 설정해두고 시작한다. 이 문제는 왼쪽에서 오른쪽으로 한 번 오른쪽에서 왼쪽으로 한 번 총 두번의 반복문이 필요하다. 그중 작은 값을 넣어줘야 하는 문제이다. 그렇기 때문에 1000으로 설정해두면 오류가 발생하지 않는다. 작은 값을 넣어주면 되니깐, 문제에서도 문자열의 길이가 100을 넘지 않는다고 하니 넉넉하게 1000으로 잡아 줬다.
여기서 사용한 주된 class는 내장 클래스 Math와 그 클래스의 메서드인 min 이다.
import java.util.ArrayList;
import java.util.Scanner;
class Main{
public int[] solution(String str, char e) {
int[] answer = new int[str.length()];
int p = 1000;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == e) {
p = 0;
answer[i] = p;
} else {
p++;
answer[i] = p;
}
}
p = 1000;
for (int i = str.length() - 1; i >= 0; i--) {
if (str.charAt(i) == e) p = 0;
else {
p++;
answer[i] = Math.min(answer[i], p);
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
String str = in.next();
char e = in.next().charAt(0);
for (int a : T.solution(str, e)) {
System.out.print(a + " ");
}
}
}
<<추가 공부>>
내가 처음에 ArrayList를 이용해서 해당 인덱스에 추가하는 add(i, n) 방식을 사용했다. 하지만 이는 진짜 그 위치에 값을 추가하는 거지 기존 값은 한 칸씩 밀린상태로 그대로 남아 있다. 즉, 대체가 되지 않는 것이다. 이러한 기능도 잘 인지하자.
(사실 배열로 쉽게 할 수 있는건데 ㅋㅋ 너무 어렵게 생각했다.. 이 또한 아직 실력이 부족하다는 증거다 ㅎ)
더 열심히 꼼꼼히 잘 정리하자