개발놀이터

1-10. 가장 짧은 문자 거리 본문

기타/코딩테스트

1-10. 가장 짧은 문자 거리

마늘냄새폴폴 2023. 2. 9. 12:15

package string.MinimumCharacterDistance110.my;

import java.util.Scanner;

public class Main {

    /**
     * -내풀이-
     * 이건 진짜 아닌거 같아서 그냥 포기합니다. 시간만 오지게 잡아먹었네요...
     *
     * -선생님 풀이-
     * 1. int 배열을 해당 문자 크기만큼 만들고
     * 2. 배열 최대 크기보다 훨씬 큰 p 를 설정한 후에
     * 3. 왼쪽에서 오른쪽으로 for 문을 돌면서 왼쪽 타겟까지의 거리를 잰다.
     * t e a c h e r m o d e -> e (만약 맨 첫글자가 타겟이 아니면 p 타겟이면 0 으로 설정한다.)
     * x 0 1 2 3 0 1 2 3 4 0 (x = p)
     * 4. 다음엔 오른쪽에서 왼쪽으로 for 문을 돌리면서 오른쪽 타겟까지의 거리를 잰다. 이때 해당 값은 최소 값을 선택한다.
     * t e a c h e r m o d e -> e
     * 1 0 1 2 1 0 1 2 2 1 0
     *
     * int p = 1000;
     * int[] answer = new int[str.length()];
     * for (int i = 0 ; i < s.length() ; i++) {
     *     if (str.charAt(i) == t) {
     *         p = 0;
     *         answer[i] = p;
     *     }
     *     else {
     *         p++;
     *         answer[i] = p;
     *     }
     * }
     * p = 1000     // p 를 다시 초기화 해줘야한다. (중요!)
     * for (int i = s.length() - 1 ; i >= 0 ; i--) {
     *     if (str.charAt(i) == t) {
     *         p = 0;
     *     }
     *     else {
     *         answer[i] = Math.min(answer[i], p);  // Math 클래스의 min, max 알아두자자     *     }
     * }
     */

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        String s = kb.next();
        String t = kb.next();
        System.out.println(solution(s, t));
    }

    private static String solution(String s, String t) {
        s = s.toLowerCase();
        t = t.toLowerCase();
        String tmp = t + s + t;
        String stack = "";

        String[] split = tmp.split(t);  // ex) study t -> tstudyt -> "", "s", "udy", ""

        for (int i = 0 ; i < split.length ; i++) {
            if (i == 0) {
                int check = split[i].length();
                for (int j = 0; j < split[i].length(); j++) {
                    stack += check;
                    stack += " ";
                    check--;
                }
                stack += "0 ";
            }
            else if (i == split.length - 1) {
                int check = 0;
                for (int j = 0; j < split[i].length(); j++) {
                    check++;
                    stack += check;
                    stack += " ";
                }
            }
            else if (split[i].length() % 2 == 0) {
                int check = 0;
                for (int j = 0; j < split[i].length() / 2; j++) {
                    check++;
                    stack += check;
                    stack += " ";
                }
                stack += check;
                stack += " ";
                for (int j = 0; j < split[i].length() / 2; j++) {
                    check--;
                    stack += check;
                    stack += " ";
                }
            }
            else {
                int check = 0;
                for (int j = 0; j < split[i].length() / 2; j++) {
                    check++;
                    stack += check;
                    stack += " ";
                }
                check++;
                stack += check;
                stack += " ";
                for (int j = 0; j < split[i].length() / 2; j++) {
                    check--;
                    stack += check;
                    stack += " ";
                }
                stack += "0 ";
            }
        }

        return stack;
    }
}

 

package string.MinimumCharacterDistance110.teacher;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        String str = kb.next();
        char c = kb.next().charAt(0);

        for (int x : solution(str, c)) {
            System.out.print(x + " ");
        }
    }

    private static 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) {
                p = 0;
                answer[i] = p;
            }
            else {
                p++;
                answer[i] = p;
            }
        }

        p = 1000;

        for (int i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) == t) p = 0;
            else {
                p++;
                answer[i] = Math.min(answer[i], p);
            }
        }

        return answer;
    }
}

'기타 > 코딩테스트' 카테고리의 다른 글

1-12. 2진 암호  (0) 2023.02.09
1-11. 문자열 압축  (0) 2023.02.09
1-9. 숫자만 추출  (0) 2023.02.09
1-8. 유효한 회문 문자열  (0) 2023.02.09
1-7. 회문 문자열  (0) 2023.02.09