Algorithm/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / C++] μ‘°μ΄μŠ€ν‹±

meeeeejin 2021. 1. 10. 21:01

 

문제링크: programmers.co.kr/learn/courses/30/lessons/42860

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μ‘°μ΄μŠ€ν‹±

μ‘°μ΄μŠ€ν‹±μœΌλ‘œ μ•ŒνŒŒλ²³ 이름을 μ™„μ„±ν•˜μ„Έμš”. 맨 μ²˜μŒμ—” A둜만 이루어져 μžˆμŠ΅λ‹ˆλ‹€. ex) μ™„μ„±ν•΄μ•Ό ν•˜λŠ” 이름이 μ„Έ κΈ€μžλ©΄ AAA, λ„€ κΈ€μžλ©΄ AAAA μ‘°μ΄μŠ€ν‹±μ„ 각 λ°©ν–₯으둜 움직이면 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. β–² - λ‹€

programmers.co.kr

 

풀이

 

μ‘°μ΄μŠ€ν‹±μ„ μœ„μ•„λž˜λ‘œ μ›€μ§μ΄λŠ” νšŸμˆ˜μ™€ 쒌우둜 μ›€μ§μ΄λŠ” 횟수λ₯Ό λ”°λ‘œ μƒκ°ν–ˆλ‹€. 

 

μœ„μ•„λž˜λ‘œ μ›€μ§μ΄λŠ” 것은 μ•ŒνŒŒλ²³μ—μ„œ Aκ°€ κ°€κΉŒμš΄μ§€ Zκ°€ κ°€κΉŒμš΄μ§€μ— 따라 μ΅œμ†Œ 횟수λ₯Ό κ΅¬ν–ˆλ‹€. 

 

쒌우둜 μ›€μ§μ΄λŠ” 것은 μ™Όμͺ½κ³Ό 였λ₯Έμͺ½ 쀑 μ–΄λŠ μͺ½μœΌλ‘œ κ°€μ•Ό μ΅œμ†Œκ°€ λ˜λŠ”μ§€λ₯Ό κ΅¬ν•΄μ„œ ν•΄κ²°ν–ˆλ‹€. 쒌우 이동 횟수(move)의 μ΄ˆκΉƒκ°’μ€ μ΅œλŒ€ 이동 횟수인 len - 1이닀. 이후 i + (len - next) + min(i, len - next)κ³Ό 비ꡐ해 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•œλ‹€. 

 

ABBAAAABAλ₯Ό μ˜ˆμ‹œλ‘œ 계산을 μ„€λͺ…ν•˜μžλ©΄, iκ°€ 2일 λ•Œ nextλŠ” 7이 λœλ‹€. iμ—μ„œ nextκΉŒμ§€ μ™Όμͺ½μœΌλ‘œ μ΄λ™ν–ˆμ„ λ•Œμ˜ κ±°λ¦¬λŠ” i + (len - next)이닀. μ²˜μŒμ— μ™Όμͺ½μœΌλ‘œ κ°ˆμ§€ 였λ₯Έμͺ½μœΌλ‘œ κ°ˆμ§€λŠ” min(i, len - next)둜 κ΅¬ν•œλ‹€. 이 μ˜ˆμ‹œμ—μ„  len - next의 값이 더 μž‘μœΌλ―€λ‘œ μ™Όμͺ½μœΌλ‘œ λ¨Όμ € κ°€λŠ” 것을 νƒν•œλ‹€. λ”°λΌμ„œ len - nextλ₯Ό i와 next의 거리에 더해주어 μ™Όμͺ½μœΌλ‘œ κ°”λ‹€κ°€ λŒμ•„μ˜€λŠ” 것을 계산해쀀닀. 

 

 

 

μ†ŒμŠ€μ½”λ“œ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int solution(string name) {
    int answer = 0
    for(auto ch: name) answer += min(ch - 'A'91 - ch);
 
    int len = name.length();
    int move = len - 1;
    int next;
    for(int i = 0; i < len; i++) {
        next = i + 1;
        while(next < len && name[next] == 'A') next++;
        move = min(move, i + (len - next) + min(i, len - next));
    }
    answer += move;
 
    return answer;
}
cs

 

ν…ŒμŠ€νŠΈ κ²°κ³Ό

 

 

κ³΅λΆ€ν•œ 것을 μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. μˆ˜μ •ν•  뢀뢄이 μžˆλ‹€λ©΄ μ•Œλ €μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€ :)

 

 

 

728x90