-
[🦩 프로그래머스 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