컴닥 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
}

 

반응형