https://school.programmers.co.kr/learn/courses/30/lessons/60057
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๋ฌธ์
๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ๋ฌธ๊ฐ๊ฐ ๋๊ณ ์ถ์ "์ดํผ์น"๋ ๋ฌธ์์ด์ ์์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถ๋ฅผ ํ๊ณ ์์ต๋๋ค. ์ต๊ทผ์ ๋๋์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฐ๋จํ ๋น์์ค ์์ถ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถ๋ฅผ ํ๊ณ ์๋๋ฐ, ๋ฌธ์์ด์์ ๊ฐ์ ๊ฐ์ด ์ฐ์ํด์ ๋ํ๋๋ ๊ฒ์ ๊ทธ ๋ฌธ์์ ๊ฐ์์ ๋ฐ๋ณต๋๋ ๊ฐ์ผ๋ก ํํํ์ฌ ๋ ์งง์ ๋ฌธ์์ด๋ก ์ค์ฌ์ ํํํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ๊ณ ์์ต๋๋ค.
๊ฐ๋จํ ์๋ก "aabbaccc"์ ๊ฒฝ์ฐ "2a2ba3c"(๋ฌธ์๊ฐ ๋ฐ๋ณต๋์ง ์์ ํ๋ฒ๋ง ๋ํ๋ ๊ฒฝ์ฐ 1์ ์๋ตํจ)์ ๊ฐ์ด ํํํ ์ ์๋๋ฐ, ์ด๋ฌํ ๋ฐฉ์์ ๋ฐ๋ณต๋๋ ๋ฌธ์๊ฐ ์ ์ ๊ฒฝ์ฐ ์์ถ๋ฅ ์ด ๋ฎ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, "abcabcdede"์ ๊ฐ์ ๋ฌธ์์ด์ ์ ํ ์์ถ๋์ง ์์ต๋๋ค. "์ดํผ์น"๋ ์ด๋ฌํ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฌธ์์ด์ 1๊ฐ ์ด์์ ๋จ์๋ก ์๋ผ์ ์์ถํ์ฌ ๋ ์งง์ ๋ฌธ์์ด๋ก ํํํ ์ ์๋์ง ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ ค๊ณ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, "ababcdcdababcdcd"์ ๊ฒฝ์ฐ ๋ฌธ์๋ฅผ 1๊ฐ ๋จ์๋ก ์๋ฅด๋ฉด ์ ํ ์์ถ๋์ง ์์ง๋ง, 2๊ฐ ๋จ์๋ก ์๋ผ์ ์์ถํ๋ค๋ฉด "2ab2cd2ab2cd"๋ก ํํํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก 8๊ฐ ๋จ์๋ก ์๋ผ์ ์์ถํ๋ค๋ฉด "2ababcdcd"๋ก ํํํ ์ ์์ผ๋ฉฐ, ์ด๋๊ฐ ๊ฐ์ฅ ์งง๊ฒ ์์ถํ์ฌ ํํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ค๋ฅธ ์๋ก, "abcabcdede"์ ๊ฐ์ ๊ฒฝ์ฐ, ๋ฌธ์๋ฅผ 2๊ฐ ๋จ์๋ก ์๋ผ์ ์์ถํ๋ฉด "abcabc2de"๊ฐ ๋์ง๋ง, 3๊ฐ ๋จ์๋ก ์๋ฅธ๋ค๋ฉด "2abcdede"๊ฐ ๋์ด 3๊ฐ ๋จ์๊ฐ ๊ฐ์ฅ ์งง์ ์์ถ ๋ฐฉ๋ฒ์ด ๋ฉ๋๋ค. ์ด๋ 3๊ฐ ๋จ์๋ก ์๋ฅด๊ณ ๋ง์ง๋ง์ ๋จ๋ ๋ฌธ์์ด์ ๊ทธ๋๋ก ๋ถ์ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.
์์ถํ ๋ฌธ์์ด s๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์์ ์ค๋ช ํ ๋ฐฉ๋ฒ์ผ๋ก 1๊ฐ ์ด์ ๋จ์๋ก ๋ฌธ์์ด์ ์๋ผ ์์ถํ์ฌ ํํํ ๋ฌธ์์ด ์ค ๊ฐ์ฅ ์งง์ ๊ฒ์ ๊ธธ์ด๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- s์ ๊ธธ์ด๋ 1 ์ด์ 1,000 ์ดํ์ ๋๋ค.
- s๋ ์ํ๋ฒณ ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
ํ์ด
ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํด์, 1๋ถํฐ ๋ฌธ์์ด์ ๊ธธ์ด( s.length() )๊น์ง ๋ชจ๋ ๊ธธ์ด์ ๋ํด์ ๋ฌธ์์ด์ ์๋ฅด๊ณ ์์ถํ์ต๋๋ค.
String solve(int n){ // n ๊ธธ์ด๋ก ์๋ผ์ ์์ถ
StringBuilder sb = new StringBuilder();
int start = 0;
for(start = 0; start <= s.length() - n; start+=n){
String prevSt = s.substring(start, start + n);
int nextIdx = start + n;
int cnt = 1;
while(nextIdx < s.length() && nextIdx + n <= s.length() && prevSt.equals(s.substring(nextIdx, nextIdx + n))){
nextIdx += n;
cnt += 1;
}
if(cnt > 1){ // ๋ฌธ์์ด์ด ์ผ์น
sb.append(cnt).append(prevSt);
}else{
sb.append(prevSt);
}
if(nextIdx + n > s.length()){
while(nextIdx < s.length()){
sb.append(s.charAt(nextIdx++));
}
break;
}
start = nextIdx - n;
}
return sb.toString();
}
์๋ฅด๊ณ ์ ํ๋ ๋ฌธ์์ด์ ๊ธธ์ด n์ด 2์ด๊ณ , ๋ฌธ์์ด s = " aabbaccc " ์ธ ๊ฒฝ์ฐ
ํฌํฌ์ธํฐ๋ฅผ ํ์ฉํ์ฌ ์ด์ ๋ฌธ์์ด(prevSt) ์ด ๋ค์ ๋ฌธ์์ด(nextSt)๊ณผ ๊ฐ์์ง ๋น๊ตํ๊ณ ๊ฐฏ์(cnt)๋ฅผ ์นด์ดํ ํฉ๋๋ค.
์๋ ์ฝ๋์์ ์์ ์ธ๋ฑ์ค(start)๋ ์๋ฅด๊ณ ์ ํ๋ ๋ฌธ์์ด์ ๊ธธ์ด(n) ์ ๋์ด๊ฐ์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ์ `start <= s.length() - n` ์ผ๋ก ๋ฐ๋ณต๋ฌธ ์กฐ๊ฑด์ ์คฌ์ต๋๋ค.
ํฌ ํฌ์ธํฐ ์กฐ๊ฑด์ผ๋ก๋๋ค์ ์์ ์ธ๋ฑ์ค(nextIdx)์ ์๋ผ์ผ ํ๋ ์ธ๋ฑ์ค ์์น(nextIdx + n)์ ๋ํด์ IndexOutOfBoundException์ ๋ง๊ธฐ ์ํด์.
nextIdx < s.length() && nextIdx + n <= s.length() ์กฐ๊ฑด์ ์คฌ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฅธ ๋ฌธ์์ด์ด ์ด์ ๋ฌธ์์ด๊ณผ ๊ฐ์์ง ๋น๊ตํ๊ธฐ ์ํด ์๋ ์กฐ๊ฑด์ ์คฌ์ต๋๋ค
prevSt.equals(s.substring(nextIdx, nextIdx + n));
๋ฌธ์์ด์ด ์ผ์นํ๋ค๋ฉด ๋ค์ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ํด์ n๋งํผ ์ฆ๊ฐ์ํต๋๋ค.
→ nextIdx += n;
๊ทธ๋ฆฌ๊ณ ์ผ์นํ ๊ฐฏ์๋ฅผ ์นด์ดํ ํฉ๋๋ค.
→ cnt += 1;
๊ทธ๋ฆฌ๊ณ while ๋ฐ๋ณต๋ฌธ์ ๋์์ ๋ ๊ฒฝ์ฐ๋ ๋ ๊ฐ์ง ์ ๋๋ค.
1. ์์ถ์ด ๋ฐ์ํ ๊ฒฝ์ฐ
cnt ๊ฐ 1 ๋ณด๋ค ํฐ ๊ฒฝ์ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์ ๋๋ค.
2. ์์ถ์ด ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ
cnt๊ฐ 1 ๋ณด๋ค ํฌ์ง ์๋ค๋ฉด ์์ถ์ด ๋ฐ์ํ์ง ์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋์ ์ํฉ์ ๋ ํ์ธํด์ผ ํฉ๋๋ค.
๋ฐ๋ก nextIdx ํน์ nextIdx + n ์ด ๋ฌธ์์ด์ Index๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ ์ ๋๋ค.
์ด ๊ฒฝ์ฐ์๋ ๋ฌธ์์ด์ ์๋ฅผ ์ ์๋ ๋์ ๋๋ฌํ ๊ฒฝ์ฐ์ด๊ณ , ๋จ์ ๋ฌธ์์ด์ ์๋ณธ ๊ทธ๋๋ก ๋ถ์ฌ์ค ๋ค์ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํด์ค์ผ ํฉ๋๋ค.
if(nextIdx + n > s.length()){
while(nextIdx < s.length()){
sb.append(s.charAt(nextIdx++));
}
break;
}
์ถ๊ฐ๋ก!
ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํ ๋, for๋ฌธ์ ๋ง์ง๋ง ๋ถ๋ถ์ start = nextIdx - n ; ์ ํด์ค์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ ํ์ง ์๊ณ start = nextIdx; ์ด๋ ๊ฒ ํด์ฃผ๋ฉด, ๋ค์ for๋ฌธ์์ n๋งํผ ๋ํด์ง๊ธฐ ๋๋ฌธ์
start ~ nextIdx ~ nextIdx + n
์์ start ~ nextIdx๋ฅผ ํ์ํ์ง ๋ชปํ๊ณ , nextIdx ~ nextIdx + n ๋ถํฐ ํ์์ ํ๊ฒ ๋ผ์ ๋น ํธ๋ฆฌ๊ฒ ๋๋ ๋ถ๋ถ์ด ์๊ธฐ๊ฒ ๋ฉ๋๋ค.
์๊ฒ๋ ์
java์์ ๋ฌธ์์ด ์๋ฅด๋ ํจ์๊ฐ subString์ด ์๋๋ผ substring์ด๋ผ๋ ์ ..!
๊ทธ๋ฆฌ๊ณ ํฌ ํฌ์ธํฐ์์ IndexOutOfBound ๋ก while ๋ฐ๋ณต๋ฌธ์ด ์ข ๋ฃ๋ ๊ฒฝ์ฐ์ ๋ํด์ if๋ฌธ์ผ๋ก ํ์ธ์ ํด์ค์ผ ํ๋ค๋ ์ !์ ์๊ฒ ๋์ต๋๋ค.
์ค๋๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋,, ๊ธฐ์ต์ด ์๋ก์๋ก.. ์ด์ฌํ ๋ค์ ํด์ผ๊ฒ ๋ค..!
์ฝ๋
import java.util.*;
class Solution{
int answer;
String s;
String solve(int n){ // n ๊ธธ์ด๋ก ์๋ผ์ ์์ถ
StringBuilder sb = new StringBuilder();
int start = 0;
for(start = 0; start <= s.length() - n; start+=n){
String prevSt = s.substring(start, start + n);
int nextIdx = start + n;
int cnt = 1;
while(nextIdx < s.length() && nextIdx + n <= s.length() && prevSt.equals(s.substring(nextIdx, nextIdx + n))){
nextIdx += n;
cnt += 1;
}
if(cnt > 1){ // ๋ฌธ์์ด์ด ์ผ์น
sb.append(cnt).append(prevSt);
}else{
sb.append(prevSt);
}
if(nextIdx + n > s.length()){
while(nextIdx < s.length()){
sb.append(s.charAt(nextIdx++));
}
break;
}
start = nextIdx - n;
}
return sb.toString();
}
public int solution(String s) {
answer = (int)1e9;
this.s = s;
for(int i=1;i<=s.length();i++){
// i ๊ธธ์ด๋ก ์๋ฅด๊ธฐ
answer = Math.min(answer, solve(i).length());
}
return answer;
}
}'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| JAVA์์ String์ ํ์ ์ํค๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ (2) | 2025.05.07 |
|---|---|
| 10์ง์๋ฅผ n์ง๋ฒ์ผ๋ก ๋ฐ๊พธ๋ ํจ์ (0) | 2025.05.07 |
| [PCCP ๋ชจ์๊ณ ์ฌ #2] 3๋ฒ - ์นดํ ํ์ฅ (1) | 2024.12.18 |
| [PCCP ๋ชจ์๊ณ ์ฌ #1] 4๋ฒ - ์ด์์ฒด์ (0) | 2024.12.12 |
| PCCP ๋ชจ์๊ณ ์ฌ1ํ 3๋ฒ (0) | 2024.12.11 |