알고리즘

[문자열] 문자열 압축 & 암호(replace(), parseInt(string,2))

날아 2023. 3. 23. 16:33

Q. 알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하시오.

단, 반복횟수가 1인 경우 생략한다. 

Class Main {
	public int solution(String str){
    	String answer = "";
        str = str+" ";
        int cnt = 1;
        
        for(int i=0; i<str.length()-1; i++){
        	if(str.charAt(i)==str.charAt(i+1){
            	cnt++;
            } else {
            	answer += str.charAt(i);
                if(cnt>1) {
                	answer += String.valueOf(cnt);
                    cnt = 1;
                }
            }
        }    
        return answer;
    }
    
    public static void main(String[] args){
    	Main T = new Main(); 
        Scanner kb = new Scanner(System.in);
        String str = kb.next();
        
        System.out.print(T.solution(str));
    }
}

 

  • str = str + " "; : 로직이 i 와 i+1을 비교하기 때문에 마지막에 빈 문자열을 하나 허수로 만들어줘야한다.
  • for(int i=0; i<s.length()-1; i++) : 빈 문자열을 하나 허수로 만들어줬기때문에 s.length()-1만큼 반복문을 돌아야한다. 
  • answer += String.valueOf(cnt); : int 타입인 cnt를 String타입으로 변환하기 위해서 사용한 메서드 

 


 

Q. 암호문제

비밀편지는 알파벳 한 문자마다 # 또는 *이 7개로 구성되어 있다.

1. 일곱자리 이진수로 바꾼다. #는 이진수의 1로, *는 이진수의 0으로 바꾼다.

2. 바꾼 2진수를 10진수화 한다.

3. 아스키번호로 문자를 변환한다.

 

Class Main {
	public int solution(int n, String s){
    	String answer = "";
        
        for(int i=0, i<n; i++){
        	String tmp = s.substring(0,7).replace('#','1').replace('*','0');
            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.print(T.solution(n, str));
    }
}

 

  • Integer.parseInt(tmp,2) : 2진수를 10진수로 바꾸어준다.