데이터 코딩랩
백준 10825 파이썬 국영수 (enumerate, index 출력방식) 본문
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가지 방식 비교
'Algorithm > 백준' 카테고리의 다른 글
백준 11047 파이썬 동전0 (1) | 2025.04.17 |
---|---|
백준 1181 파이썬 단어 정렬 (0) | 2025.04.17 |
백준 10814 파이썬 나이순 정렬 (0) | 2025.04.17 |
백준 1427 파이썬 소트인사이드 (0) | 2025.04.16 |
백준 2750 파이썬 수 정렬하기 (0) | 2025.04.16 |