ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 프린터 프로그래머스 코딩테스트
    개발/Swift 2022. 1. 6. 16:05

    내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.

    현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

    제한사항

    • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
    • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
    • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

     

     

    문제 해결

    반복문을 활용해 아래 과정들을 요청문서가 인쇄 될때까지 반복할것이다.

    배열의 가장앞 (priorities[0]) 체크후 그것 보다 더 큰게 있으면 뒤로보냄

    하지만 만약 더 큰게 없다면? 그 값을 배열에서 제거후 카운트(리턴값)를 1 증가해야한다.

    그리고 만약 이때 location 값이 0이면 지금 인쇄된 작업이 요청된 작업이므로

    반복문을 break하여 결과값을 리턴 하면 된다.

     

    그리고 이 두가지 경우 (출력 or 뒤로 빠꾸) location 값을 계속 바꿔줘야한다.

    앞의 작업이 빠지면서(빠지던 뒤로가던) 요청작업의 순서도 바뀌기 떄문이다.

    앞의 작업이 빠지거나 뒤로갈때 location의 값을 -1 해줘야한다 (앞으로 이동)

    만약 앞의 작업이 요청작업일경우 (location = 0 ) location 의값을 가장 배열의 마지막 위치로 수정해줘야한다.

     

    count은 우리가 알아내야할 값이고

    isDone은 요청작업이 출력 된 경우 true로 변경된다.

    그리고 이 조건을 사용해 while 반복문을 실행한다.

    즉 isDone = true인경우 반복문을 종료 하고 값이 리턴된다.

    func solution(_ priorities:[Int], _ location:Int) -> Int {
        var priorities = priorities
        var isDone = false
        var location = location
        var count = 0
    	while !isDone {
    	
    	}
    
    	return count
    }
    

     

     

     

     

    0번쨰 값과 그외 배열 내의 모든 값을 비교할것이다.

    그러므로 for문을 사용했고

    만약 그것보다 큰 값이 존재 하는경우 (출력 안함 )

    해당 값을 맨뒤로 이동시키고

    지금 보고있는 값이 요청문서인지 아닌지에따라

    location 값을 다르게 변경시킨다.

    그리고 break를 활용해 더이상 진행시키지 않도록 한다.

    while !isDone {
      var isBiggest = true
    	for index in 1..<priorities.count {
    	      if(priorities[index] > priorities[0]){
    	          let value = priorities.remove(at: 0)
    	          priorities.append(value)
    	          if(location == 0){
    	              location = priorities.count - 1
    	          }else{
    	              location -= 1
    	          }
    	          isBiggest = false
    	          break
    	      }
    	  }
    }
    

     

    isBiggest는 지금 비교하려는 0번째 값이 가장 큰경우를 의미한다.

    즉 출력 하는 경우이다.

    해당 조건은 다음 작업에 필요하다.

    if(isBiggest) {
            //방금제거한게 요청문서면 끝 리턴
            if(location == 0) {
                isDone = true
            }
            count += 1
            priorities.remove(at: 0)
            location -= 1
           
        }
    

    isBiggest 가 참이라면 지금 0번쨰 문서가 출력된다는 의미이다.

    그러므로 count를 1 증가 시키고 배열에서 해당값을 삭제한다.

    배열의 값이 줄었으니 당연히 location도 1이 줄어야한다.

     

    하지만 방금 출력된 문서가 요청 작업인경우 (location == 0)

    isDone 을 true로 바꿔 while 반복문을 탈출한다.

     

     

    전체 코드

    func solution(_ priorities:[Int], _ location:Int) -> Int {
        var priorities = priorities
        var isDone = false
        var location = location
        var count = 0
    
        while !isDone {
            var isBiggest = true
            
            for index in 1..<priorities.count {
                if(priorities[index] > priorities[0]){
                    let value = priorities.remove(at: 0)
                    priorities.append(value)
                    if(location == 0){
                        location = priorities.count - 1
                    }else{
                        location -= 1
                    }
                    isBiggest = false
                    break
                }
            }
    
            //isBiggest가 true = 0번쨰가 제일 중요한문서임 -> 리턴
            if(isBiggest) {
                //방금제거한게 요청문서면 끝 리턴
                if(location == 0) {
                    isDone = true
                }
                count += 1
                priorities.remove(at: 0)
                location -= 1
            }
            
        }
        return count
    }
    

    댓글

Designed by Tistory.