728x90
https://school.programmers.co.kr/learn/courses/30/lessons/42583
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🤔 문제분석
덱큐를 이용하여 문제를 해결 하였습니다.
덱큐를 트럭을 담고있는 큐로 생각하고 0을 담고있다면 트럭은 없고 1 이상일경우 트럭이 있다고 가정합니다.
- 처음에 모든 큐를 다리 길이만큼 0으로 채워 줍니다.
- 트럭을 순회하면서 넣어봅니다.
- 덱의 마지막에 트럭이 존재한다면 현재무게와 현재 카운트를 뺍니다.
- 현재무게와 현재카운트를 만족시키는 트럭을 넣을 수 있다면 넣습니다. 넣지 못한다면 0을 넣습니다.
- 모든 트럭을 순회하면서 다 넣으면 반복문을 종료합니다.
- 리터레이션당 시간을 계속 증가시킵니다.
- 덱큐에 있는 모든 값을 pop 시키면서 시간을 증가시킵니다.
💻 코드
파이썬
# <https://school.programmers.co.kr/learn/courses/30/lessons/42583?language=python3>
from collections import deque
def solution(bridge_length, weight, truck_weights):
current_cnt = 0
current_weight = 0
answer = 0
q = deque()
for _ in range(bridge_length):
q.append(0)
i = 0
while len(truck_weights) > i:
truck = q.pop()
if truck > 0:
current_cnt -= 1
current_weight -= truck
current_truck = truck_weights[i]
# 트럭이 다리에 올라갈 수 있다면
if weight >= current_truck + current_weight and bridge_length >= current_cnt + 1:
current_cnt += 1
current_weight += current_truck
q.appendleft(current_truck)
else:
q.appendleft(0)
i -= 1
i += 1
answer += 1
while q:
q.pop()
answer += 1
return answer
C++
#include <string>
#include <vector>
#include <deque>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
int currentWeight = 0;
int currentCnt = 0;
deque<int> q;
for(int i = 0; i < bridge_length; i ++)
{
q.push_back(0);
}
for(int i = 0; i < truck_weights.size(); i ++)
{
// 마지막 deque에서 트럭을 꺼낸다. 트럭이 있다면 무게와 개수를 줄이고 없다면 무시
int truck = q.back();
q.pop_back();
// 트럭이 존재한다면
if(truck > 0) {
currentWeight -= truck;
currentCnt -= 1;
}
// 주어진 조건에 만족하면 트럭을 추가한다.
int new_truck = truck_weights[i];
if(weight >= currentWeight + new_truck && bridge_length >= currentCnt + 1) {
q.push_front(new_truck);
currentWeight += new_truck;
currentCnt += 1;
}
// 넣을 수 없는 트럭이 없다면 다음 리터레이션에서 트럭을 넣을 수 있게 i를 증감한다.
else {
q.push_front(0);
i -= 1;
}
answer += 1;
}
while(!q.empty())
{
q.pop_back();
answer += 1;
}
return answer;
}
Java
package Algorithm.java.다리를지나는트럭;
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
int currentWeight = 0;
int currentCnt = 0;
// 다리에 트럭의 정보를 담는다.
Deque<Integer> bridge = new ArrayDeque<>();
for(int i = 0; i < bridge_length; i ++)
{
bridge.add(0);
}
// 트럭을 순회하면서 다리에 넣는다.
for(int i = 0; i < truck_weights.length; i++)
{
// 끝에 트럭이 존재한다면 트럭을 도착시킨다.
Integer truck = bridge.pollLast();
if(truck > 0)
{
currentWeight -= truck;
currentCnt -= 1;
}
// 현재 트럭을 넣을 수 있다면 트럭을 넣는다.
if(weight >= currentWeight + truck_weights[i] && bridge_length >= currentCnt + 1) {
bridge.addFirst(truck_weights[i]);
currentWeight += truck_weights[i];
currentCnt += 1;
}
else {
// 다음 리터레이션에서 다시 트럭을 넣어야하기때문에 Dummy를 넣고 i를 증감한다.
bridge.addFirst(0);
i--;
}
answer += 1;
}
// 남은 트럭을 꺼낸다.
while(!bridge.isEmpty())
{
bridge.pollLast();
answer += 1;
}
return answer;
}
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 전화번호 목록 (0) | 2024.04.30 |
---|---|
[프로그래머스] 폰켓몬 (0) | 2024.04.30 |
[프로그래머스] H-Index (0) | 2024.04.15 |
[프로그래머스] 도둑질 (0) | 2024.04.14 |
[프로그래머스] 이중우선순위큐 (0) | 2024.04.13 |