Contents

μ‘°μ΄μŠ€ν‹± (with.Java)

   Aug 14, 2024     3 min read

μ‘°μ΄μŠ€ν‹± (with.Java) λ¬Έμ œμ— λŒ€ν•˜μ—¬ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

μ½”λ”© ν…ŒμŠ€νŠΈ 문제λ₯Ό ν’€λ©°, ν’€μ—ˆλ˜ λ¬Έμ œμ— λŒ€ν•œ 회고λ₯Ό ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•΄ λ¨Όμ € μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

문제

μ‘°μ΄μŠ€ν‹±μœΌλ‘œ μ•ŒνŒŒλ²³ 이름을 μ™„μ„±ν•˜μ„Έμš”.

맨 μ²˜μŒμ—” A둜만 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

ex. μ™„μ„±ν•΄μ•Ό ν•˜λŠ” 이름이 μ„Έ κΈ€μžλ©΄ AAA, λ„€ κΈ€μžλ©΄ AAAA

μ‘°μ΄μŠ€ν‹±μ„ 각 λ°©ν–₯으둜 움직이면 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

β–² - λ‹€μŒ μ•ŒνŒŒλ²³

β–Ό - 이전 μ•ŒνŒŒλ²³ (Aμ—μ„œ μ•„λž˜μͺ½μœΌλ‘œ μ΄λ™ν•˜λ©΄ Z둜)

β—€ - μ»€μ„œλ₯Ό μ™Όμͺ½μœΌλ‘œ 이동 (첫 번째 μœ„μΉ˜μ—μ„œ μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©΄ λ§ˆμ§€λ§‰ λ¬Έμžμ— μ»€μ„œ)

β–Ά - μ»€μ„œλ₯Ό 였λ₯Έμͺ½μœΌλ‘œ 이동 (λ§ˆμ§€λ§‰ μœ„μΉ˜μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©΄ 첫 번째 λ¬Έμžμ— μ»€μ„œ)

예λ₯Ό λ“€μ–΄ μ•„λž˜μ˜ λ°©λ²•μœΌλ‘œ β€œJAZ”λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 첫 번째 μœ„μΉ˜μ—μ„œ μ‘°μ΄μŠ€ν‹±μ„ μœ„λ‘œ 9번 μ‘°μž‘ν•˜μ—¬ Jλ₯Ό μ™„μ„±ν•©λ‹ˆλ‹€.
  • μ‘°μ΄μŠ€ν‹±μ„ μ™Όμͺ½μœΌλ‘œ 1번 μ‘°μž‘ν•˜μ—¬ μ»€μ„œλ₯Ό λ§ˆμ§€λ§‰ 문자 μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€.
  • λ§ˆμ§€λ§‰ μœ„μΉ˜μ—μ„œ μ‘°μ΄μŠ€ν‹±μ„ μ•„λž˜λ‘œ 1번 μ‘°μž‘ν•˜μ—¬ Zλ₯Ό μ™„μ„±ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 11번 μ΄λ™μ‹œμΌœ β€œJAZ”λ₯Ό λ§Œλ“€ 수 있고, μ΄λ•Œκ°€ μ΅œμ†Œ μ΄λ™μž…λ‹ˆλ‹€.

λ§Œλ“€κ³ μž ν•˜λŠ” 이름 name이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 이름에 λŒ€ν•΄ μ‘°μ΄μŠ€ν‹± μ‘°μž‘ 횟수의 μ΅œμ†Ÿκ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό λ§Œλ“œμ„Έμš”.

μ œν•œμ‚¬ν•­

  • name은 μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.
  • name의 κΈΈμ΄λŠ” 1 이상 20 μ΄ν•˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆμ‹œ

namereturn
β€œJEROEN”56
β€œJAN”23

λ¬Έμ œμ— λŒ€ν•œ λ‚˜μ˜ 풀이

class Solution {
    public int solution(String name) {
        int answer = 0;
        int cursor = name.length() - 1;

        for(int i = 0; i < name.length(); i++){
            answer += Math.min(name.charAt(i) - 'A', 'Z' - name.charAt(i) + 1);
            if(i < name.length() - 1 && name.charAt(i + 1) == 'A'){
                int temp = i + 1;
                while(temp < name.length() && name.charAt(temp) == 'A'){
                    temp++;
                }
                cursor = Math.min(cursor, (i * 2) + (name.length() - temp));
                cursor = Math.min(cursor, i + (name.length() - temp) * 2);
            }
        }
        return answer + cursor;
    }
}

풀이 μ„€λͺ…

λ¨Όμ €, answer λ³€μˆ˜λŠ” 각 문자λ₯Ό μ‘°μž‘ν•˜μ—¬ λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” λ¬Έμžμ—΄μ˜ μ‘°μž‘ 횟수λ₯Ό λˆ„μ ν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

λ¬Έμžμ—΄μ„ μ²˜μŒλΆ€ν„° λκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄μ„œ 각 문자λ₯Ό μ‘°μ‚¬ν•©λ‹ˆλ‹€.

ν˜„μž¬ λ¬Έμžμ—μ„œ β€˜Aβ€™κΉŒμ§€μ˜ 거리와 β€˜Zβ€™μ—μ„œ ν˜„μž¬ λ¬ΈμžκΉŒμ§€μ˜ 거리 쀑 μž‘μ€ 값을 μ„ νƒν•˜μ—¬ ν•΄λ‹Ή 문자λ₯Ό μ‘°μž‘ν•˜λŠ” 데 ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ μ‘°μž‘ 횟수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, ν˜„μž¬ λ¬Έμžκ°€ β€˜B’라면, β€˜Aβ€™κΉŒμ§€λŠ” ν•œ μΉΈ μœ„λ‘œ μ‘°μž‘ν•˜λ©΄ λ˜λ―€λ‘œ 1번의 μ‘°μž‘μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

λ˜λŠ” β€˜Yβ€™μ—μ„œ β€˜Zβ€™κΉŒμ§€ ν•œ μΉΈ μ•„λž˜λ‘œ μ‘°μž‘ν•˜λ©΄ λ˜λ―€λ‘œ λ§ˆμ°¬κ°€μ§€λ‘œ 1번의 μ‘°μž‘μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

이런 μ‹μœΌλ‘œ 각 λ¬Έμžλ§ˆλ‹€ μ‘°μž‘ 횟수λ₯Ό κ³„μ‚°ν•˜μ—¬ answer λ³€μˆ˜μ— λˆ„μ ν•©λ‹ˆλ‹€.

κ·Έ λ‹€μŒμœΌλ‘œ, μ—°μ†λœ β€˜A’λ₯Ό λ§Œλ‚˜λŠ” 경우 좔가적인 이동 횟수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

β€˜Aβ€™λ‘œ μ΄μ–΄μ§€λŠ” 뢀뢄을 λ§Œλ‚˜λ©΄ κ·Έ λ‹€μŒμœΌλ‘œ 이동할 λ•Œ 좔가적인 μ‘°μž‘ 횟수λ₯Ό κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ™œλƒν•˜λ©΄ μ—°μ†λœ β€˜A’λ₯Ό λ§Œλ‚˜λ©΄ λ˜λŒμ•„κ°ˆ λ•Œμ—λ„ μ‘°μž‘ νšŸμˆ˜κ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ”°λΌμ„œ ν˜„μž¬ 문자 λ‹€μŒμ— μ—°μ†λœ β€˜A’λ₯Ό λ§Œλ‚˜λ©΄, κ·Έ λ‹€μŒμœΌλ‘œ 이동할 λ•ŒκΉŒμ§€μ˜ 좔가적인 μ‘°μž‘ 횟수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄ cursor λ³€μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

cursor λ³€μˆ˜λŠ” μ—°μ†λœ β€˜A’λ₯Ό λ§Œλ‚˜κ³  λ‹€μŒμœΌλ‘œ 이동할 λ•Œμ˜ μ΅œμ†Œν•œμ˜ μΆ”κ°€ μ‘°μž‘ 횟수λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

이λ₯Ό μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•΄ cursorλ₯Ό name의 길이 - 1둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

μ΄λŠ” λ¬Έμžμ—΄ λκΉŒμ§€ ν•œ 번 μ΄λ™ν•˜λŠ” 것이 μ΅œμ•…μ˜ 경우라고 κ°€μ •ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ—°μ†λœ β€˜A’λ₯Ό λ§Œλ‚˜λŠ” 경우, κ·Έ λ‹€μŒμœΌλ‘œ 이동할 λ•ŒκΉŒμ§€μ˜ μ‘°μž‘ 횟수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

이 λ•Œ, 두 가지 경우λ₯Ό λΉ„κ΅ν•˜μ—¬ 더 μž‘μ€ 값을 μ„ νƒν•©λ‹ˆλ‹€.

ν˜„μž¬ 문자 μœ„μΉ˜ iμ—μ„œ μ—°μ†λœ β€˜A’가 λλ‚˜λŠ” μœ„μΉ˜κΉŒμ§€ μ΄λ™ν•œ ν›„, λμ—μ„œλΆ€ν„° ν˜„μž¬ μœ„μΉ˜κΉŒμ§€μ˜ 거리와 ν˜„μž¬ μœ„μΉ˜κΉŒμ§€μ˜ 거리λ₯Ό λ”ν•©λ‹ˆλ‹€.

λ˜λŠ”, ν˜„μž¬ μœ„μΉ˜κΉŒμ§€μ˜ 거리와 μ—°μ†λœ β€˜A’가 λλ‚˜λŠ” μœ„μΉ˜λΆ€ν„° λκΉŒμ§€ μ΄λ™ν•œ ν›„ λ‹€μ‹œ λ˜λŒμ•„μ˜¬ λ•ŒκΉŒμ§€μ˜ 거리λ₯Ό λ”ν•©λ‹ˆλ‹€.

이 경우, ν˜„μž¬ μœ„μΉ˜κΉŒμ§€μ˜ 거리에닀가 μ—°μ†λœ β€˜A’가 λλ‚˜λŠ” μœ„μΉ˜λΆ€ν„° λκΉŒμ§€μ˜ 거리λ₯Ό 두 배둜 κ³±ν•œ 값을 λ”ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ κ³„μ‚°λœ 좔가적인 이동 횟수λ₯Ό cursor λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ, answer에 λˆ„μ λœ 문자 μ‘°μž‘ νšŸμˆ˜μ™€ 좔가적인 이동 횟수(cursor)λ₯Ό λ”ν•˜μ—¬ μ΅œμ’…μ μΈ μ‘°μž‘ 횟수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

κ²°λ‘ 

μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 주어진 λ¬Έμžμ—΄μ„ μ‘°μž‘ν•˜μ—¬ λͺ©ν‘œ λ¬Έμžμ—΄λ‘œ λ§Œλ“€κΈ° μœ„ν•œ μ΅œμ†Œν•œμ˜ μ‘°μž‘ 횟수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.