[부족한 금액 계산하기]-[1주차 위클리 테스트]
My answer
def solution(price, money, count):
sum=0
for i in range(count):
sum+=price*(i+1)
if(money<sum):
return -(money-sum)
else:
return 0
Another answer
def solution(price, money, count):
# 총 이용금액은 (price)+(2*price)+ ··· +(n*price) 이다.
# price(1+····+n)로 묶고, price * ∑k 이므로 price*(n)(n+1)/2로 계산.
return max(0,price*(count+1)*count//2-money)
[상호평가]-[2주차 위클리 테스트]
My answer
def solution(scores):
answer = ''
avg=[0]*len(scores)
# score=[[0]*len(scores)]*len(scores)
score=[[ 0 for i in scores] for j in scores]
for i in range(len(scores)):
for j in range(len(scores)):
score[i][j]=scores[j][i]
for i in range(len(score)):
total=sum(score[i])
if((score[i][i]==max(score[i]) or score[i][i]==min(score[i])) and score[i].count(score[i][i])==1):
print("here")
avg[i]=(total-score[i][i])/(len(score)-1)
else:
avg[i]=total/len(score)
for i in range(len(avg)):
if(avg[i]>=90):
answer+='A'
elif(avg[i]>=80):
answer+='B'
elif(avg[i]>=70):
answer+='C'
elif(avg[i]>=50):
answer+='D'
else:
answer+='F'
return answer
Another answer
def solution(scores) :
avgs=[]
score=[ [i[j] for i in scores] for j in range(len(scores))]
# 위의 list comprehension을 풀면 아래 반복문과 같다.
# for j in range(len(scores)):
# for i in scores:
for idx,i in enumerate(score) :
avg=sum(i) ; length=len(i)
if i[idx] == max(i) or i[idx] == min(i) :
if i.count(i[idx]) == 1 :
avg-=i[idx] ; length-=1
avgs.append(avg/length)
# 여기 return문의 join안에 있는 and는 아직 이해가 안간다..
return "".join([ avg>=90 and "A" or avg>=80 and "B" or avg>=70 and "C" or avg>=50 and "D" or "F" for avg in avgs ])
[직업군 추천하기]-[4주차 위클리 테스트]
My answer
def solution(table, languages, preference):
answer = ''
tmp=[]
dic={}
score, scores=0,[]
for i in range(len(table)):
# tmp라는 리스트에 table의 문자열을 끊어서 넣어줌
tmp.append(table[i].split(" "))
for j in range(len(languages)):
# 바로 index함수를 썻을때 없는 값을 검색하면 오류가 뜨기때문에
# in함수로 걸러준다.
if(languages[j] in tmp[i]):
index=tmp[i].index(languages[j])
score+=(len(tmp[i])-index)*(preference[j])
# scores 배열에 점수들을 넣어준다
scores.append(score)
score=0
# 딕셔너리를 이용하여 각 직업군과 점수를 매칭해준다.
for i in range(5):
dic[tmp[i][0]]= scores[i]
# 딕셔너리를 직업군인 키값을 기준으로 정렬해준다. dic.items()
dic=sorted(dic.items())
# 정렬된 딕셔너리에서 밸류값들만 뽑아준다
tmp2=[i[1] for i in dic]
# 밸류값 모음에서 가장 큰 점수를 가진 밸류의 인덱스를 가져온다
index=tmp2.index(max(scores))
# 해당 인덱스의 키값=직업을 가져온다
answer=dic[index][0]
return answer
더보기
위의 코드를 짜면서 헤맸던 이유
1. 리스트에서 .find() 함수는 안써진다.
-> 리스트에서 .index()함수를 이용하려 했으나 없는 값을 찾으면 오류가 떴다.
-> 리스트로 바꾸기전 문자열에서 find로 걸러주고 리스트로 바꾼뒤 index함수를 이용해서 풀었었는데, javascript java등과 같이 똑같지 않지만 공통된 문자열이 있는경우 걸러주지 못한다는 오류를 발견했다.
-> 리스트로 바꾸고 in함수를 써서 걸러주고 index함수를 썻다.
2. 해당 점수들을 구했고, 각 직업군 리스트도 만들었는데, 중복 점수의 경우때문에 정렬을 해줘야하는데 직업과 해당점수 두개의 리스트를 동시에 정렬하는 방법을 몰랐다.
-> 딕셔너리를 검색해서 사용하였다. 먼저 직업과 점수를 딕셔너리로 만들고, 딕셔너리를 키값을 기준으로 정렬한후 밸류값을 따로 뽑아서 인덱스를 찾고 해당하는 인덱스의 키값을 구했다. 여기서 왜 바로 해당 밸류값의 키값을 구하지 않고 밸류값의 인덱스를 구하고 그 인덱스의 키값을 구했냐면 정렬하면서 sorted를 써서 딕셔너리가 리스트로 변환되면서 딕셔너리의 기능을 사용할 수 없었다.
Another answer
def solution(table, languages, preference):
score = {}
for t in table:
for lang, pref in zip(languages, preference):
if lang in t.split():
score[t.split()[0]] = score.get(t.split()[0], 0) + (6 - t.split().index(lang)) * pref
return sorted(score.items(), key = lambda item: [-item[1], item[0]])[0][0]
-----------------------------------------------------------------------------------
def solution(table, languages, preference):
score = []
for tbl in table:
s=0
a = tbl.split()
for lng,p in zip(languages,preference):
if lng in a:
s += (len(a) - a.index(lng))*p
score.append([a[0],s])
# lambda는 함수를 간결하게 만드는 것이다.
# 아래 함수는 우선 -x[1] 즉 점수를 기준으로 내림차순으로 정렬을 하고
# 이후 x[0]을 기준으로 한번더 오름차순 정렬을 해주는 것이다.
# 이유는 우선 점수를 기준으로 내림차순을 하고 중복된 경우일 때를 대비하여 이름으로 정렬
return sorted(score,key=lambda x:(-x[1],x[0]))[0][0]
참고자료
딕셔너리
https://wikidocs.net/16
list comprehension
https://wikidocs.net/22
728x90
반응형
'코딩테스트 > 프로그래머스[Python]' 카테고리의 다른 글
[프로그래머스] 09/16 (3) (0) | 2021.09.16 |
---|---|
[프로그래머스] 09/15 (6) (0) | 2021.09.15 |
[프로그래머스] 09/13 (3) (0) | 2021.09.13 |
[프로그래머스] 09/09 (3) (0) | 2021.09.09 |
[프로그래머스] 09/08 (6) (0) | 2021.09.08 |