본문 바로가기

CodingTest Practice

[인프런] 가장 짧은 문자 거리

가장 짧은 문자 거리

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