코딩 테스트/Level 2
5. 프린터
컴닥
2020. 7. 20. 19:47
반응형
https://programmers.co.kr/learn/courses/30/lessons/42587
파이썬(Python)
코딩량을 줄이기 위해 pop(0)을 썼는데
리스트가 길거나 빈번한 pop(0)이 필요할 땐 collections.deque를 사용하는 게 좋겠습니다.
def solution(priorities, location):
answer = 0
while priorities:
if priorities[0] >= max(priorities): # 반복문 내의 max 함수는 속도에 영향을 많이 줍니다.
answer += 1
priorities.pop(0)
location -= 1
if location == -1:
return answer
else:
priorities.append(priorities.pop(0))
location -= 1
if location == -1:
location = len(priorities) - 1
return answer
'''
테스트 2 〉 통과 (0.59ms, 10.7MB)
테스트 8 〉 통과 (0.39ms, 10.7MB)
테스트 11 〉 통과 (0.33ms, 10.7MB)
테스트 17 〉 통과 (0.47ms, 10.6MB)
'''
이 경우엔 바꾼 뒤 시간이 더 늘었습니다. ㅠ,.ㅠ
from collections import deque
def solution(priorities, location):
priorities = deque(priorities)
answer = 0
while priorities:
if priorities[0] >= max(priorities):
answer += 1
priorities.popleft()
location -= 1
if location == -1:
return answer
else:
priorities.append(priorities.popleft())
location -= 1
if location == -1:
location = len(priorities) - 1
return answer
'''
테스트 2 〉 통과 (0.67ms, 10.7MB)
테스트 8 〉 통과 (0.45ms, 10.7MB)
테스트 11 〉 통과 (0.34ms, 10.7MB)
테스트 17 〉 통과 (0.58ms, 10.7MB)
'''
반복문 내의 max 함수의 회수를 줄여보겠습니다. 만족스럽네요.
def solution(priorities, location):
answer = 0
max_priority = max(priorities)
while priorities:
if priorities[0] >= max_priority:
answer += 1
priorities.pop(0)
location -= 1
if location == -1:
return answer
max_priority = max(priorities)
else:
priorities.append(priorities.pop(0))
location -= 1
if location == -1:
location = len(priorities) - 1
return answer
'''
테스트 2 〉 통과 (0.22ms, 10.7MB)
테스트 8 〉 통과 (0.16ms, 10.7MB)
테스트 11 〉 통과 (0.15ms, 10.8MB)
테스트 17 〉 통과 (0.16ms, 10.7MB)
'''
자바 스크립트(Java Script)
function solution(priorities, location) {
let count = 0
while (priorities.length != 1) {
let doc = priorities.shift()
location--
if (doc >= priorities.reduce((x, y) => y > x ? y : x)) {
count++
if (location == -1) return count
} else {
if (location == -1) location = priorities.length
priorities.push(doc)
}
}
return ++count
}
자바(Java)
import java.util.LinkedList;
class Solution {
public int solution(int[] priorities, int location) {
LinkedList<Integer> que = new LinkedList<>();
for (int i = 0; i < priorities.length; i++) que.add(priorities[i]);
var count = 0;
while (!que.isEmpty()) {
int temp = que.poll();
int max = temp;
location--;
for (int each : que) if (each > max) max = each;
if (temp == max) {
count++;
} else {
if (location == -1) location = que.size();
que.offer(temp);
}
if (location == -1) return count;
}
return -1;
}
}
고(Go, Golang)
func solution(priorities []int, location int) (count int) {
for len(priorities) > 0 {
if priorities[0] >= max(priorities[1:]) {
count++
if location == 0 {
return
}
priorities = priorities[1:]
location--
} else {
priorities = append(priorities[1:], priorities[0])
if location == 0 {
location = len(priorities) - 1
} else {
location--
}
}
}
return
}
func max(arr []int) (max int) {
for i, v := range arr {
if i == 0 || v > max {
max = v
}
}
return
}
반응형