본문 바로가기
Java/Coding-Test

[Java] 1-10 가장 짧은 문자거리

by JS1111 2022. 1. 16.

문제

한 개의 문자열 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

댓글