성격 유형 검사하기 (프로그래머스 Level1)

Soorim Yoon·2022년 9월 7일
0
post-custom-banner

문제

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

간결한 코드

처음 코드보다 간결하게 코드를 구현하였다. 2차원 배열이 아닌 딕셔너리를 사용했으며, 아래 블로그를 참고해 구현했다.
딕셔너리를 사용하니 구현이 훨씬 간단하다. if else문도 최대한 간결하게 작성하였다.

def solution(survey, choices):
    answer = ''
    jipo = {"R":0, "T":0, "C":0, "F":0, "J":0, "M":0, "A":0, "N":0}     # 지표 저장 (딕셔너리 활용)
    
    for i in range(len(survey)):
        left = survey[i][0]
        right = survey[i][1]
        
        if choices[i] - 4 < 0 :        # 왼쪽 지표 선택 (1<=점수<=3)
            jipo[left] += 4-choices[i]
        elif choices[i] - 4 > 0:        # 오른쪽 지표 선택 (5<=점수<=7)
            jipo[right] += choices[i]-4

    answer += "R" if jipo["R"] >= jipo["T"] else "T"
    answer += "C" if jipo["C"] >= jipo["F"] else "F"
    answer += "J" if jipo["J"] >= jipo["M"] else "M"
    answer += "A" if jipo["A"] >= jipo["N"] else "N"

    return answer

결과 : 모든 테스트케이스를 통과했다 🥳

참고 : https://velog.io/@phobos90/Programmers%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%84%B1%EA%B2%A9-%EC%9C%A0%ED%98%95-%EA%B2%80%EC%82%AC%ED%95%98%EA%B8%B0-python

오류 수정 완료

오류 원인 및 수정 내용

  • 처음 작성했던 코드의 오류 부분을 수정했다.
  • score 배열을 선언할 때, 처음에는 다음과 같이 배열을 선언했다.
score = [[0]*2]*4
  • 하지만, 이렇게 2차원 배열을 선언하는 경우, 얕은 복사가 되어 같은 주소 값을 가진 배열이 생성되게 된다.
  • 하나의 [0,0] 배열을 4번 가리키고 있기 때문에, 한 값을 수정했을 때 4곳의 값이 모두 바뀌는 것처럼 보이는 것이다.
  • 4개씩 동일한 주소를 가리키고 있기 때문에, 메모리에 실제도 존재하는 값은 총 8개가 아니라 2개뿐이다.
  • 따라서 다음과 같이 코드를 수정해야 한다.
score = [[0]*2 for i in range(4)]

프로그래머스 질문하기 기능을 통해 다른 분의 답변을 받아볼 수 있었다! 😊 덕분에 새로운 내용을 알게 되었다.

전체 소스 코드

def solution(survey, choices):
    answer = ''
    
    # score = [[0]*2]*4       # R/T, C/F, J/M, A/N
    score = [[0]*2 for i in range(4)]		## 오류 해결 부분!
    type = [['R', 'T'], ['C', 'F'], ['J', 'M'], ['A', 'N']]     # 유형 저장
    
    for i in range(len(survey)):
        if choices[i] >= 1 and choices[i] <= 3:
            per = survey[i][0]            
        else:
            per = survey[i][-1]
        
        addscore = 4 - choices[i] if choices[i] <= 4 else choices[i] - 4

        for i in range(4):
            for j in range(2):
                if per == type[i][j]:
                    print(per, type[i][j], addscore)
                    score[i][j] += addscore

        # 같은 열(0열 또는 1열)의 점수 값이 모두 + 되어 갱신됨
        # 예) score[0][0] 값이 + 되어야 하면, score[0][0], score[1][0], score[2][0], score[3][0] 값이 모두 증가함

    for i in range(4):
        if score[i][0] == score[i][1]:
            if ord(type[i][0]) < ord(type[i][1]):
                answer += type[i][0]
            else:
                answer += type[i][1]
        else:
            if score[i][0] > score[i][1]:
                answer += type[i][0]
            else:
                answer += type[i][1]
    
    print(score)

    return score

solution(["AN", "CF", "MJ", "RT", "NA"], [5, 3, 2, 7, 5])

처음 코드 (오류 수정 중)

# 오류 점검 중
# 테스트 케이스 1 오답, 테스트 케이스 2 통과

def solution(survey, choices):
    answer = ''
    
    score = [[0]*2]*4       # R/T, C/F, J/M, A/N
    type = [['R', 'T'], ['C', 'F'], ['J', 'M'], ['A', 'N']]     # 유형 저장
    
    for i in range(len(survey)):
        if choices[i] >= 1 and choices[i] <= 3:
            per = survey[i][0]            
        else:
            per = survey[i][-1]
        
        addscore = 4 - choices[i] if choices[i] <= 4 else choices[i] - 4

        for i in range(4):
            for j in range(2):
                if per == type[i][j]:
                    print(per, type[i][j], addscore)
                    score[i][j] += addscore

        # 같은 열(0열 또는 1열)의 점수 값이 모두 + 되어 갱신됨
        # 예) score[0][0] 값이 + 되어야 하면, score[0][0], score[1][0], score[2][0], score[3][0] 값이 모두 증가함

    for i in range(4):
        if score[i][0] == score[i][1]:
            if ord(type[i][0]) < ord(type[i][1]):
                answer += type[i][0]
            else:
                answer += type[i][1]
        else:
            if score[i][0] > score[i][1]:
                answer += type[i][0]
            else:
                answer += type[i][1]
    
    print(score)

    return score

solution(["AN", "CF", "MJ", "RT", "NA"], [5, 3, 2, 7, 5])

깔끔하게 짠 코드는 아니지만, 원인을 모르겠는 오류가 발생하여 현재 해당 오류가 생기는 이유를 찾는 중이다.
2차원 배열인 score 배열과 type 배열을 선언하여 type 배열에는 문제에서 주어진 R/T, C/F, J/M, A/N 유형을 저장하였다.
이후 점수 계산을 해서 score 배열에 type 배열에서 유형이 위치하는 곳과 동일한 위치에 점수를 추가하는 방식으로 진행했다.
그런데 예를 들어 score[0][0] 번째 배열에만 저장되어야 하는 점수가 score[1][0], score[2][0], score[3][0]에 모두 저장되는 등 동일한 열의 점수 배열 값이 모두 증가하는 모습이 나타난다.
왜인지 모르겠지만 해당 이유를 찾는 중이다.
(이 글을 읽으시는 분 중 해답을 아시는 분이 있다면, 댓글로 알려주시면 감사하겠습니다🥲)

+더 깔끔한 코드로 줄여볼 것이다.

profile
👩🏻‍💻 AI를 좋아하는 IT학부생
post-custom-banner

0개의 댓글