나의 풀이

def solution(food):
    answer = ''
    for i in range(len(food)):
        if food[i] <= 1:
            continue
        answer += str(i) * (food[i] // 2)
            
    return answer + '0' + answer[::-1]

 

 

나의 답안

def solution(k, m, score):
    answer = 0
    score.sort(reverse=True)
    for i in range(0, len(score), m):
        cur = score[i:i + m]
        if len(cur) >= m:
            answer += cur[-1] * m
        else:
            break
    
    return answer

 

모범 답안

def solution(k, m, score):
    return sum(sorted(score)[len(score)%m::m])*m

 

코딩이 재미있는 점이 바로 이런 부분인 것 같다.

같은 작업이더라도, 누가 생각하고 어떻게 구성하냐에 따라 천차만별의 동작 과정과 성과를 낸다.

훌륭한 코드를 만들 수 있도록, 더 노력하자.

최초 코드 - timeout

def solution(number, limit, power):
    answer = 0
    tmp = []
    for i in range(1, number + 1):
        cur = 0
        for j in range(1, i + 1):
            if i % j == 0:
                cur += 1
        tmp.append(cur)

    result = [tmp[i] if tmp[i] <= limit else power for i in range(number) ]

    return sum(result)

 

패스 코드

def solution(number, limit, power):
    answer = 0
    for i in range(1, number + 1):
        tmp = 0
        for j in range(1, int(i ** 0.5) + 1):
            if i % j == 0:
                tmp += 1
                if j ** 2 != i:
                    tmp += 1
            if tmp > limit:
                tmp = power
                break
        answer += tmp
    return answer

 

약수를 구할 때 1 ~ number만큼 구하면 시간 초과가 난다.

number의 제곱근 까지 구해 처리해보자.

 

def solution(name):
    minimum_move = [min(ord(i) - ord('A'), ord('Z') - ord(i) + 1) for i in name]
    i, answer = 0, 0
    while True:
        answer += minimum_move[i]
        minimum_move[i] = 0
        if sum(minimum_move) == 0:
            break
        l, r = 1, 1
        while minimum_move[i - l] == 0:
            l += 1
        while minimum_move[i + r] == 0:
            r += 1
        answer += l if l < r else r
        i += -l if l < r else r
    return answer

print(solution(input()))

 

일단 아스키코드 ord함수를 이용해 A부터 Z까지 해당 문자를 오름차순/내림차순 중 빠른 루트를 선택한다.

모든 문자들의 필요 횟수를 리스트에 담아둔 후 이동할 때 마다 해당 루트 수를 0으로 만든다(잔여이동횟수 느낌)

 

문제는  무조건 0에서 끝 까지 가는게아니라 가다가 중간에 되돌아 가는게 더 빠를 경우도 있다는 것이다.

이를 위해 left와 right를 각각 구하여 먼저 도달하는 수를 정답에 더해주면 된다.

+ Recent posts