Post

String_가장 짧은 문자 거리 구하기

✅ 한 개의 문자열 s와 문자 t가 주어졌을 때 문자열 s의 각 문자가 문자 t와 떨어진 최소거리를 출력하는 프로그램

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Main {
    public int[] solution(String s, char t) {
        int len = s.length();
        int[] answer = new int[len];
        int p = 1000; //큰 숫자 한개

        for (int i = 0; i < len; i++) {
            if (s.charAt(i) == t) {
                p = 0; //t찾았으니 0으로 바꾸고
            }
            answer[i] = p;
            p++; //0에서 1씩 늘려서 t에서부터 거리 구하기
        }
        p=1000; //p 다시 초기화
        for (int j = len - 1; j >= 0; j--) {
            if (s.charAt(j) == t) {
                p = 0;
            }
            if(answer[j] > p){
                answer[j] = p;
            }
            p++;
        }
        return answer;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc= new Scanner(System.in);
        String s= sc.next();
        char t = sc.next().charAt(0);
        for(int x: T.solution(s, t)){
            System.out.print(x+" ");
        }

    }

}
//⭐️input:
// teachermode e
//⭐️output:
//1 0 1 2 1 0 1 2 2 1 0
  1. 먼저 왼쪽에서 오른쪽으로 for문을 돈다.
  2. 먼저 t가 나오는 index를 찾는다
  3. 그 다름 p를 아주 큰 수로 지정해두고(String길이가 100은 넘지 않는다고 하였으니 1000으로 둠)
  4. t가 나오는 index를 찾으면 p를 0으로 만든다.
  5. 그리고 지금은 왼쪽에 있는 t를 기준으로 p로부터 길이를 구할 것이기 때문에
  6. p값을 하나씩 늘려가면서 p++
  7. p로부터의 길이를 구해 array안에 값을 대체시킨다.
  8. 다음은 오른쪽에서 왼쪽으로 for문을 돌면서 똑같이 t로부터 거리를 구한다.
  9. 만약 오른쪽에서 구한 거리가 왼쪽에서 구한 거리보다 작다면 값을 바꾼다.
  10. 숫자를 한 줄로 출력하기 위해서는 System.out.print를 사용한다.

코딩공책-24 2

🟢 더 작은 수를 구하는 Math.min

1
2
3
4
5
6
7
        for (int j = len - 1; j >= 0; j--) {
            if (s.charAt(j) == t) {
                p = 0;
            }
            answer[j] = Math.min(answer[j], p);
            p++;
        }

🟢 내가 짠 코드(for문이 3개나 있음)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Main {
    public int[] solution(String s, char t){
        int len= s.length();
        int[] ltArr= new int[len];
        int[] rtArr= new int[len];
        int p=1000;

        for(int i=0; i<len; i++){
            if(s.charAt(i)== t){
                p=0;
            }
            ltArr[i] = p;
            p++;
        }
        for(int j=len-1; j>=0; j--){
            if(s.charAt(j) == t){
                p=0;
            }
            rtArr[j] = p;
            p++;
        }
        for(int l=0; l<len; l++){
            if(ltArr[l] > rtArr[l]){
                ltArr[l] = rtArr[l];
            } else{
                rtArr[l] =  ltArr[l];
            }
        }

        return ltArr;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc= new Scanner(System.in);
        String s= sc.next();
        char t = sc.next().charAt(0);
        for(int x: T.solution(s, t)){
            System.out.print(x+" ");
        }

    }

}

🔵 ThingsILearned

✔️ output이 1 0 1 2 1 0 1 2 2 1 0 이런식으로 배열도 아니고 list도 아니고 숫자의 나열로 출력하는 방법

for문을 돌면서 출력한다!

✔️ for문을 거꾸로 돌면서 더 작은 값 확인해보기

✔️더 작은 값을 구할때는 Math.min()

This post is licensed under CC BY 4.0 by the author.