본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 문자열 압축

https://school.programmers.co.kr/learn/courses/30/lessons/60057

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.ArrayList;
class Solution {
    public int solution(String s) {
        int min = s.length();
        String[] st = new String[s.length()/2];
        for (int i = 1; i <= s.length() / 2; i++) {
            ArrayList<String> al = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < s.length(); j++) {
                sb.append(s.charAt(j));
                if (sb.length() == i) {
                    al.add(sb.toString());
                    sb = new StringBuilder();
                } else if (j == s.length() - 1) {
                    al.add(sb.toString());
                }
            }
            int index = 1;
            ArrayList<Integer> al2 = new ArrayList<>();
            for (int j = 1; j < al.size(); j++) {
                if (al.get(j-1).equals(al.get(j))) {
                    index++;
                    al.set(j-1, "*");
                } else {
                    al2.add(index);
                    index = 1;
                }
                if (j == al.size()-1) {
                    al2.add(index);
                }
            }
            sb = new StringBuilder();
            for (int j = 0; j < al.size(); j++) {
                if (!al.get(j).equals("*")) {
                    if (al2.get(0) != 1) {
                        sb.append(al2.get(0));
                    }
                    sb.append(al.get(j));
                    al2.remove(0);
                }
            }
            min = Math.min(min, sb.length());
        }
        return min;
    }
}

문자열을 몇 개로 잘랐을 때 가장 짧은 지를 찾는 문제

먼저 최대로 자를 수 있는 절반까지 잘라서 ArrayList에 추가를 하였다.

그다음 인덱스 j와 이전 인덱스인 j-1을 비교하여 같으면 인덱스를 증가시키고

이전 인덱스 값을 *로 만들어 주었다. (이 문제에서 주어지는 String s는 소문자로만 이루어졌기 때문에 소문자가 아닌 다른 무언가로 바꿔주었다.)

그리고 이러한 작업을 하면서 이전과 같았을 때 증가시킨 값을 ArrayList에 추가를 하였다.

위의 두 작업으로 생긴 ArrayList의 값으로 조건에 맞게 문자열을 압축하여 만든 뒤, Math.min으로 최솟값을 갱신하여 답을 찾았다.

for문이 뭔가 많은데, 다른 방법으로 문제를 풀었다면 더 깔끔하였을지도 모르겠다.