Just Fighting

[프로그래머스] 프린터 본문

Algorithm/코딩테스트 연습

[프로그래머스] 프린터

yennle 2022. 3. 21. 23:57
728x90

https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

 

< 문제 설명 >

인쇄 대기목록에 가장 앞에 있는 문서가 우선순위가 가장 높으면 출력하고 그렇지 않으면 목록의 맨 뒤로 보낸다.

내가 요청한 문서가 몇번째로 출력되는지 알고 싶다.

문서의 중요도를 나타내는 배열이 priorities와 내가 요청한 문서의 위치인 location이 주어진다.

 

 

< 문제 이해 >

문서의 우선순위와 문서의 번호를 함께 생각해서 문제를 풀면 될 것이라고 생각했다.

그리고 pop()과 append()를 이용해 배열에서 값을 꺼내고 다시 넣는 것을 이용하면 될 것이라 생각했다.

 

 

< 문제 풀이 >

def solution(priorities, location):
    answer = 0
    loc = [i for i in range(len(priorities))]	# 우선순위를 담은 배열
    
    while len(priorities) > 0:
        if priorities[0] == max(priorities):	# 배열의 가장 큰 값이 가장 앞에 있는 문서라면
            priorities.pop(0)			# 문서 하나를 꺼냄
            answer += 1				# 출력한 문서의 개수 카운트
            if loc.pop(0) == location: break
            
        else:						# 가장 큰 값이 아니라면
            loc.append(loc.pop(0))			# 맨뒤로 보낸다.
            priorities.append(priorities.pop(0))	# 맨뒤로 보낸다.

    return answer

 

 

< 풀이 개선 >

문제를 풀면서 두개의  배열에 똑같은 일을 두 번 하는 것이 뭔가 귀찮았다.

문제를 풀고 다른 사람들의 코드를 보았는데 더 좋은 방법이 있어서 그걸로 다시 풀어보았다.

def solution(priorities, location):
    answer = 0
    loc = [[i,priorities[i]] for i in range(len(priorities))]	# 인덱스 추가
    
    while len(loc) > 0:
        if all(loc[0][1] >= l[1] for l in loc):		# 배열의 첫 값이 가장 큰 값이면
            answer += 1					# 카운트
            if loc.pop(0)[0] == location : break	# 내 문서이면 break
            
        else:						# 큰 값이 아니라면 맨 뒤로
            loc.append(loc.pop(0))

    return answer

인덱스를 추가해 새로운 배열을 만든다.

다른 사람들은 any를 사용했는데 나는 위의 코드와 비슷하게 가기 위해 all을 사용하였다.

코드가 훨씬 깔끔!

 

728x90

'Algorithm > 코딩테스트 연습' 카테고리의 다른 글

[백준] 분산처리  (0) 2022.05.10
[프로그래머스] 디스크 컨트롤러  (0) 2022.03.25
[프로그래머스] 순위  (0) 2022.03.20
[HackerRank] The Coin Change Problem  (0) 2022.03.18
[프로그래머스] 징검다리  (0) 2022.03.11
Comments