ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [🦩 프로그래머스 2단계] 수식 최대화 / 기능 개발 / 다리를 지나는 트럭 / 가장 큰 수
    Algorithm/케로베로스 2020. 11. 29. 22:02
    반응형

    Q. 수식 최대화

    내가 생각한 알고리즘:

    +-* 중 하나가 나오면 슬라이싱 해주고, 계산해주는 함수 호출.재귀함수 활용해서 숫자만 남을때까지 쪼갠다음에 다시 합쳐주는 방식...각 계산 값을 result에 append하고 max로 가장 큰 값을 출력한다.

    # 1차시도
    def cal(left, right, operator):
        return eval(left+operator+right)
    
    def solution(expression):
        for index, value in enumerate(expression):
            if value in '+-*':
                left = expression[:index]
                right = expression[index+1:]
                print(cal(left, right, value))

    이렇게하면 그냥 한번에 계산해주는 것 밖에 안됨ㅜ

    # 2차 시도
    def cal(left, right, operator):
        if left.isdigit() and right.isdigit():
            return eval(left+operator+right)
        else:
            return solution(left+right)
    
    def solution(expression):
        for index, value in enumerate(expression):
            if value in '+-*':
                left = expression[:index]
                right = expression[index+1:]
                print(cal(left, right, value))

    left, right 둘 다 숫자일때만 eval 실행, 아니면 다시 soultion으로 가서 쪼개줌

    # 3차 시도
    def cal(left, right, operator):
        if left.isdigit() and right.isdigit():
            return eval(left+operator+right)
        else:
            if left.isdigit():
                return solution(right)
            elif right.isdigit():
                return solution(left)
            else:
                return solution(left+operator+right)
    
    def solution(expression):
        result = []
        for index, value in enumerate(expression):
            if value in '+-*':
                left = expression[:index]
                right = expression[index+1:]
                
                result.append(cal(left, right, value))
        print(result)

     

    #다른사람 풀이...

    import re
    from itertools import permutations # 순열을 구하는 함수
    
    def solution(expression):
        #1
        op = [x for x in ['*','+','-'] if x in expression]
        op = [list(y) for y in permutations(op)] # *,+,-로 순열 생성
        ex = re.split(r'(\D)',expression) #  숫자로 split 
    
        #2
        a = []
        for x in op:
            _ex = ex[:]
            for y in x: # *+- 
                while y in _ex: 
                    tmp = _ex.index(y) 
                    _ex[tmp-1] = str(eval(_ex[tmp-1]+_ex[tmp]+_ex[tmp+1]))
                    _ex = _ex[:tmp]+_ex[tmp+2:]
            a.append(_ex[-1])
    
        #3
        return max(abs(int(x)) for x in a)

     

    Q. 기능 개발

    import math
    
    def solution(p, s):
        answer = []
        
        for p, s in zip(p,s): 
            answer.append(math.ceil((100-p)/s)) # 작업 일수 출력
        
        a = answer[0] 
        l = []
        count = 1 # answer[0] 값부터 시작하므로 1부터 시작
        
        for i in range(1,len(answer)):
            if answer[i] <= a: # 만약 a보다 작으면 같이 배포가능이니까
                count += 1 # count +1
            else: # 만약 a보다 크면 얘는 같이 배포 못함
                l.append(count) # 여태까지의 count 저장
                count = 1 # i값부터 다시 시작하니까 count 1
                a = answer[i]
            
            if i == len(answer)-1: #i가 마지막 값일 경우 append 못해줬으니까 해줌
                l.append(count)
                
        return l

     

     

    Q. 다리를 지나는 트럭 

    # 1차시도
    def solution(b, w, t):
        bridge = [0] * b
        time = 0
        while True:
            if sum(t) == 0:
                break 
    
            if t[0] + sum(bridge) <= w:
                bridge.pop(0)
                bridge.append(t.pop(0))
                t.append(0)
                time += 1
                print(bridge)
            else:
                bridge.pop(0)
                bridge.append(0)
                time += 1
                print(bridge)
                
      # 출력
      # [0, 7]
      # [7, 0]
      # [0, 0]
      # [0, 4]
      # [4, 5]
      # [5, 0]
      # [0, 0]
      # [0, 6]

    1) 다리 길이만큼 0을 가진 리스트를 생성한다

    2) 리스트의 합과 다음에 올 트럭의 합이 weight보다 작으면 트럭 in 

    3) 아니면 0을 넣어준다...

    내가 생각한건 

    [0, 7] -> [7,0] -> [0,4] -> [4,5] 이런 식으로 흘러가는 건데 [0,0] 이 발생함!!! 이거 어케 해결하지

    # 2차시도 
    def solution(b, w, t):
        bridge = [0] * b
        time = 0
        while True:
            if t[0] + sum(bridge) <= w:
                bridge.pop(0)
                bridge.append(t.pop(0))
                t.append(0)
                time += 1
            else:
                bridge.pop(0)
                
                # 이 부분 추가
                if sum(bridge) == 0:
                    bridge.append(t.pop(0))
                else:
                    bridge.append(0)
                time += 1
                
            if sum(bridge) == 0:
                break 
                
        return time

    if sum(bridge) == 0~~ 을 추가해서 테스트케이스는 통과했는데 코드 채점은 장렬하게 실패함.

    그리고 시간도 너무 오래 걸림.. 다른 방법이 필요할 듯

     

    * 다른사람 풀이

    결국 다른 사람 답 참고함 ㅎㅎ..

    def solution(b, w, t):
        bridge = [0] * b # 다리길이만큼의 리스트를 생성해준다 (건너는 다리 역할)
        time = 0 # 시간은 0부터 시작
        
        while bridge: # bridge에 값이 없으면 끝난다
            bridge.pop(0) # bridge 값을 하나 빼준다 
            time += 1 # 시간을 더해준다
            
            if t: # 만약 t가 있으면 (건너지 않은 트럭이 존재하면)
                if t[0] + sum(bridge) <= w: # 트럭과 sum(b)의 합이 작으면
                    bridge.append(t.pop(0)) # 다리를 건너게 해주고
                else: # 아니면
                    bridge.append(0) # 트럭 대신 0을 넣어준다
     
        return time

    이렇게하면 마지막 트럭이 다리를 건너는 순간까지 쭉 돌아감!

    출력:

    [0, 0]
    [0, 7]
    [7, 0]
    [0, 4]
    [4, 5]
    [5, 0]
    [0, 6]
    [6]

     

     

    Q. 가장 큰 수

    내가 생각한 알고리즘:

    1) 3, 30, 34를 34, 3, 30으로 나열해야 한다고 했을 때,

    n[1] 자릿수가 3보다 크면 앞으로, 작으면 뒤로 가게끔 설정한다

    근데 이게 자릿수가 점점 더 커지면 노답 --> 실패

    def solution(numbers):
        numbers = list(map(str, numbers))
        n = sorted(numbers, key=lambda x: x[0], reverse=True)    
        answer = []
        
        for i in range(len(n)-1):
            for j in range(i+1, len(n)):
                if n[i][0] == n[j][0]:
                    if n[i][0] < n[j][1]:
                        answer.append(n[j])
                    else:
                        answer.append(n[i])
                        
        print(answer)

    2) 그럼 자릿수를 강제로 맞춰줘서 크기로 비교한다. 

    def solution(numbers):
        n = list(map(str, numbers))
        answer = []
        
        for i in n:
            answer.append(i.ljust(5,'0'))
            
        n = sorted(answer, reverse=True)  
        print(n)
     # ['60000', '20000', '10000']

    6 다음 10이 나와야되는데 2가 나오는 상황 발생 --> 실패

     

    * 다른사람 풀이

    같은 숫자를 반복한 다음에 비교..👍🏻

    def solution(numbers):
        numbers = list(map(str, numbers))
        numbers.sort(key=lambda x: x*3, reverse=True)
        return str(int(''.join(numbers)))
    반응형

    'Algorithm > 케로베로스' 카테고리의 다른 글

    [🐉 백준 5단계] 1차원 배열  (0) 2020.12.05
    [🐉 백준 4단계] While문  (0) 2020.12.05
    [🐉 백준 3단계] for문  (0) 2020.11.21
    [🐉 백준 2단계] if문  (0) 2020.11.21
    [🐉 백준 1단계] 입출력과 사칙연산  (0) 2020.11.21

    댓글

Designed by Tistory.