1. 문제
한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램을 작성
첫 번째 줄에 문자열 s와 문자 t가 주어진다. 문자열과 문자는 소문자로만 주어집니다.
문자열의 길이는 100을 넘지 않는다.
2. 예시
teachermode e
=> 1 0 1 2 1 0 1 2 2 1 0
3. 코드
import java.util.Scanner;
/**
* teachermode e -> 10121012210
* 문자열의 길이는 100을 넘지 않는다.
*/
public class Case10 {
public int[] solution(String str, char cha) {
int[] ans = new int[str.length()];
int p = 101;
// 왼쪽에서 오른쪽방향으로 갈때
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == cha) { // (0)t == e => 같지않음
// (1)e == e => 같음
// (2)a == e => 같지않음
// (3)c == e => 같지않음
//
p = i;
// 101 = 0
ans[i] = 0;
} else { // (0) t != e => 같지않음
// (1)
// (2) a != e => 0-2 => -1 -> 1 p-->1
// (3) c != e => 1-3 => -2 -> 2 p-->2
ans[i] = Math.abs(p - i);
// 101-0 -> 101
// p++;
// ans[i]=p;
// System.out.print(str.charAt(i));
}
}
// 101 0 1 2 3 0 1 2 3 4 0
// teachermode
// 오른쪽에서 왼쪽방향으로 갈 경우, 문자열길이부터 출발
for (int i = str.length() - 1; i >= 0; i--) {
if (str.charAt(i) == cha) {// (10) e == e
// (9) d != e
// (8) o != e
// (5) e = e
// (4) h != e
// (1) e = e
p = i; // (10) 101 = 10
// (5) 10 = 5
// (1) 5 = 1
ans[i] = 0; // (10) ans[10] =0
// (5) ans[5] = 0
// (1) ans[1] = 0
} else { //(9) d != e
//(8) o != e
//(4) h != e
//(3) C != e
//(2) a != e
if (ans[i] > Math.abs(p - i)) {
ans[i] = Math.abs(p - i);
//ans[9] > 10-9 => 4 > 1 (o) => ans[9] = 1
//ans[8] > 10-8 => 3 > 2 (o) => ans[8] = 2
//ans[4] > 5-4 => 3 > 1 (o) => ans[4] = 1
//ans[3] > 5-3 => 2 > 2 (x) => false ans[3] = 2
//ans[2] > 5-2 => 1 > 3 (x) => false ans [2] = 1
//ans[0] > 1-0 => 101 > 1 (o) => ans[0] = 1
}
}
}
return ans;
}
public static void main(String[] args) {
Case10 case10 = new Case10();
Scanner in = new Scanner(System.in);
String str = in.next();
char target = in.next().charAt(0);
for(int x:case10.solution(str, target)){
System.out.print(x+" ");
}
}
}
4. 마무리
'알고리즘(Algorithm)' 카테고리의 다른 글
[Algorithm] 문자열 압축 (0) | 2023.07.25 |
---|---|
[Algorithm] 숫자만 추출 (0) | 2023.07.19 |
[Algorithm] 팰린드롬 (0) | 2023.05.30 |
[Algorithm] 회문 문자열 (0) | 2023.04.03 |
[Algorithm] 중복문자제거 (0) | 2023.03.24 |