본문 바로가기

문제 풀이/인프런

[JAVA11/알고리즘]1-10 가장 짧은 문자거리

문제

한 개의 문자열 s와 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램을 작성하세요.

 


입력

첫 번째 줄에 문자열 s와 문자 t가 주어진다. 문자열과 문자는 소문자로만 주어집니다.

문자열의 길이는 100을 넘지 않는다.



 


출력 

첫 번째 줄에 각 문자열 s의 각 문자가 문자 t와 떨어진 거리를 순서대로 출력한다.


예시 입력 1 

teachermode e


예시 출력 1

1 0 1 2 1 0 1 2 2 1 0



해결

문자열s와 문자t를 입력받고 각문자와 문자s의 떨어진 거리를 구하는 문제이다.

여기서 주의할 점은 거리이기 때문에 각 문자보다 늦은 순서에 있는 문자s도 신경써야한다는 점이다.

 

 int 배열을 하나 만들어주고 이 곳에 문자s와의 거리를 넣어줄 것이다.

거리를 넣는작업은 for문으로 넣어줄것이며, 총 2번 진행된다.

먼저,자신의 앞에있는 문자s와의 거리를 넣어주고 그다음은  자신의 뒤에있는 문자s와의 거리를 넣어준다.

code 에서는 p가 거리를 나타내고 있다.

 

 

자신의 앞에있는 문자 s와의 거리를 넣어준 값

 

맨 앞에 1001이라는 값이 들어가있는데 이것은 처음에 임의로 p값을 1000이라고 지정해서이다.

두번째 for문을 돌면서 없어지니 상관없다.

 

 

뒤에있는 문자s와의 거리를 넣어줄때는 원래 들어가있는 거리(자신의 앞에있는 문자s와의거리) 보다 가까울때만 넣어줘야된다!!

코드에서는 answer[i] =Math.min(answer[i],p); 를 이용해서 원래 들어가있는 값과 현재 값중 최솟값을 골라 넣어주었다.

그렇게해서 만들어진 int배열을 출력해주면 된다.

 



CODE
 



import java.util.*;

public class Main {
    public static int[] solution(String str,Character ch){
        int[] answer=new int[str.length()];
        int p=1000;
        for(int i=0; i<str.length(); i++){
            if(str.charAt(i)==ch){
                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)==ch) p = 0;
            else{
                p++;
                answer[i]=Math.min(answer[i],p);
            }
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.next();
        Character ch = in.next().charAt(0);
        for(int x: solution(str,ch)){
            System.out.print(x+" ");
        }
    }
}


 

 


결과