SKSDUD

[일일코딩][Java] 연속 구간을 반복한 수와 문자로 조합하기 본문

프로그래밍/일일코딩

[일일코딩][Java] 연속 구간을 반복한 수와 문자로 조합하기

NYinJP 2023. 2. 6. 20:54

0️⃣ 문제

문자열을 입력받아 연속되는 문자가 있을 경우, 연속 구간을 반복되는 수와 문자로 조합한 형태로 압축한

문자열을 리턴해야 합니다.

String 타입의 문자열이 인자로 들어오고

String 타입의 문자열을 리턴합니다.

 

빈 문자열을 입력받으면 빈 문자열을 리턴하고

3개 이상 연속되는 문자만 압축합니다.

 

1️⃣  코드

ArrayList <String> strList= new ArrayList<>();
        int count=0;
        for(int i=1;i<str.length();i++){
            if(str.charAt(i-1)==str.charAt(i)) { //연속된 두 값이 같다면 wwwa
                count++;
                if(i==str.length()-1){ //혹시 마지막 인덱스라면
                    if(count>=2){ //이전에 계산했던 count가 2 이상이라면 (세번 연속)
                        strList.add((count+1)+"");
                        strList.add(str.charAt(i-1)+"");
                        count=0;
                    } else if (count == 1) { //이전에 계산했던 count가 1이라면 : 두번 연속
                        strList.add(str.charAt(i-1)+"");
                        strList.add(str.charAt(i-1)+"");
                        count=0;
                    } else if(count==0){
                        strList.add(str.charAt(i-1)+"");
                        count=0;
                    }

                }
            }else if(str.charAt(i-1) != str.charAt(i)){ // 연속된 두 값이 다르다면
                if(i==str.length()-1){ //마지막 인덱스이고 두 값이 다르다면
                    strList.add(str.charAt(i-1)+"");
                    strList.add(str.charAt(i)+"");

                }else{
                    if(count>=2){ //이전에 계산했던 count가 2 이상이라면 (세번 연속)
                        strList.add((count+1)+"");
                        strList.add(str.charAt(i-1)+"");
                        count=0;
                    } else if (count == 1) { //이전에 계산했던 count가 1이라면 : 두번 연속
                        strList.add(str.charAt(i-1)+"");
                        strList.add(str.charAt(i-1)+"");
                        count=0;
                    } else if(count==0){
                        strList.add(str.charAt(i-1)+"");
                        count=0;
                    }
                }
            }
        }
        // 반복문을 다 돌고나서 결과 리턴
        String result=String.join("",strList);
        return result;

정말 바보같이 풀었다! 

수도 코드

값 추가 삭제에 용이하도록 ArrayList 선언
반복되는 수를 체크할 count 변수 생성

문자열의 각 값에 하나씩 접근하면서
if(연속된 두 값이 같다면)
count++;
 if(마지막 인덱스라면)
    if(값이 같다면)

else if(연속된 두 값이 다르다면)
  if(마지막 인덱스라면)
  else if(마지막 인덱스가 아니라면)
    if(수가 세번 이상 연속된다면)
    else if(수가 두번만 연속된다면)
    else if (수가 연속되지 않는다면)

for문을 빠져나와 
결과를 반환합니다.

 

2️⃣ 필요한 문법

배열의 값을 문자열로 합치기

위의 메서드를 사용하면 문자열 배열 내의 복수개의 요소들을 이어붙일 수 있다. 

(구분자, 배열명) 이 인자로 들어간다. 

 

join("추가할 문자", "대상 list")
join("추가할 문자", "대상 Array")

어렵지 않다.

 

3️⃣ 좋은 코드

public class Main {
    public static void main(String[] args) {
        String str="wwwdddfdfdsssassaaasdggvff";
        if(str.length() == 0) System.out.println("");
        // 연속되는 문자를 기록하기 위한 변수를 선언하고
        // 첫 번째 문자로 초기화합니다.
        char before = str.charAt(0);
        // 동일한 문자의 반복 횟수를 저장할 변수를 선언, 초기값은 1로 할당합니다.
        int count = 1;
        // 정답으로 리턴할 문자열을 선언합니다. 초기값은 공백으로 할당합니다.
        String result = "";

        // 마지막 부분이 연속된 문자일 경우를 위해 dummy 문자 추가합니다.
        str = str + ' ';
        for (int i = 1; i < str.length(); i++) {
            // 동일한 문자가 반복될 경우
            if (before == str.charAt(i)) {
                //count를 1씩 더해줍니다.
                count++;
            } else {
                // 이전과 다른 문자일 경우,
                // 반복된 횟수가 3 이상일 경우에만 문자열을 압축합니다.
                if (count >= 3) {
                    result = result + count + before;
                } else {
                    //count의 수만큼 결과에 문자열을 저장합니다.
                    for(int j = 0; j < count; j++) {
                        result = result + before;
                    }
                }
                before = str.charAt(i);
                count = 1;
            }
        }
        System.out.println(result);
    }
}

 

4️⃣ 배울 점

  • 더미 변수를 추가해줘서 마지막 값이 반복될 때도 잘 처리해 주기
  • 반복문 조건문을 항상 깔끔하게 분기할 수 있도록
  • 생각생각생각!

거북왕이 되겠어!