문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/181851
내 풀이
def solution(rank, attendance):
answer = 0
# rank와 출석여부로 딕셔너리 만들고 순위에 따라 정렬
dic = dict(zip(rank, attendance))
dic = dict(sorted(dic.items()))
# 출석여부가 True인 학생의 순위 st 배열에 새롭게 저장
st = [k for k, v in dic.items() if v is True]
# 학생 순위를 통해 몇 번째 학생인지 찾아냄. 그 정보를 a, b, c에 저장
a, b, c = rank.index(st[0]), rank.index(st[1]), rank.index(st[2])
answer = 10000 * a + 100 * b + c
return answer
0단계이지만 조금 어려웠던 문제였다.
난 아직 딕셔너리를 활용하는 것이 조금 어렵다.
문법을 기억하기 어려워서 검색을 통해서 풀었던 문제다.
내가 한 풀이는..
먼저, rank와 출석여부를 딕셔너리로 만들고, 순위에 따라 정렬한다.
이때, 출석여부가 True인 학생의 순위만 st 배열에 새롭게 저장하고,
그 순위를 이용해 몇 번째 학생인지 찾아낸다.
* index() 함수를 통해 인덱스를 직접 들어가는 것은 시간복잡도가 늘어난다고 하니, 사용을 자제해봐야겠다!
다른 사람 풀이
def solution(rank, attendance):
answer = []
for i in range(len(rank)):
if attendance[i]:
answer.append([rank[i], i]) # rank[i]는 등수, i는 몇 번째 학생인지
answer.sort()
return answer[0][1]*10000+answer[1][1]*100+answer[2][1]
다른 사람들의 풀이를 봤더니 딕셔너리를 안풀고 풀었다.
제공해준 값이 True or False이기 때문인듯하다!
먼저, rank의 길이만큼 for문을 순회하며,
출석여부가 True인 학생만 뽑아내어,
학생의 등수와 몇 번째 학생인지의 정보를 answer 배열에 넣는다.
그 후, 등수에 따라 answer 배열을 정렬하고,
1~3위 학생이 몇 번째 학생인지에 관한 정보를 각각 a, b, c에 담는다.
딕셔너리에 관한 개념
딕셔너리 생성
dic = dict(zip(rank, attendance))
dic = dict(sorted(dic.items()))
딕셔너리는 원래 간단하게, 아래처럼 중괄호를 통해 생성할 수 있다.
lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
lux
# {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
혹은 dict 함수를 통해 딕셔너리를 만들 수 있는데..
- 딕셔너리 = dict(키1=값1, 키2=값2)
- 딕셔너리 = dict(zip([키1, 키2], [값1, 값2]))
- 딕셔너리 = dict([(키1, 값1), (키2, 값2)])
- 딕셔너리 = dict({키1: 값1, 키2: 값2}
##### 1번 dict 함수를 통해 키=값 형식으로 딕셔너리를 만듦
# 이때, 키에 ''(작은 따옴표)나 ""(큰 따옴표)를 사용하지 않아야 한다.
dic1 = dict(a=1, b=2, c=3, d=4)
##### 2번 dict에서 zip함수 이용
dic2 = dict(zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4])) # zip 함수로
##### 3번 dict 안에 리스트로 매개변수 제공
dic3 = dict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
##### 4번 dict 안에 중괄호로 딕셔너리 생성
dic4 = dict({'a': 1, 'b': 2, 'c': 3, 'd': 4})
# dic1~4 모두
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
딕셔너리 정렬
딕셔너리는 순서가 정해져있지 않기 때문에, 정렬하고 싶은 기준을 명시해줘야만 한다.
Key를 기준으로 오름차순 & 내림차순 정렬
# 오름차순 정렬 예시
my_dict = {'b': 2, 'a': 1, 'd': 4, 'c': 3}
sorted_dict_1 = dict(sorted(my_dict.items(), key=lambda x: x[0]))
# 또는
sorted_dict_2 = dict(sorted(my_dict.items()))
# Key 기준으로 오름차순 정렬한 결과
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
###########
# 내림차순 정렬 예시
my_dict = {'b': 2, 'a': 1, 'd': 4, 'c': 3}
sorted_dict = dict(sorted(my_dict.items(), key=lambda x: x[0], reverse=True))
# Key 기준으로 내림차순 정렬한 결과
# {'d': 4, 'c': 3, 'b': 2, 'a': 1}
딕셔너리에서 sorted() 함수를 사용하면, 자동으로 key를 이용해 정렬을 해준다.
혹은 lambda 함수를 이용해 정렬하고 싶은 기준을 명시할 수도 있다.
오름차순에 비해 내림차순은 reverse=True를 통해 정렬할 수 있다.
my_dict.items()를 적용하면 딕셔너리의 값을 (Key, Value) 형태의 튜플로 반환을 해준다.
Value를 기준으로 오름차순 & 내림차순 정렬
# 오름차순 정렬 예시
my_dict = {'b': 2, 'a': 1, 'd': 4, 'c': 3}
sorted_dict = dict(sorted(my_dict.items(), key=lambda x: x[1]))
# Value 기준으로 오름차순 정렬한 결과
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
###########
# 내림차순 정렬 예시
my_dict = {'b': 2, 'a': 1, 'd': 4, 'c': 3}
sorted_dict = dict(sorted(my_dict.items(), key=lambda x: x[1], reverse=True))
# Value 기준으로 내림차순 정렬한 결과
# {'d': 4, 'c': 3, 'b': 2, 'a': 1}
key는 x[0]이지만, value는 x[1]을 통해 접근할 수 있다.
딕셔너리 순회
[k for k, v in dic.items() if v is True]
딕셔너리 순회에는 총 4가지 방법이 있다.
1. key를 통해 키에 직접 접근하기
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for key in dic:
print(key)
# 출력값
# a
# b
# c
# d
2. .items()를 통해 키와 값에 접근하기
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for key, value in dic.items():
print(key, value)
# 출력값
# a 1
# b 2
# c 3
# d 4
3. .keys()를 통해 키에 접근하기
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for key in dic.keys():
print(key)
# 출력값
# a
# b
# c
# d
4. .values()를 통해 값에 접근하기
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for value in dic.values():
print(value)
# 출력값
# 1
# 2
# 3
# 4
정리하자면...
키 접근 -> 딕셔너리 자체(dic), dic.keys()
값 접근 -> dic.values()
키, 값 접근 -> dic.items()
끄읏-!
'코딩테스트 > PYTHON' 카테고리의 다른 글
[프로그래머스][PYTHON] Lv. 0 수열과 구간 쿼리 1 (0) | 2024.02.03 |
---|---|
[프로그래머스][PYTHON] Lv. 0 조건에 맞게 수열 변환하기 3 ( + map과 lambda) (1) | 2024.02.02 |
[프로그래머스][PYTHON] Lv. 0 가까운 1 찾기 (0) | 2024.01.30 |
[프로그래머스][PYTHON] Lv. 0 배열 만들기 1 (0) | 2024.01.30 |
[프로그래머스][PYTHON] Lv. 1 달리기 경주 (1) | 2024.01.30 |