https://school.programmers.co.kr/learn/courses/30/lessons/118666

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

3~4시간 걸림

이유: 파이썬 사용 미숙 + 첫번째 아이디어가 잘못됬음 + 디버깅 테스트 

'''
one =dict  R , T
two =dict  C , F
three = dict  J, M
four =dict  A , N

val값 0으로 초기화
만약 choices가 1~3 이면 왼쪽에, 5~7이면 오른쪽에 choices 점수 할당.
물론 val할당은 survey에 따라 다름. 

사전 dict 4개 탐색 , 두 원소들 중 값이 높은것들 출력. 값이 동일하다면 사전순으로 낮은 문자 출력

'''
points=[3,2,1,0,1,2,3]
one={"R":0, "T": 0}
two={"C":0, "F": 0}
three={"J": 0, "M": 0}
four={"A": 0, "N": 0}
named=["TR","RT","CF","FC","JM","MJ","AN","NA"]
def assign_dict(tar, point, dir):

    answer=""
    global one, two, three, four, named

    if dir==-1: #좌측 dict에 할당
        for x in range(len(named)):
            if named[x] == tar:
                if x == 0 or x== 1:
                   one[named[x][0]] += point
                elif x==2 or x==3:  #CF or FC
                   two[named[x][0]] += point 
                elif x==4 or x==5:  #JM or MJ
                    three[named[x][0]] += point  
                elif x==6 or x==7:  #AN or NA
                     four[named[x][0]] += point

    elif dir== 1:  #오른쪽 dict에 누적 합
        for x in range(len(named)):
            if named[x] == tar:
                if x == 0 or x== 1:
                    one[named[x][1]] += point
                elif x==2 or x==3:  #CF or FC
                    two[named[x][1]] += point
                elif x==4 or x==5:  #JM or MJ
                    three[named[x][1]] += point   
                elif x==6 or x==7:  #AN or NA
                    four[named[x][1]] += point 
def solution(survey, choices):
    answer = ''
    global one, two, three, four, named
   
    #choice 에 해당하는 점수  range 나눠서 0번째 인덱스에 놓을지, 1번째 인덱스에 놓을지 선택.
    # 만약 기존에 할당된 value값보다 작으면 할당 x
    #0번째 인덱스와 첫번째 인덱스의 값 존재 시 큰값으로 answer 에 key 값할당 값이 동일하다면 사전순으로 낮은 문자를 할당.
    for x in range(len(choices)):
        point_idx = choices[x]-1 # point 인덱스
        if point_idx<=2:  #좌측에 할당.
            assign_dict(survey[x], points[point_idx], -1)
        elif point_idx>=4:
            assign_dict(survey[x], points[point_idx], 1)

    nums=[one,two,three,four]
    for y, x in enumerate(nums): # 여러개.  그냥 해봄, enumerate 문법있다는걸 알고 싶었음
        tmp_val=list(x.values())   # key와 value들 리스트 형태로 만들어서 0,1번째 인덱스 비교하기.  값이 큰 경우 할당, 동일값이면 사전적으로 낮은 문자 할당.
        tmp_key=list(x.keys())
        if tmp_val[0]>tmp_val[1]:
            answer+=tmp_key[0]
        elif tmp_val[0]<tmp_val[1]:
            answer+=tmp_key[1]
        else:
            if tmp_key[0]<tmp_key[1]:
                answer+=tmp_key[0]
            else:
                answer+=tmp_key[1]
    return answer

 

제출코드

points=[3,2,1,0,1,2,3]
one={"R":0, "T": 0}
two={"C":0, "F": 0}
three={"J": 0, "M": 0}
four={"A": 0, "N": 0}
named=["TR","RT","CF","FC","JM","MJ","AN","NA"]
def assign_dict(tar, point, dir):

    answer=""
    global one, two, three, four, named

    if dir==-1: #좌측 dict에 할당
        for x in range(len(named)):
            if named[x] == tar:
                if x == 0 or x== 1:
                   one[named[x][0]] += point
                elif x==2 or x==3:  #CF or FC
                   two[named[x][0]] += point 
                elif x==4 or x==5:  #JM or MJ
                    three[named[x][0]] += point  
                elif x==6 or x==7:  #AN or NA
                     four[named[x][0]] += point

    elif dir== 1:  #오른쪽 dict에 누적 합
        for x in range(len(named)):
            if named[x] == tar:
                if x == 0 or x== 1:
                    one[named[x][1]] += point
                elif x==2 or x==3:  #CF or FC
                    two[named[x][1]] += point
                elif x==4 or x==5:  #JM or MJ
                    three[named[x][1]] += point   
                elif x==6 or x==7:  #AN or NA
                    four[named[x][1]] += point 
def solution(survey, choices):
    answer = ''
    global one, two, three, four, named

    for x in range(len(choices)):
        point_idx = choices[x]-1 # point 인덱스
        if point_idx<=2:  #좌측에 할당.
            assign_dict(survey[x], points[point_idx], -1)
        elif point_idx>=4:
            assign_dict(survey[x], points[point_idx], 1)

    nums=[one,two,three,four]
    for y, x in enumerate(nums): # 여러개.  그냥 해봄, enumerate 문법있다는걸 알고 싶었음
        tmp_val=list(x.values())   # key와 value들 리스트 형태로 만들어서 0,1번째 인덱스 비교하기.  값이 큰 경우 할당, 동일값이면 사전적으로 낮은 문자 할당.
        tmp_key=list(x.keys())
        if tmp_val[0]>tmp_val[1]:
            answer+=tmp_key[0]
        elif tmp_val[0]<tmp_val[1]:
            answer+=tmp_key[1]
        else:
            if tmp_key[0]<tmp_key[1]:
                answer+=tmp_key[0]
            else:
                answer+=tmp_key[1]
        
    return answer

 

타인코드 [ 단순하고 가독성 좋음]

def solution(survey, choices):
    scores = {'R':0, 'T':0, 'C':0, 'F':0, 'J':0, 'M':0, 'A':0, 'N':0}
    for i in range(len(survey)):
        choice = choices[i]
        element = survey[i]
        if choice == 1:
            scores[element[0]] += 3
        elif choice == 2:
            scores[element[0]] += 2
        elif choice == 3:
            scores[element[0]] += 1
        elif choice == 4:
            scores[element[0]] += 0
        elif choice == 5:
            scores[element[1]] += 1
        elif choice == 6:
            scores[element[1]] += 2
        else:
            scores[element[1]] += 3
    print(scores)
    answer = ""
    if scores['R'] < scores['T']:
        answer += 'T'
    else:
        answer += 'R'
    if scores['C'] < scores['F']:
        answer += 'F'
    else:
        answer += 'C'
    if scores['J'] < scores['M']:
        answer += 'M'
    else:
        answer += 'J'
    if scores['A'] < scores['N']:
        answer += 'N'
    else:
        answer += 'A'
    return answer

 

 

타인 코드 참조후 내코드

#dict 에 1~4번 key 성격유형, valuee  point 점수 
#choice가 1~3 이면 survey[0] 에 포인트 할당  point[choices[x-1]]
#dict에서 일일이 비교하기. 포인트. 사전정렬.

dict_list={"R":0,"T":0,"C":0,"F":0,"J":0,"M":0,"A":0,"N":0}
point=[3,2,1,0,1,2,3]
def solution(survey, choices):
    answer = ""
    for y,x in enumerate(survey):
        if choices[y]<=3:
            dict_list[x[0]]+=point[choices[y]-1]
        elif choices[y]>=5:
            dict_list[x[1]]+=point[choices[y]-1]
            
    if dict_list["R"]<dict_list["T"]:
        answer+="T"
    else: answer+="R"  #이미 0번째가 사전적으로 낮은 문자이기에, 굳이 같다라는 조건 안에 사전식비교 할 필요없음
    if dict_list["C"]<dict_list["F"]:
        answer+="F"
    else: answer+="C"
    if dict_list["J"]<dict_list["M"]:
        answer+="M"
    else: answer+="J"
    if dict_list["A"]<dict_list["N"]:
        answer+="N"
    else: answer+="A"
    
    return answer

+ Recent posts