CS 기초/알고리즘 · 문제풀이

[JAVA] 문자열(String) - 가장 짧은 문자거리 / 문자열 압축 / 암호

sofiaaa 2022. 2. 26. 15:02
반응형

 가장 짧은 문자거리

 

내 코드(오답) - 상

정답 코드

전혀 풀지 못했다.

왼쪽에서부터의 거리와 오른쪽에서부터의 거리를 비교해서 풀어야 한다. 

import java.util.*;

public class Main {
    public int[] solution(String s, char t){
        int[] answer = new int[s.length()];

        // 왼쪽에서부터의 거리
        int p = 1000; // 거리 임의로 크게 잡기,
        for(int i = 0; i < s.length(); i++){
            // 왼쪽으로 부터 거리가 같으면 0
            if(s.charAt(i) == t){
                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) p = 0;
            else {
                p++;
                // 기존 값과 p 중에 작은 값으로 넣기, 
                answer[i] = Math.min(answer[i], p); 
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        String str = kb.next();
        // ** 문자 입력
        char c = kb.next().charAt(0);
        for(int x : T.solution(str, c)){
            System.out.print(x + " ");
        }
    }
}

 

 

 문자열 압축

 

내 코드(정답) - 너무 오래 걸렸다

 

import java.util.*;

public class Main {
    public String solution(String s){
        String answer = "";

        for(int i = 0; i < s.length(); i++){
            int index = 0;

            if(i == 0 || s.charAt(i) != s.charAt(i -1)){
                for(int j = i; j < s.length(); j++){
                    if(s.charAt(i) == s.charAt(j)){
                        index = index + 1;
                    } else {
                        break;
                    }
                }
                answer += s.charAt(i);
                if(index != 1){
                    answer += index;
                }
            }
        }
        return answer;
    }

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

 

 

 

 암호

 

내 코드 (오답) - 하

비교적 쉬운 문제였지만

아스키 번호를 문자로 변환하는 것에서 고민하였다.

 

정답 코드

import java.util.*;

public class Main {
    public String solution(int n, String s){
        String answer = "";
        for(int i = 0; i < n; i++){
            String tmp = s.substring(0, 7)
                    .replace('#','1')
                    .replace('*','0');

            // 2진수 --> 10진수
            int num = Integer.parseInt(tmp, 2);
            // 아스키 번호 --> 문자화
            answer += (char) num;
            s = s.substring(7);
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        String str = kb.next();
        System.out.println(T.solution(n ,str));
    }
}
반응형