[프로그래머스] 09/14 (3)

2021. 9. 14. 16:55·코딩테스트/프로그래머스[Python]

[부족한 금액 계산하기]-[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
'코딩테스트/프로그래머스[Python]' 카테고리의 다른 글
  • [프로그래머스] 09/16 (3)
  • [프로그래머스] 09/15 (6)
  • [프로그래머스] 09/13 (3)
  • [프로그래머스] 09/09 (3)
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    그리디
    이분탐색
    나동빈
    파이썬
    이코테
    DFS
    백준
    BFS
    이것이취업을위한코딩테스트다
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바