강의로 돌아가기
어려워어

greedy 방식(에러) 및 무식한 방식

현재 위치에서 거리가 가장 가까운 지점으로 이동(로컬 최적)하는 방식으로 접근해봤는데 에러가 나서, 그냥 무식한 방식(모든 지점 이동 순서에 대한 경우의 수만큼 총 비용 계산 / 최소값 리턴)으로 풀어봤습니다..

작성중인 코드―solution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def solution(name):
    """
    # greedy하게 이동할 곳을 탐색 (알파벳을 바꿀 인덱스 중 가장 가까운 인덱스)
    name = list(name)
    def greedyFind(name, start):
        indexes = []
        for i in range(len(name)):
            if name[i] != 'A':
                indexes.append(i)
        res = [ (i, min([(len(name)-start+i)%len(name), (len(name)+start-i)%len(name)])) for i in indexes ]
        return sorted(res, key=lambda x: x[1])[0]
    answer = 0
    start = 0
    while ''.join(name) != 'A'*len(name):
        start, distance = greedyFind(name, start)
        answer = answer + distance + min(ord(name[start])-ord('A'), 26+ord('A')-ord(name[start]))
        name[start] = 'A'
        print(name, answer)
    return answer
    """

    import itertools
    indexes = [ i for i, c in enumerate(name) if c != 'A' ]

    # dictionary for distances
    d_distance = {}
    for i in set([0]+indexes):
        for j in set([0]+indexes):
            d_distance[f"{i}_{j}"] = min([(len(name)-i+j)%len(name), (len(name)+i-j)%len(name)])

    # dictionary for switching costs 
    d_switch = {}
    for i in set([name[i] for i in indexes]):
        d_switch[i] = min(ord(i)-ord('A'), 26+ord('A')-ord(i))

    answer = float('inf')
    res_switch = sum([d_switch[name[i]] for i in indexes])
    for case in itertools.permutations(indexes):
        res = res_switch
        start = 0
        for i in case:
            res = res + d_distance[f"{start}_{i}"]
            start = i
        answer = min(answer, res)
    return answer
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.