본문 바로가기
CS/알고리즘

[이코테] 정렬 - 성적이 낮은 순서로 학생 출력하기

by 데브겸 2023. 2. 9.

아 뭔가 쉬운 것 같은데 못 풀어서 속상했다

 

1. 내 풀이

우선 아래 풀이는 틀렸다. 점수가 중복되는 인원이 존재할 경우 그 인원을 중복해서 출력하기 때문

n = int(input())
data = {}

for i in range(n):
    tmp = input().split()
    data[tmp[0]] = int(tmp[1])

score_chart = sorted(list(data.values()))

for i in range(len(score_chart)):
  val = score_chart[i]
  for k, v in data.items():
    if v == val:
      print(k, end= ' ')

 

1-1. 풀이 도중 생각

1) sorted에 key를 사용하는 방법을 찾아보려 했으나,,, 사용 방법을 몰라 풀지 못했다

2) dict 자체를 sort할 수는 없을 것 같고, 점수가 동일한 학생들은 자유롭게 출력해도 되니까 점수만 있는 리스트를 만들어서 sort하고, 그 점수에 맞는 학생들을 추출해야지

 

2. 정답

정답에는 sorted에 key를 이용하는 방법을 활용했다.

n = int(input())

data = []
for i in range(n):
	input_data = input().split()
    data.append((input_data[0], int(input_data[1])))

data = sorted(data, key=lambda student:student[1])

for student in data:
	print(student[0], end=' ')

 

3. 새로 알게 된 것 or 새삼 깨닫게 된 것

1) sort, sorted에서 key 사용방법: labda를 이용하여 어떤 요소를 활용할 것인지 설정할 수 있다

  - '-'를 붙이면 현재 정렬차순과 반대로 정렬한다

  - 다중 조건을 설정할 경우 조건의 순서대로 넣고 ()로 묶어준다

# (이름, 학번, 점수)
data = [("홍길동", 1, 100) , ("이순신", 2, 50), ("심사임당", 3, 50),("이성계", 4, 75)]

# 점수를 기준으로 오름차순 정렬, 같은 점수라면 학번을 내림차순으로 정렬
print(sorted(data, key = lambda x: (x[2], -x[1])))

>>> [("심사임당", 3, 50), ("이순신", 2, 50),("이성계", 4, 75), ("홍길동", 1, 100)]

 

2) 딕셔너리에서 value로 key 찾는 법

data = {"홍길동":100, "이순신":75, "심사임당":75}

# 1번 방법: .items() 사용하기
[k for k, v in data.items() if v == 100]
>>> ["홍길동"]

# 2번 방법: key-value를 뒤집어 저장해놓고 찾기 (이게 좀 더 효율적)
r_data = {v:k for k, v in data.items()}
r_data.get(100)
>>> "홍길동"