띠오니 개발자 성장일지
article thumbnail
반응형

인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.

C, C++, Python, Js 등 다른 언어의 강의도 있으니 본인에게 맞는 강의를 선택하시면 됩니다. 😁

https://inf.run/pCPH

 

자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의

자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성

www.inflearn.com

 


Q1-11. 문자열 압축

알파벳 대문자로 이루어진 문자열을 입력 받는데, 같은 문자가 연속으로 반복될 경우
반복되는 문자 바로 오른쪽에 반복 횟수를 표기해 문자열을 압축해 출력하라.
반복횟수가 1일 경우는 숫자를 생략한다.

 

입력 Sample 출력 Sample
APPLE AP2LE
HAPPYYPPAH HAP2Y2P2AH

 

 

✏️ 내가 쓴 답

앞문자가 뒷문자와 같은지 비교해서 같으면 횟수를 세는 count 변수를 1 증가해주고,

다르면 answer 문자열에 해당 문자와 숫자를 누적시켜준다는 프로세스로 진행! 근데 못풀었다. ㅎ;;

 

 

😥 애매한 점

앞문자와 뒷문자를 비교하는 건 알겠으나 문제가 됐던건, 마지막까지 반복문을 돌았을 때 였다.

마지막에 위치한 문자는 비교할 문자가 없어서, IndexOutOfBoundsException 이 발생했다.

 

👨🏻‍🏫 풀이코드

강의를 참고하여 아래와 같이 수정했다.

우선 Scanner로 부터 문자열을 입력받아 solution() 메소드로 넘겨준다.

그리고 내가 어려워했던 부분, 입력받은 문자열 맨 뒤에 공백 문자를 하나 더 추가해준다!

그래서 마지막 문자까지도 앞뒤 문자로 비교할 수 있도록 하는 것이다.

횟수를 카운트 할 cnt 변수는 1로 초기화한다. 문자는 어쨌든 최소 한개는 있는 것이니까 0보단 1로 초기화 한다.

문자열의 0번째 인덱스부터, 아까 문자열 맨뒤에 공백을 추가했기 때문에 문자 길이가 +1이 되었으므로 이를 제외한 str.length()-1 까지(원래 문자열 길이까지) 반복한다. str.length() 까지 반복하면 또 IndexOutOfBoundsException이 발생해버리니까 주의하자!

앞 문자가 뒷문자열과 같은지 비교했을 때, 다를 경우 비교 대상인 앞 문자를 answer 문자열에 누적한다.

개수가 여러개일 경우 문자열 뒤에 cnt (cnt > 1) 도 함께 누적해주고, 개수가 1일 경우에는 숫자를 생략하기 때문에 누적하지 않아도 된다.

cnt=1로 다시 초기화 해줄 것!

import java.util.Scanner;

public class Main {

    public String solution(String str){
        String answer = "";
        str = str+" ";
        int cnt = 1;

        for(int i=0; i<str.length(); 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 main = new Main();

        Scanner sc = new Scanner(System.in);
        String str = sc.next();

        System.out.println(main.solution(str));
    }
}

공백문자를 추가만 했다면, 생각보다 어렵지 않은 문제였다.

 

 

🤓 정리

  • 문자열의 각 자리를 비교할 때, 맨 앞/맨 마지막 문자가 비교하기 애매할 경우 공백을 추가해주는 것도 한 방법이다.
  • 입력된 문자열을 적절하게 수정할 수 있다는 점을 두려워 하지말자!

풀 수 있을것만 같은 문제를 풀지 못했을 때 너무 아까운 것 같다..

역시 문제를 많이 풀어봐야 하나보다!

반응형
profile

띠오니 개발자 성장일지

@띠오니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!