
-Code
class Solution {
public int compress(char[] chars) {
// 저장할 StringBuilder 생성
StringBuilder answer = new StringBuilder();
// 현재 값과 cnt 셋팅
char now = chars[0];
int cnt = 1;
// chars를 돌면서 현재 문자와 비교
for (int i = 1; i < chars.length; i++) {
if (now != chars[i]) {
현재 문자와 다르면 현재 문자 적용 후
answer.append(now);
// 1보다 크면 cnt도 같이 저장
if (cnt != 1) {
answer.append(cnt);
}
// 초기화 및 다음 문자로 변경
cnt = 0;
now = chars[i];
}
// 현재 문자와 같으면 cnt++
cnt++;
}
// 마지막 문자는 if문에 안들어가므로 다시 저장
answer.append(now);
if (cnt != 1) {
answer.append(cnt);
}
// 배열도 바뀌어야 하므로 바꿔줌
int idx = 0;
for (char ch : answer.toString().toCharArray()) {
chars[idx++] = ch;
}
// 길이는 StringBuilder의 길이 반환
return answer.length();
}
}
처음에는 문자 배열도 바뀌어야 하는줄 모르고 StringBuilder에 저장만해서 반환했으나 알고보니 배열도 바꾸어 줘야 했습니다. 그래서 해당 부분을 추가해 맞긴 했으나 2개의 포인터를 이용해 하는 방법도 있다는 말을 듣고 아래와 같이 만들어 봤습니다.
class Solution {
public int compress(char[] chars) {
int length = chars.length;
int readIdx = 0, writeIdx = 0;
while (readIdx < length) {
char nowChar = chars[readIdx];
int sameCharCnt = 0;
while(readIdx < length && chars[readIdx] == nowChar) {
readIdx++;
sameCharCnt++;
}
// 현재 보고있는 문자 쓰기 idx에 저장
chars[writeIdx++] = nowChar;
// cnt가 2이상인 경우 숫자 삽입
if (sameCharCnt >= 2) {
// 10개가 넘는 경우 나눠서 삽입해야함
char[] cntToChars = String.valueOf(sameCharCnt).toCharArray();
for (char n : cntToChars) {
chars[writeIdx++] = n;
}
}
}
return writeIdx;
}
}'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [LeetCode/Java] Container With Most Water (0) | 2026.01.01 |
|---|---|
| [프로그래머스/Java] n^2 배열 자르기 (0) | 2026.01.01 |
| [LeetCode/Java] Increasing Triplet Subsequence (0) | 2026.01.01 |
| [LeetCode/Java] Reverse Linked List (0) | 2026.01.01 |
| [백준/Java] 27487번 One and Two (0) | 2026.01.01 |