가장 짧은 문자 거리
한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램
■ 문제 풀이
1) 입력 설명
- 첫번째 줄에 문자열 s와 문자 t가 주어진다.
- 문자열과 문자는 소문자로만 주어진다.
- 문자열의 길이는 100을 넘지 않는다.
2) 출력 설명
- 첫 번째 줄에 각 문자열 s의 각 문자가 문자 t와 떨어진 거리를 순서대로 출력
3) 테스트
- input : teachermode e / output : 1 0 1 2 1 0 1 2 2 1 0
- input : fkdgkjdflkgjljslgjkfldjlkfdg f / output : 0 1 2 3 3 2 1 0 1 2 3 4 5 6 5 4 3 2 1 0 1 2 3 2 1 0 1 2
- input : timeout t / output : 0 1 2 3 2 1 0
4) 문제풀이
- 첫 번째 solution에서는 문자열에서 문자 t가 있는 위치를 배열에 저장 후, 이중 for문을 돌면서 거리를 구하였다.
- 두번째 solution에서는 왼쪽에서 오른쪽 방향으로 문자열에서 문자 t가 있는 위치를 배열에 저장, 오른쪽에서 왼쪽 방향으로 문자열에서 문자 t가 있는 위치를 구한 뒤, 이전에 저장된 위치 값과의 비교를 통해 더 작은 값을 배열에 저장하여 반환
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
private String solution(String input) {
String answer = "";
List<Integer> indexStore = new ArrayList<>();
String[] split = input.split(" ");
String str = split[0];
char c = split[1].charAt(0);
// 문자 c가 있는 위치를 저장
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == c) {
indexStore.add(i);
}
}
for (int i = 0; i < str.length(); i++) {
int min = Math.abs(indexStore.get(0) - i); // min 값을 초기화
for (int j = 1; j < indexStore.size(); j++) {
int cal = Math.abs(indexStore.get(j) - i);
if (min > cal) {
min = cal;
}
}
answer += min + " ";
}
return answer;
}
public static void main(String[] args) {
Main main = new Main();
Scanner in = new Scanner(System.in);
String input = in.nextLine();
System.out.println(main.solution(input));
}
}
import java.util.Scanner;
public class Main {
private int[] solution(String input, char c) {
int[] answer = new int[input.length()];
int gap = 100;
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) == c) {
gap = 0;
} else {
gap++;
}
answer[i] = gap;
}
gap = 100;
for (int i = input.length() - 1; i >= 0; i--) {
if (input.charAt(i) == c) {
gap = 0;
} else {
gap++;
answer[i] = Math.min(answer[i], gap);
}
}
return answer;
}
public static void main(String[] args) {
Main main = new Main();
Scanner in = new Scanner(System.in);
String input = in.next();
char c = in.next().charAt(0);
int[] answer = main.solution(input, c);
for (int num : answer) {
System.out.print(num + " ");
}
}
}
'CodingTest Practice' 카테고리의 다른 글
[인프런] 보이는 학생 (0) | 2022.04.11 |
---|---|
[인프런] 큰 수 출력하기 (0) | 2022.04.11 |
[인프런] 숫자만 추출 (0) | 2022.04.03 |
[인프런] 유효한 팰린드롬 (0) | 2022.04.03 |
[인프런] 회문 문자열 (0) | 2022.04.03 |