오늘은 트럭문제군 🚚🚚🚚
문제 설명
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.
예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.
경과 시간 | 다리를 지난 트럭 | 다리를 건너는 트럭 | 대기 트럭 |
0 | [] | [] | [7,4,5,6] |
1~2 | [] | [7] | [4,5,6] |
3 | [7] | [4] | [5,6] |
4 | [7] | [4,5] | [6] |
5 | [7,4] | [5] | [6] |
6~7 | [7,4,5] | [6] | [] |
8 | [7,4,5,6] | [] | [] |
따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.
solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.
제한 조건
- bridge_length는 1 이상 10,000 이하입니다.
- weight는 1 이상 10,000 이하입니다.
- truck_weights의 길이는 1 이상 10,000 이하입니다.
- 모든 트럭의 무게는 1 이상 weight 이하입니다.
입출력 예
bridge_length | weight | truck_weights | return |
2 | 10 | [7,4,5,6] | 8 |
100 | 100 | [10] | 101 |
100 | 100 | [10,10,10,10,10,10,10,10,10,10] | 110 |
풀이>
1. truck_weights의 길이 = list에 stack될 대기 요소들
2. bridge_length의 숫자 = stack할 list 길이
3. weight >= stack된 트럭 무게의 합 : 이 조건이 충족될때 list에 append하기
4. return = stack이 전부 pop()되기 까지 걸리는 시간.
첨에 짠 코드... 이상한 에러가 남.
def solution(bridge_length, weight, truck_weights):
answer = 0
list = [0] * bridge_length[0] #다리길이 숫자를 인덱싱해서 list길이 만들어주기
while list: #list안에서 일어나는 명령들
answer += 1 #1초가 지나면
list.pop(0) #맨 앞에 애를 하나씩 지워주고
#다리 위에 트럭 올리기
#(list에 올라간 무게+올릴트럭 무게)가 weight를 넘지 않을때
while truck_weights:
if weight[0] >= sum(list) + truck_weights[0]:
list.append(truck_weights.pop(0)) #list에 올려줌.
#(list에 올라간 무게+올릴트럭 무게)가 weight를 초과할 때
else:
list.append('0') #시간을 계속 세야하니까 그냥 넘기면 안됨. 대기하는 truck은 내비두고 0으로 채우기
return answer
TypeError: 'int' object is not subscriptable...?
구글링 해보니, 인덱싱해서 불러온 요소는 문자열로 읽히기 때문.
그래서 처음에 list길이 만들때 bridge_length[0]이 아닌 그냥 bridge_length로 해준다.
밑에 weight[0]도 마찬가지로 weight로 변경.
참고: www.codeit.kr/community/threads/3084
코딩이 처음이라면, 코드잇
월 3만원대로 Python, JavaScript, HTML/CSS, Java 등 1,600개 이상 프로그래밍 강의를 무제한 수강하세요
www.codeit.kr:443
2차 시도 결과 >> ... 또 틀려서 숨겨버림....ㅋㅋㅋㅋ
def solution(bridge_length, weight, truck_weights):
answer = 0
list = [0] * bridge_length #다리길이 숫자를 인덱싱해서 list길이 만들어주기
while list: #list안에서 일어나는 명령들
answer += 1 #1초가 지나면
list.pop(0) #맨 앞에 애를 하나씩 지워주고
#다리 위에 트럭 올리기
#(list에 올라간 무게+올릴트럭 무게)가 weight를 넘지 않을때
while truck_weights:
if weight >= sum(list) + truck_weights[0]:
list.append(truck_weights.pop(0)) #list에 올려줌.
#(list에 올라간 무게+올릴트럭 무게)가 weight를 초과할 때
else:
list.append('0') #시간을 계속 세야하니까 그냥 넘기면 안됨. 대기하는 truck은 내비두고 0으로 채우기
return answer

후훗,, 문자열이랑 정수랑 더하려해서 typeerror남... 그래서 이렇게 고쳐 봄.
list_weight라는 애를 추가 해 주었다.
def solution(bridge_length, weight, truck_weights):
answer = 0
list = [0] * bridge_length #다리길이 숫자를 인덱싱해서 list길이 만들어주기
list_weight = 0 #다리 위에 무게 정수 선언
while list: #list안에서 일어나는 명령들
list_weight = sum(list)
answer += 1 #1초가 지나면
list.pop(0) #맨 앞에 애를 하나씩 지워주고
#다리 위에 트럭 올리기
#(list에 올라간 무게+올릴트럭 무게)가 weight를 넘지 않을때
while truck_weights:
if weight >= list_weight + truck_weights[0]:
list.append(truck_weights.pop(0)) #list에 올려줌.
#(list에 올라간 무게+올릴트럭 무게)가 weight를 초과할 때
else:
list.append('0') #시간을 계속 세야하니까 그냥 넘기면 안됨. 대기하는 truck은 내비두고 0으로 채우기
return answer

뭐지..ㅠ_ㅠ 하나 틀렸넹.... 뭐지무저ㅣㅇ 왜그러징...
결국 다른 분이 푼것 중에서 가장 이해가 잘 가는 것을 보고 고쳐서 풀음..
def solution(bridge_length, weight, truck_weights):
list = [0] * bridge_length
list_weight = 0
answer = 0
while truck_weights: #truck_weights가 소진될때까지 while이 돌아감.
answer += 1 #시간 1초당 일어나는일들
list_weight -= list.pop(0) #다리위의 총 무게에서 맨 앞꺼 하나씩 빼준다..(=다리를 통과한 것)
if (list_weight + truck_weights[0]) <= weight:
tw = truck_weights.pop(0) #기다리는애 처음꺼 뽑아서
list.append(tw) #다리 위에 올리고
list_weight+= tw #무게에 더한다.
else: #무게 초과해서 못올리는경우
list.append(0) #다리위에 0을 더한다(=트럭을 안올린다)
answer += bridge_length
#마지막 트럭이 다리를 빠져나오는 시간 더해주는 것.
return answer
끝,,,ㅠ
'매일매일 코딩연습! > 프로그래머스' 카테고리의 다른 글
[코딩연습 12일차] 프로그래머스 : 신규아이디 / python (0) | 2021.02.16 |
---|---|
[코딩연습 11일차] 프로그래머스 : 삼각 달팽이 / python풀이 java풀이 (0) | 2021.02.13 |
[코딩연습 9일차] 프로그래머스 : 모든 레코드 조회하기 / MySQL / Select연습 (0) | 2021.02.06 |
[코딩연습9일차] 프로그래머스 : 멀쩡한 사각형 / python (0) | 2021.02.06 |
[코딩연습8일차] 프로그래머스 : 기능개발 / python (0) | 2021.01.29 |