본문 바로가기
알고리즘 풀이

[알고리즘] 프로그래머스 | 3진법 뒤집기, 푸드파이트대회, 예산

by 째깍단 2023. 8. 9.

3진법 뒤집기

답: 

더보기
def solution(n):
    answer = 0
    num_str = ""
    while(n != 0):
        num_str += str(n % 3)
        n = n // 3
                
    for i in range(2, len(num_str)+1):
        # i의 반대되는 수가 3승으로 들어가야함, -2부터 1승 시작
        answer += int(num_str[-i]) * (3**(i-1))
    return answer + int(num_str[-1])

계산이 약간 복잡했지만 풀어낼 수 있어서 기분좋당!

 

 +++ int()의 기능. str으로 된 숫자를 2번째인자 진법으로 변환해줌.. 

def solution(n):
    num_str = ""
    while(n != 0):
        num_str += str(n % 3)
        n = n // 3
                
    return int(num_str, 3)

 

 

문제 분석 및 해석

자연수 n 매개변수

n 3진법 상에서 앞뒤로 뒤집은 ,

다시 10진법으로 표현한 수를 return

 

 

>> 풀이생각

1) 3으로 나누어 각 나머지를 자리수에 더해두기

45 % 3 == 0
15 % 3 == 0
5 % 3 == 2
1 % 3 == 1
본래의 3진법수는 = 1200(3)

 

"0021"  <- str으로 더해주면 이렇게 바로 바뀐채도 더해질듯!

1의 자리수는 그냥 더하고
10의 자리수 이상은 3^승을 곱해서 더해주기
2 * 3 + 1 = 7

 

 

 

리뷰

 

 

다른사람의 풀이를 보며 int의 기능을 배울 수 있었다.

 int() : 1번째 인자를 str, 2번째인자를 숫자로 넣으면 해당 진법을 10진법 수로 변환해줌..!

 

 

 


푸드파이터대회

답: 

더보기
def solution(food):
    answer = ''
    new_food = [1]
    for i in range(1, len(food)):
        count = (food[i] // 2)
        new_food.append(count)

    for i in range(1, len(new_food)):
        answer += str(i) * new_food[i]
    answer += "0"
    for i in range(len(new_food)-1, 0, -1):
        answer += str(i) * new_food[i]
    return answer

 

 answer에 [::-1]연산자로 거꾸로 입력해주는 방법도 있다!!

def solution(food):
    answer = ''
    new_food = [1]
    for i in range(1, len(food)):
        count = (food[i] // 2)
        new_food.append(count)

    for i in range(1, len(new_food)):
        answer += str(i) * new_food[i]
    return answer + "0" + answer[::-1]

 

 

문제 분석 및 해석

food의 배열index에 따라 음식의 개수가 주어진다
0은 물, 항상 1개
food[i]는 i번 음식

주어진 i번 음식을 차례로 문자열로 만들고 0 넣고 대칭되도록 반대쪽 값 넣어주기

 

 

 

>> 풀이생각

음식별로 몫을 구해 new_food배열로 나타내기

1 ~ new_food 배열에 각 index를 곱해줌
0 더하기,
new_food 을 뒤에서부터 거꾸로 index를 곱해 문자열에 더해주기    

 

 

 

체크!

[::-1]

범위 연산자로 문자열 뒤집기가 가능!

마찬가지로 배열 뒤집기도 가능하다.

 

 

 

 

 


예산

답: 

더보기
def solution(d, budget):
    result = []
    for num in sorted(d):
        if budget < num:
            break
        budget = budget - num
        result.append(num)
    return len(result)

list에 저장해 길이를 구하는 방법

 

 

for문이 한 번 돌때마다 +1을 해주는 방법

아래가 시간은 조금 덜 걸림! 

def solution(d, budget):
    result = 0
    for num in sorted(d):
        if budget < num:
            break
        budget = budget - num
        result += 1
    return result

 

 

문제 분석 및 해석

예산에 맞는 배열을 구하고
배열에서 최대 개수인 배열을 구해 return

 

 

>> 풀이생각

1) 일단 작은 수로 정렬해서 budget에서 넘치지 않을 만큼(빼고 남은 예산 저장) 빼내어 배열을 만들기
2) 저장한 배열의 길이를 return

 

 

 

리뷰

 

append(), len()함수가 동작하는데에는 역시 조금 더 시간이 걸리게 된다

시간복잡도가 걱정된다면 될 수 있는 한 일반식을 사용하는 걸로!