๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/์ž๋ฃŒ๊ตฌ์กฐ & ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฌธ์ž์—ด ์••์ถ• (Java)

by 1mj 2021. 10. 25.

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

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ฌธ์ž์—ด ์••์ถ•

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜๊ณ  ์‹ถ์€ "์–ดํ”ผ์น˜"๋Š” ๋ฌธ์ž์—ด์„ ์••์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋น„์†์‹ค ์••์ถ• ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ฌธ

programmers.co.kr

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 2020 KAKAO BLIND RECRUITMENT "๋ฌธ์ž์—ด ์••์ถ•" ๋ฌธ์ œ ํ’€์ด์ด๋‹ค.

 

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ์ฝ์„ ๋•Œ abcabcdede๊ฐ€ 3abc2de์™€ ๊ฐ™์ด ์••์ถ•๋˜์–ด์•ผ ํ•˜๋Š” ์ค„ ์•Œ๊ณ  ํ—ค๋ฉ”๋‹ค๊ฐ€ ๋‹ค๋ฅธ ๋ถ„๋“ค ํ’€์ด๋ฅผ ์กฐ๊ธˆ ์ฐธ๊ณ ํ–ˆ๋‹ค.

์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ 3๊ฐœ ์งœ๋ฆฌ, 2๊ฐœ ์งœ๋ฆฌ ์ฒ˜๋Ÿผ ๊ธฐ์ค€์ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด์„ ์ž๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๋Š” ํ•˜๋‚˜๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๋ฌธ์ž์—ด์„ ์ž๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๊ฐ€ ํ•˜๋‚˜๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋Š” ์ , ๋ฌธ์ž์—ด์„ ์ œ์ผ ์•ž์—์„œ๋ถ€ํ„ฐ ์ž˜๋ผ์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ํ™œ์šฉํ•ด ๋ฌธ์ž์—ด์„ ์ž๋ฅด๋Š” ๋‹จ์œ„๋ณ„๋กœ ์••์ถ•ํ•  ๊ฒฝ์šฐ ๊ทธ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๊ณ  ๊ฐ€์žฅ ์••์ถ•๋ฅ ์ด ๋†’์€ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์•„๋ƒˆ๋‹ค.

 

์ ‘๊ทผ๋ฒ• ๋ฐ ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

class Solution {
    public int solution(String s) {
        int answer = 0;
        if (s.length() == 1) {
            return 1;
        }
        // 1 ~ N/2+1 ์ค‘์— ๋ฌธ์ž์—ด์„ ๋ช‡ ๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅผ์ง€ ๋ฐ˜๋ณต
        for (int i = 1; i < s.length() / 2 + 1; i++) {
            String target = s.substring(0, i);  // ๋ฌธ์ž์—ด์„ N๊ฐœ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด ๋น„๊ตํ•  ๋Œ€์ƒ
            String done = "";                   // ๋ฐ˜๋ณต๋˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด์ด๊ฑฐ๋‚˜ ์ด๋ฏธ ์••์ถ•๋œ ๋ฌธ์ž์—ด
            String current = "";                // ํ˜„์žฌ ๋น„๊ต๋˜๋Š” ๋Œ€์ƒ
            int count = 1;                      // ๋ฐ˜๋ณต ํšŸ์ˆ˜
            
            // N๊ฐœ ๋‹จ์œ„๋กœ ์ž๋ฅด๋ฉด ๊ทธ ๋‹ค์Œ N๊ฐœ์™€ ๋น„๊ต
            for (int j = i; j < s.length(); j += i) {
                // ๋‚จ์€ ๋ฌธ์ž์—ด์ด N๊ฐœ๋ณด๋‹ค ์ž‘์„ ๋•Œ๋Š” ์••์ถ• ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ˆ„์ ํ•˜๊ณ  ๋๋ƒ„
                if (j + i > s.length()) {
                    done += s.substring(j, s.length());
                }
                // ๋‚จ์€ ๋ฌธ์ž์—ด์ด N๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ N๊ธ€์ž์™€ ๋น„๊ต ํ›„ ๋ฐ˜๋ณตํšŸ์ˆ˜ ์ฆ๊ฐ€ ๋˜๋Š” ๋ฐ˜๋ณต๋Œ€์ƒ ๋ณ€๊ฒฝ
                else {
                    current = s.substring(j, j + i);
                    if (current.equals(target)) {
                        count++;
                    } else {
                        done += ((count == 1 ? "" : count + "") + target);
                        target = s.substring(j, j + i);
                        count = 1;
                    } 
                }
            }
            // ์ˆœ์„œ๋Š” ์ƒ๊ด€์—†์œผ๋ฏ€๋กœ
            // ๋ฐ˜๋ณตํšŸ์ˆ˜์™€ ๋Œ€์ƒ(๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ˜๋ณต๋œ ๋Œ€์ƒ), ์ด๋ฏธ ์••์ถ•๋˜์—ˆ๊ฑฐ๋‚˜ ์••์ถ•๋˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ž์—ด๋“ค์„ ํ•ฉ์นจ
            String result = (count == 1 ? "" : count + "") + target + done;

            // N๊ฐœ ๋‹จ์œ„ ์ค‘ ์–ด๋–ค ๋ฌธ์ž์—ด์ด ๊ฐ€์žฅ ์งง์€์ง€ ๋น„๊ตํ•˜์—ฌ ์ตœ์†Œ๊ฐ’ ๊ตฌํ•จ
            if (answer == 0) {
                answer = result.length();
            }
            if (result.length() < answer) {
                answer = result.length();
            }
        }
        return answer;
    }
}

 

๋Œ“๊ธ€