코딩 테스트/백준

[Python] 백준 10431 줄세우기

위시리 2025. 1. 22. 22:34

 

문제 분석

  • 키 순서로 번호를 부여
  • 반 아이들은 항상 20명
  • 같은 키 x
  • 아무 한 명을 맨 앞에 세우고, 그 다음부터는 한 명씩 맨 뒤에 서면서 다음 과정을 거친다.
  • 자기 앞에 자기보다 큰 학생이 없다면 그 자리에 서고 끝
  • 자기 앞에 본인보다 큰 학생이 존재 한다면 그 중 가장 앞에 있는 학생 바로 앞에 선다.

 

정답 코드

1차 - 실패..

import sys
input = sys.stdin.readline

p = int(input())
stu = []
for _ in range(p):
    stu.append(list(map(int, input().split())))

for i in range(p):
    before = stu[i]
    tc = before[0]
    students = before[2:]
    after = sorted(before[1:])

    line = []
    line.append(before[1])
    # after = sorted(students)
    cnt = 0

    while (line != after) :
        now = students[0]
        del students[0]
        highest = line[-1]
        if line[-1] < now : # 앞에 키 큰 학생 x
            line.append(now)
        else :
            # 나보다 작은 사람들을 찾고
            for j in range(len(line)):
                # 이미 서 있는 줄 중에서 나보다 큰 사람이 있음
                # 그러면 나는 그 사람보다 앞에 서야함
                # 재배열
                if line[j] > now :
                    # 리스트에서 어떻게 뒤로 미루지?
                    # 뒤에 다 빼고 넣고 이어 붙이기
                    tmp = line[j:]
                    del line[j:]
                    line.append(now)
                    line += tmp
                    cnt += 1
                    break
                else :
                    continue
    print(f"{i+1} {cnt}")

 

다른 사람 코드 1

  • 모든 아이들을 순회하면서 현재 아이 뒤에 선 아이 중 현재 아이보다 작은 키가 있다면 바꿔준다.
  • (버블 정렬)
import sys
input = sys.stdin.readline

p = int(input())
for _ in range(p) :
    arr = list(map(int, input().split()))
    cnt = 0

    for i in range(len(arr)-1) :
        for j in range(i+1, len(arr)) : # i의 뒤에 있는 애들과 비교
            if arr[i] > arr[j] :
                arr[i], arr[j] = arr[j], arr[i]
                cnt += 1
    print(arr[0], cnt)