์•Œ๊ณ ๋ฆฌ์ฆ˜/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ Progammers ] ๋ฌธ์ž์—ด ์••์ถ• ( ์ž๋ฐ” / JAVA )

KIMHYEYUN 2022. 8. 31. 19:40
๋ฐ˜์‘ํ˜•

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

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๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

s result
"aabbaccc" 7
"ababcdcdababcdcd" 9
"abcabcdede" 8
"abcabcabcabcdededededede" 14
"xababcdcdababcdcd" 17

์ž…์ถœ๋ ฅ ์˜ˆ์— ๋Œ€ํ•œ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1
๋ฌธ์ž์—ด์„ 1๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ ์••์ถ•ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.
์ž…์ถœ๋ ฅ ์˜ˆ #2
๋ฌธ์ž์—ด์„ 8๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ ์••์ถ•ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.
์ž…์ถœ๋ ฅ ์˜ˆ #3
๋ฌธ์ž์—ด์„ 3๊ฐœ ๋‹จ์œ„๋กœ ์ž˜๋ผ ์••์ถ•ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.
์ž…์ถœ๋ ฅ ์˜ˆ #4
๋ฌธ์ž์—ด์„ 2๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋ฉด "abcabcabcabc6de" ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด์„ 3๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋ฉด "4abcdededededede" ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด์„ 4๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋ฉด "abcabcabcabc3dede" ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด์„ 6๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅผ ๊ฒฝ์šฐ "2abcabc2dedede"๊ฐ€ ๋˜๋ฉฐ, ์ด๋•Œ์˜ ๊ธธ์ด๊ฐ€ 14๋กœ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.
์ž…์ถœ๋ ฅ ์˜ˆ #5
๋ฌธ์ž์—ด์€ ์ œ์ผ ์•ž๋ถ€ํ„ฐ ์ •ํ•ด์ง„ ๊ธธ์ด๋งŒํผ ์ž˜๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ x / ababcdcd / ababcdcd ๋กœ ์ž๋ฅด๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ฌธ์ž์—ด์„ ์ž˜๋ผ๋„ ์••์ถ•๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ์งง์€ ๊ธธ์ด๋Š” 17์ด ๋ฉ๋‹ˆ๋‹ค.


ํ’€์ด

๋จผ์ € ์ •๋‹ต์ด ๋  ๋ณ€์ˆ˜ answer์— ์ตœ๋Œ€๊ฐ’ (๊ทธ๋Œ€๋กœ์˜ ๊ธธ์ด)๋ฅผ ์„ค์ •
i๊ฐœ ๋‹จ์œ„๋กœ ๋ฌธ์ž๋ฅผ ์ž˜๋ž์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋ฐ˜๋ณต
โœ… i <= s.length()/2

for(int i = 1; i <= s.length()/2; i++){
    String target = s.substring(0,i);
    String cur = "";
    int cnt = 1;
    StringBuilder sb = new StringBuilder();

i๊ฐœ ๋‹จ์œ„๋กœ ์••์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ํ•œ๋ฒˆ for ๋ฌธ ์‚ฌ์šฉ
→ ํ˜„์žฌ ๋ฌธ์ž์—ด๊ณผ ํƒ€๊ฒŸ ๋ฌธ์ž์—ด์ด ๊ฐ™์œผ๋ฉด ์นด์šดํŠธ += 1
→ ๋‹ค๋ฅด๋ฉด ํƒ€๊ฒŸ ๋ฌธ์ž์—ด์„ sb์— ์ถ”๊ฐ€ํ•˜๊ณ  ํ˜„์žฌ ๋ฌธ์ž์—ด์„ ํƒ€๊ฒŸ ๋ฌธ์ž์—ด๋กœ ์žฌ์„ค์ •
โœ… ์ด๋•Œ ์••์ถ• ์นด์šดํŠธ๊ฐ€ 2์ด์ƒ์ด๋ฉด ํ•จ๊ป˜ ์ถ”๊ฐ€

for(int start = i; start <= s.length(); start += i){
    if(start + i >= s.length()) cur = s.substring(start);
    else cur = s.substring(start, start + i);

      if(cur.equals(target)) cnt+=1;
       else if(cnt == 1){
        sb.append(target);
        target = cur;
    }else{
        sb.append(cnt).append(target);
        target = cur;
        cnt = 1;
    }
}

์ฝ”๋“œ

public class L2_๋ฌธ์ž์—ด_์••์ถ• {
    public static int solution(String s) {
        int answer = s.length();
        for (int i = 1; i <= s.length() / 2; i++) {
            String target = s.substring(0, i); // ํƒ€์ผ“๋ฌธ์ž
            String cur = "";     //ํ˜„์žฌ ๋ฌธ์ž์—ด
            int cnt = 1;        //์••์ถ• ์นด์šดํŠธ
            StringBuilder sb = new StringBuilder();

            for (int start = i; start <= s.length(); start += i) {
                if(start + i >= s.length()) cur = s.substring(start);
                else cur = s.substring(start, start + i);

                if(cur.equals(target)) cnt += 1;
                else if (cnt == 1) {
                    sb.append(target);
                    target = cur;
                } else {
                    sb.append(cnt).append(target);
                    target = cur;
                    cnt = 1;
                }
            }
            if(i != target.length()) sb.append(target);

            answer = Math.min(answer, sb.toString().length());
        }

        return answer;
    }
}
728x90
๋ฐ˜์‘ํ˜•