한 개의 문자열 str
와 문자 c
가 주어지면 문자열 s
의 각 문자가 문자 c
와 떨어진 최소거리를 출력하는 프로그램을 작성하세요.
첫 번째 줄에 문자열 st
r와 문자 c
가 주어진다. 문자열과 문자는 소문자로만 주어집니다.
문자열의 길이는 100을 넘지 않는다.
teachermode e
첫 번째 줄에 각 문자열 str
의 각 문자가 문자 c
와 떨어진 거리를 순서대로 출력한다.
1 0 1 2 1 0 1 2 2 1 0
문자열 str
의 각 문자와 입력 받은 문자 c
의 거리를 answer 배열에 저장한 후, 반복문을 통해 answer의 값들을 순차적으로 반환하는 방식을 사용했다.
💡
문자열 str
의 n번째 문자가입력 받은 문자 c
와 같다면 n번째 문자와입력 받은 문자 c
의 거리는 0이다.
순방향 순회는 0번째 문자부터 시작해 입력 받은 문자 c
와의 거리를 answer 배열에 저장한다.
n번째 문자가 입력 받은 문자 c
와 같은 값이라면 answer[0]에 0을 저장하고, 같지 않다면 이전 Index 값의 1을 더한 값을 저장한다.
🤔 첫번째 문자는
입력 받은 문자 c
과 같다면 문제가 없지만, 다를 경우에는 이전 값이 없기 때문에 문제가 발생한다. 이런 문제를 방지하기 위해 첫번째 문자에는 임의의 수를 크게 (ex, 1000) 잡아 저장한다.
입력 받은 문자 c
와 같다면 p=0
, 같지 않다면 p++
한 후 저장한다.입력 받은 문자 c
와 같다면 p=0
, 같지 않다면 p++
한 후 저장한다.순방향은 왼쪽의 입력 받은 문자 c
와의 거리만 측정한다. 오른쪽에 위치한 입력 받은 문자 c
의 거리가 더 작을 수 있기 때문에 역방향 순회를 해준다.
입력 받은 문자 c
와 같다면 p=0
, 같지 않다면 p++
한다.입력 받은 문자 c
와 같다면 p=0
, 같지 않다면 p++
한 후 저장한다.class Main {
public int[] solution(String str, char c) {
int[] answer = new int[str.length()];
// 순방향 순회
int p = 1000;
for(int i = 0; i< str.length(); i++) {
if(str.charAt(i) == c) {
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) == c) {
p = 0;
} else {
p++;
answer[i] = Math.min(answer[i], p);
}
}
return answer;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String str = st.nextToken();
char c = st.nextToken().charAt(0);
int[] answer = T.solution(str, c);
for(int x : answer) {
System.out.print(x + " ");
}
}
}