1. 기능개발 lv.2
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
from collections import deque
def solution(progresses, speeds):
# progresses[0]이 배포될 때, 몇 개의 progress가 배포될 것인가
# 우선되는 progress가 완료되어야 연속적으로 배포 가능 -> deque
progresses=deque(progresses)
speeds=deque(speeds)
answer = []
while progresses:
cnt=0 # 연속적으로 배포될 progress
while progresses and progresses[0]>=100: # 전부 pop 된 후에는 index 접근불가하기에 리스트 체크 우선해야함
cnt+=1
progresses.popleft()
speeds.popleft()
for i,s in enumerate(speeds):
progresses[i] += s
if cnt:
answer.append(cnt)
return answer
2. 올바른 괄호 lv.2
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
def solution(s):
# 문자열에서 ()를 지워나가기
# ( 발견하면 어팬드, ) 발견하면 팝
stack=[]
if s[0]==')':
return False
for c in s:
if c=='(':
stack.append(c)
else: # ')'일 때
if stack: #'('짝이 있으면
stack.pop()
else:
return False
if stack:
return False
else:
return True
3. 프로세스 lv.2
운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.
1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.
현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.
제한사항
- priorities의 길이는 1 이상 100 이하입니다.
- priorities의 원소는 1 이상 9 이하의 정수입니다.
- priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
- location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
- priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.
from collections import deque
def solution(priorities, location):
queue = [(i, p) for i,p in enumerate(priorities)]
queue = deque(queue)
answer = 0
while queue:
cur = queue.popleft() # popleft, (i,p) 형태
if any(cur[1] < q[1] for q in queue): # 큐 내 우선순위 최댓값보다 cur의 우선순위가 작은 경우
queue.append(cur)
else:
answer += 1
if cur[0] == location:
return answer
4. 다리를 지나는 트럭 lv.2
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 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 이하입니다.
from collections import deque
def solution(bridge_length, weight, truck_weights):
# 한 트럭당 다리를 지나는 데 걸리는 시간 -> brigdge_length
# 대기 순서대로 지나감
answer = 0
queue = deque(truck_weights)
curB = deque([0] * bridge_length) # 현재 다리 위 상황 bridge_length
curW = 0 # 현재 다리 무게
while curB:
answer += 1
# 트럭 내보내기
if curB[0] != 0:
curW -= curB[0]
curB.popleft()
# 트럭 추가: 무게 체크
if queue:
if weight - curW >= queue[0]: # 트럭 더 올릴 수 있음
curW += queue[0]
curB.append(queue.popleft())
else:
curB.append(0) # 트럭 이동
return answer
5. 주식 가격 lv.2
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.제한사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
prices: [1, 2, 3, 2, 3]
return: [4, 3, 1, 1, 0]
- 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
- 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
- 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
- 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
- 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
from collections import deque
def solution(prices):
answer = []
prices = deque(prices)
while prices:
cur = prices.popleft()
count = 0
for price in prices:
count += 1 # 1초 뒤에 가격이 떨어져도 1초간은 유지한 것으로 봄
if cur > price: # 하락
break
answer.append(count)
return answer
'언어' 카테고리의 다른 글
집계함수 안에 IF문 넣기 (0) | 2024.01.30 |
---|---|
AVG 안에 IF문 넣기 (1) | 2024.01.29 |
13주차 ~ (0) | 2023.12.29 |
10주차 ~ 12주차 (0) | 2023.12.28 |
6주차 ~ 9주차 (0) | 2023.12.27 |