본문 바로가기
알고리즘 풀이

[algorithm] 페어 - 프로그래머스: 성격 유형 검사하기

by 째깍단 2023. 5. 18.

답: 

더보기

나의 길쭉한 답...

result = {'R':0, 'T':0, 'F':0, 'C':0, 'J':0, "M":0, "A":0, "N":0}

def solution(survey, choices):
    for i in range(len(survey)):
        a = survey[i][0] # A
        b = survey[i][1] # N

        if choices[i] < 4:
            if choices[i] == 3:
                result[a] += 1
            elif choices[i] == 2:
                result[a] += 2
            elif choices[i] == 1:
                result[a] += 3
        elif choices[i] > 4:
            if choices[i] == 5:
                result[b] += 1
            elif choices[i] == 6:
                result[b] += 2
            elif choices[i] == 7:
                result[b] += 3
        else:
            pass
    
    answer = ''
    if result.get('R') >= result.get('T'):
        answer += 'R'
    else:
        answer += 'T'
    if result.get('C') >= result.get('F'):
        answer += 'C'
    else:
        answer += 'F'
    if result.get('J') >= result.get('M'):
        answer += 'J'
    else:
        answer += 'M'
    if result.get('A') >= result.get('N'):
        answer += 'A'
    else:
        answer += 'N'
    return answer

print(solution(survey,choices))

 

 

 

+ 팀원들의 답은 노션에 기록되어있다

 

코드리뷰 하며 알게된 다른 풀이 방법:

문제를 크게 둘로나누었을때

 

1) result  dict에 값 넣기 : 

 

- choice 부분을 dict로 만들어서 풀면 조금 더 짧고 깔끔한 코드가 될 수 있다

  choice = {1:3, 2:2, 3:1, 4:0, 5:1, 6:2, 7:3}

 

- 혹은 선택지에서 4를 빼서 + -값으로 계산하는 방법도 있음

  ex. "AN", 5 를 입력받았다면,
         5-4 = 1 로  값이 점수와 같은 1이 나오므로 N과 묶어서 점수 표기를 할 수 있음

 

        "AN", 1 를 입력받았다면,
         1-4 = -3 으로    - 1 이 나온다. -1을 곱해주거나 음수일경우 앞의 문자를 선택하는 if문을 주는 방식으로 풀이.

 

 

2)  answer 문자열 만들기 :

 

- for + zip() 사용하여 value값 끼리 비교하여 key값 넣기

 

- for i in range(0,8,2)

  range 세번째 인자로 범위값을 주어 2개씩 묶기

 

list(type.items())[j][1]

 

 이 부분이 어려워서 출력을 부탁드렸음, type은 내 풀이에서의 result dictionary 

 print(list(type.items()))   # [("R": 1), ("T": 0), ...]

 

 

- 비교할 것을 미리 묶어서 제시해주기 

  mbti_match = [('R','T'),('C','F'),('J','M'),('A','N')]

  (1) 이후 for문으로 따로 저장된 dict value값을 가져와 비교 후 answer에 입력

 

  (2) 4에서 빼거나 4를 빼고 value값에 추가한다

       += choice - 4  /   +=  4 - choice

 

 

 

 

 

문제 분석 및 해석

 

문제가 길어서 링크를 첨부한다.

 

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

 

프로그래머스

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

programmers.co.kr

 

 

 

1) 생각한 풀이

 

받은 지표의 문자열을 dict에 append해주며

     => 풀이하며 비교 시의 값이 없는 오류가 있을 것이라 생각되어 미리 초기화값 result dict를 만들었다.

 

choice의 값을 integer로 받아서 해당 key 문자의 value값을 더해주기 

 

더해줄 점수

매우동의/매우 비동의 1 or 7 = 3

동의 비동의 2 or 6 = 2

약간동의 약간비동의 3 or 5 = 1

모르겠음 4 = 0

 

dict의 key로 불러와서 지표끼리의 value값 비교

 

sorted로 문자오름차순 정렬. => 풀이에 필요 없어서 사용하지 않음

 

 

 

# 질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와

# 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수 / [1,2,3,4,5,6,7]중 선택된 값을 가지고 있음

#배열에서 123 선택지가 비동의

 

 

 

2) 찾아본 것

 

  • dict의 value 값 증가시키기
dict[key값] = value

 

 

dict의 key 값을 불러오면 value값이 출력됨을 확인,

+= 으로 바꾸어 값이 더해지는지 확인하였다.

 

practice = {"A":0}

practice['A'] += 2

print(practice)  # {"A":2}

 

 

 

 

  • key 값으로 value값을 가져오는 get() 함수
practice = {"A":0}

print(practice.get('A'))    # 출력 0

 

 

 

 

 

 

 

입력값

- survey

["AN", "CF", "MJ", "RT", "NA"]

["TR", "RT", "TR"]

 

- choices

[5, 3, 2, 7, 5]

[7, 1, 3]

 

 

출력값 

"TCMA"

"RCJA"

 

 

 

 

 

 

과정1.

 

 

survey 와 choice의 길이가 같으므로 for range 문을 활용했다.

이전 알고리즘에서 문자열도 list처럼 활용할 수 있다고 했던 것을 적용해보았다!

 

def solution(survey, choices):
    for i in range(len(survey)):
        a = survey[i][0] # 첫번째 요소의 0번째 값 A
        b = survey[i][1] # N

 

 

 

if문으로 각각의 값을 result dict에 추가하도록 함.

 

def solution(survey, choices):
    for i in range(len(survey)):
        a = survey[i][0] # A
        b = survey[i][1] # N

        if choices[i] < 4:
            if choices[i] == 3:
                result[a] += 1
            ...
        elif choices[i] > 4:
            if choices[i] == 5:
                result[b] += 1
            ...
        else:
            pass
            
            
# result = {'R': 0, 'T': 3, 'F': 0, 'C': 1, 'J': 0, 'M': 2, 'A': 1, 'N': 1}

 

 

이때 실수를 했는데

1) 4보다 큰 수와 4보다 작은 수에 아래 식을 바꾸어 넣었다.

    그래서 각 값이  1만 들어가는 일이 벌어짐,,  #팀원분 도움받음ㅠ

 

2) 그리고 4와 비교한 후 각 선택지를 비교하는 항목에서

     if 5:  를 적었는데, 그냥 5면 True가 되어버려서 여전히 3만 들어갔다.

 

     if choices[i] == 5: 와 같이 비교하도록 다시 적어주었다.

 

 

 

 

 

과정2.

 

R T
C F

J M

A N

 

key 값으로 value값을 가져오는 get() 함수를 사용

 

result.get('R') = 0

이렇게 value값을 출력한다^.^

 

 

 

출력 조건에 값이 같으면 abc, 사전 순서로 출력하도록 되어있어

같거나 클때 >=  해당 문자를 출력할 수 있도록 했다.

 

    answer = ''
    if result.get('R') >= result.get('T'):
        answer += 'R'
    else:
        answer += 'T'
    ...
    return answer

print(solution(survey,choices))

 

 

 


느낀점: 

문제가 복잡했지만 재밌었다

 

코드 풀이를 나누는 시간을 가졌는데 설명을 잘 못해서 횡설수설 하는 자신이 느껴졌다.

이런 것도 많이 풀면서 연습하면 설명도 잘하게 되겠지.

 

다른분들 풀이가 어메이징해서 설명듣는것도 분석하는 것도 신기했다

나도 멋있는 코드 짜고싶다ㅋㅋ