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문이 뭔가 많은데, 다른 방법으로 문제를 풀었다면 더 깔끔하였을지도 모르겠다.
'Programmers' 카테고리의 다른 글
[프로그래머스][JAVA]Lv. 2 - 괄호 변환 (0) | 2023.09.25 |
---|---|
[프로그래머스][JAVA]Lv. 3 - 정수 삼각형 (0) | 2023.07.31 |
[프로그래머스][JAVA]Lv. 2 - 방문 길이 (0) | 2023.07.17 |
[프로그래머스][JAVA]Lv. 2 - 스킬트리 (0) | 2023.07.17 |
[프로그래머스][JAVA]Lv. 2 - 타겟 넘버 (0) | 2023.07.09 |