데이터 코딩랩

백준 10825 파이썬 국영수 (enumerate, index 출력방식) 본문

Algorithm/백준

백준 10825 파이썬 국영수 (enumerate, index 출력방식)

researcher 틴틴 2025. 4. 17. 12:38

https://www.acmicpc.net/problem/10825

 

 

📄 실전 문제 접근 체크리스트

1초, 256MB

 

1단계: 문제 파악

■ 문제 요구사항 한 줄로 정리    

:  N명, 이름 국어 영어 수학 점수, 

 

  예제 입력/출력 확인

: 입력  첫 째줄 : 학생 수 N (N<=100,000) , 둘째줄~N번째 줄: 공백으로 구분 된 이름, 국어, 영어, 수학 점수/ 점수(1<=점수<=100)

  이름<10

: 출력 → 한명씩 출력

 

★ 내가 놓친 부분

입력 직후 정수형 변환 필요 → int(kor), int(eng), int(math)

(이 부분이 어려웠음)


   

2단계: 입력 범위 → 시간복잡도 판단
입력 크기 (N) 적정 알고리즘 복잡도

 

 

 

  입력 크기 체크 후 -> 내가 쓸 수 있는 알고리즘 선별

: 주어질 숫자   N (N<=100,000)  

: 정렬 알고리즘 O(N log N) 

: N은 최대 100,000

 

 

 

★ 내가 놓친 부분  



3단계: 알고리즘 유형 선택
  정렬

 

★ 내가 놓친 부분

 


4단계: 자료구조 & 흐름 정리
  어떤 자료구조를 쓸까?
: 정렬, 4가지 기준 
  함수 나눌 필요 있는가?  

: 없음
  조건 분기 많을까? 시뮬레이션 필요한가?  

: 없음
  흐름

:  input -> 국어점수 높은게 먼저(내림차순) -> 영어점수 낮은게 먼저(오름차순) -> 수학점수가 높은거부터(내림차순)-> 이름은 사전 순(오름차순)

아스키 코드에서 대문자가 소문자보다 먼저나옴

 

정렬의 기본값은 오름차순임

 

★ 내가 놓친 부분

 

 

✔️ 흐름 요약



5단계: 구현 전 체크 
  입출력 방식은?

: 입력 받을때 한 줄씩 받고, 출력도 한 줄씩

  예외 상황은 어떤 게 있을까? (빈 입력, 중복 등)

: 수가 중복되어도 정렬에는 영향이 없는가?
  시간 초과 가능성은?
: 없는듯

 

★ 내가 놓친 부분

✔️ 공백 제거 (.strip()) 꼭 필요!
→ sys.stdin.readline() 쓴다면 특히 중요

✔️ set 사용 시 순서 보장 안 됨 → 반드시 정렬 필요

 


6단계: 제출 전 체크리스트
  예제 출력 전부 통과했는가? 
  문제 조건 중 빠뜨린 거 없는가?
  반복문/조건문 이상한 부분 없는가?
  시간/메모리 초과 가능성 없나?

 

★ 내가 놓친 부분

 

 

 

내 코드

import sys
input = sys.stdin.readline

N = int(input())

data=[]
for i in range(N):
    A = name, kor, eng, math = input().strip().split()
    data.append([name, int(kor), int(eng), int(math)])


#print(data)



sorted_name = sorted(data, key=lambda x : (-x[1],x[2],-x[3],x))

#print(sorted_name[2][0])

for i in range(len(sorted_name)):
    print(sorted_name[i][0])

 

 

✅ 보완 포인트 3가지

 

1. ✅ x 대신 x[0] 사용 (이름 정렬 기준 오류 방지)

sorted_name = sorted(data, key=lambda x : (-x[1], x[2], -x[3], x[0]))

 

⭐ 현재 코드의 x → 전체 리스트 (['name', kor, eng, math]) 자체를 정렬 키로 써서 예상치 못한 비교 방식이 발생할 수 있음

→  정확히는 이름 정렬은 x[0]으로 명시

 

2. ✅ 변수 A는 안 써도 되는 중복

A = name, kor, eng, math = ...

 

이렇게 쓰면 A는 그냥 튜플 (name, kor, eng, math)이 될 뿐임

아예 생략해버릴 것

 

→ 깔끔하게

name, kor, eng, math = input().strip().split()

 

 

3. ✅ 출력 루프 더 간결하게

for student in sorted_name:
    print(student[0])

 

이건 어떻게 구동되는가?

- sorted_name은 학생 정보가 담긴 리스트

- 각 학생은 이런 구조야:
   ['이름', 국어, 영어, 수학]
   예: ['kim', 90, 85, 95]

- 그래서 for student in sorted_name은
    ➜ 리스트 안의 각 학생 리스트를 student라는 변수로 하나씩 꺼내는 거야!

 

예시로 시뮬레이션

sorted_name = [
  ['kim', 90, 80, 90],
  ['lee', 85, 90, 70],
  ['park', 90, 80, 85]
]

 

for student in sorted_name:
    print(student[0])

 

내부동작

 

결과 출력

kim
lee
park

 

 

참고할 만한 또다른 접근 방식

 

✏️ enumerate() 방식

 
for idx, student in enumerate(sorted_name):
    print(f"{idx}: {student[0]}")

 

 

출력예시:

0: kim
1: lee
2: park

 

✏️ 인덱스 접근 방식 (range + index)

for i in range(len(sorted_name)):
    print(sorted_name[i][0])

 

 

🔁 3가지 방식 비교