[백준] - 1966 프린터큐 (Python/Javascript)

밀루·2023년 10월 24일
0

BOJ

목록 보기
35/43

문제 링크

풀이

현재 제일 먼저 나와야하는 가장 큰 값을 first로 두고, 제일 앞에 있는 값을 now로 둔 뒤 몇 번째로 인쇄되는지 궁금한 것의 위치인 m을 1 빼주고, first와 now가 같다면 cnt++, 다르다면 arr에 push하고 arr.length만큼 m에 더하는 식으로 구현했다.

JS 코드

let fs = require('fs');

const inputs = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
//const inputs = fs.readFileSync(__dirname+'/ex2.txt').toString().split('\n');

const k = Number(inputs[0]);


for (let i=1; i < k*2; i+=2){
    let [n, m] = inputs[i].split(' ').map(Number);
    let arr = inputs[i+1].split(' ').map(Number);

    if (n === 1 && m === 0) {
        console.log(1);
    }
    else {
        let cnt = 0; //몇번째인지 count
        while (true) {
            let first = Math.max(...arr);
            let now = arr.shift();
            m--;
            if (now === first) { //최대와 현재 맨처음애가 같으면
                cnt+=1;
                if (m < 0) {
                    break;
                }
            }
            else { // 아니면 배열 다시 넣기
                arr.push(now)
                if (m<0){
                    m+=arr.length;
                }
            }
        }
        console.log(cnt);
    }
}

자바스크립트의 Math.max()에 배열을 넣으면 안되고 위와 같이 전개해서 넣어야한다는 걸 새롭게 알게 되었다.

Python 코드

from collections import deque
import sys
n = int(sys.stdin.readline().strip())
for _ in range(n):
    k, m = map(int, sys.stdin.readline().split())
    l1=deque(list(map(int, sys.stdin.readline().strip().split())))

    if k==1 and m==0:
        print(1)
    else:
        cnt=0
        while True:
            first=max(l1)
            now=l1.popleft()
            m-=1
            if now==first:
                cnt+=1
                if m<0:
                    break
            else:
                l1.append(now)
                if m<0:
                    m+=len(l1)
        print(cnt)
profile
이밀루의 도전

0개의 댓글