문제
한 개의 문자열 s와 문자 t가 주어지면,
문자열 s의 각 문자가 문자 t와 떨어진 최소거리를
출력하는 프로그램을 작성하세요.
입력
첫 번째 줄에 문자열 s와 문자 t가 주어진다.
문자열과 문자는 소문자로만 주어집니다.
문자열의 길이는 100을 넘지 않는다.
출력
첫 줄에 자연수를 출력합니다.
예시 입력
teachermode e
예시 출력
1 0 1 2 1 0 1 2 2 1 0
출처
내 풀이
어려웠다
indexOf, lastIndexOf 사용
private static void shortestCharDist(String input, char ch) {
for (int i = 0; i < input.length(); i++) {
// i의 왼쪽에서 마지막으로 같은문자의 인덱스
int left = input.substring(0, i).lastIndexOf(ch);
// i포함 오른쪽에서 처음으로 같은문자의 인덱스
int right = input.indexOf(ch, i);
// 못 찾은경우 가장 먼 값
left = left == -1
? Integer.MAX_VALUE
: left;
right = right == -1
? Integer.MAX_VALUE
: right;
// left와의 차이와 right와의 차이중에서 작은값을 선택
int result = Math.min(Math.abs(i - left), Math.abs(i - right));
System.out.print(result + " ");
}
}
다른 풀이
public int[] solution(String s, char t){
int[] answer=new int[s.length()];
// 맨 앞부터 오른쪽으로 문자거리를 저장
int p=1000;
for(int i=0; i<s.length(); i++){
if(s.charAt(i)==t){
// 일치하는 문자를 만날 때마다 0으로 초기화
p=0;
answer[i]=p;
}
else{
// 일치하지 않으면 값이 1씩증가
p++;
answer[i]=p;
}
}
// 맨 마지막부터 왼쪽으로 문자거리를 저장
p=1000;
for(int i=s.length()-1; i>=0; i--){
if(s.charAt(i)==t) {
// 일치하는 문자를 만날 때마다 0으로 초기화
p=0;
}
else {
// 일치하지 않으면 값이 1씩증가
p++;
// 새로운 문자거리와 기존 문자거리중에서 작은 값을 저장
answer[i]=Math.min(answer[i], p);
}
}
return answer;
}
문자거리값: 일치하는 문자를 만날 때마다 0으로 초기화되며, 일치하지 않으면 값이 1증가
맨 앞부터 오른쪽으로 문자거리를 저장한다
맨 마지막부터 왼쪽으로 문자거리를 저장한다 (새로운 문자거리와 기존 문자거리중에서 작은 값을 저장)
기억할 점
String.substring(begin, end)
System.out.println("0123".substring(0, 3)); // 012
end파라미터는 포함하지 않고 자른다
'Java > Coding-Test' 카테고리의 다른 글
[Java] 1-12 암호 (0) | 2022.01.16 |
---|---|
[Java] 1-11 문자열 압축 (0) | 2022.01.16 |
[Java] 1-9 숫자만 추출 (0) | 2022.01.15 |
[Java] 1-8 유효한 팰린드롬 (0) | 2022.01.15 |
[Java] 1-7 회문 문자열 (0) | 2022.01.14 |
댓글