[스파르타코딩클럽]데이터분석 과정/PYTHON

[Python 코드카타] 67~69번(프로그래머스)

doo_ 2024. 1. 30. 15:45

67번 둘 만의 암호

> 처음 푼 방식 :

ex. ord(z) : 121이고 index가 20 cnt가 10 인 경우 문제 발생..ㅜ

def solution(s, skip, index):
    answer = ''
    for word in s:
        cnt = 0
        for i in range(1,index+1):
            if ord(word)+i <= 122:
                if chr(ord(word)+i) in skip:
                    cnt += 1
            elif chr(ord(word)+i-26) in skip:
                cnt +=1
        if ord(word)+index+cnt > 122 :
            answer += chr(ord(word)+index+cnt-26)
        else :
            answer += chr(ord(word)+index+cnt)
    return answer

> 리스트 인덱스 방식 활용

def solution(s, skip, index):
    answer = ''
    # a~z까지의 문자를 세팅
    az = ''
    for i in range(ord('a'),ord('z')+1):
        az += chr(i)
	# 그 중에서 skip해당하는 문자들을 제거
    azset = list(set(az) - set(skip))
    # 정렬이 안 되어 있어서 정렬
    azset.sort()
    # idx 설정
    for word in s :
        idx = (azset.index(word)+index)%len(azset)
        answer += azset[idx]
    return answer

> 딕셔너리를 활용한 방법

def solution(s, skip, index):
    result = ''
	for i in range(ord('a'),ord('z')+1):
        a_to_z += chr(i)
    a_to_z -= set(skip)
    a_to_z = sorted(a_to_z)
    l = len(a_to_z)

    dic_alpha = {alpha:idx for idx, alpha in enumerate(a_to_z)}

    for i in s:
        result += a_to_z[(dic_alpha[i] + index) % l]

    return result

 

68번 햄버거 만들기

> 슬라이싱을 이용한 방법은 데이터가 큰 경우 시간초과발

def solution(ingredient):
    answer = 0
    # 1:빵 2:야채 3:고기
    burger = []
    for i in ingredient:
        burger.append(i)
        if burger[-4:] == [1,2,3,1]:
            answer += 1
            # for ~ pop 대신 del burger[-4:]도 가능
            for n in range(4):
                burger.pop()
    return answer

 

69번 성격 유형 검사하기

> 딕셔너리 활용을 이해하고 적용해서 품

def solution(survey, choices):
    answer = ''
    # 1번 지표 : R - T
    # 2번 지표 : C - F
    # 3번 지표 : J - M
    # 4번 지표 : A - N
    indicate = {'R':0,'T':0,'C':0,'F':0,'J':0,'M':0,'A':0,'N':0}
    for n in range(len(survey)):
        if choices[n] < 4:
            indicate[survey[n][0]] += (choices[n]*3)%4
        elif choices[n] > 4:
            indicate[survey[n][1]] += choices[n]%4
            
    indicate_keys = list(indicate.keys())
    for i in range(0,8,2):
        if indicate[indicate_keys[i]] > indicate[indicate_keys[i+1]]:
            answer += indicate_keys[i]
        elif indicate[indicate_keys[i]] < indicate[indicate_keys[i+1]]:
            answer += indicate_keys[i+1]
        else :
            answer += min(indicate_keys[i],indicate_keys[i+1])
    return answer

> 여러 해답 중 깔끔하다고 생각한 답👏👏

def solution(설문_조사_배열, 선택지_배열):
    지표 = {}
    지표['RT'] = 지표['TR'] = {'R': 0, 'T': 0,}
    지표['FC'] = 지표['CF'] = {'C': 0, 'F': 0,}
    지표['MJ'] = 지표['JM'] = {'J': 0, 'M': 0,}
    지표['AN'] = 지표['NA'] = {'A': 0, 'N': 0,}
    점수 = {
        '매우 비동의': 3,
        '비동의': 2,
        '약간 비동의': 1,
        '모르겠음': 0,
        '약간 동의': 1,
        '동의': 2,
        '매우 동의': 3,
    }
    비동의 = [1, 2, 3]
    동의 = [5, 6, 7]
    선택지 = {
        1: '매우 비동의',
        2: '비동의',
        3: '약간 비동의',
        4: '모르겠음',
        5: '약간 동의',
        6: '동의',
        7: '매우 동의',
    }
    answer = ''

    for 인덱스 in range(len(설문_조사_배열)):
        비동의_캐릭터, 동의_캐릭터 = 설문_조사_배열[인덱스]

        if 선택지_배열[인덱스] in 비동의:
            지표[설문_조사_배열[인덱스]][비동의_캐릭터] += 점수[선택지[선택지_배열[인덱스]]]
            continue

        if 선택지_배열[인덱스] in 동의:
            지표[설문_조사_배열[인덱스]][동의_캐릭터] += 점수[선택지[선택지_배열[인덱스]]]

    결과_배열 = [지표['RT'].items(), 지표['FC'].items(), 지표['MJ'].items(), 지표['AN'].items()]
    정렬된_배열 = []

    for 결과 in 결과_배열:
        정렬된_배열.append(sorted(결과, key=lambda x: -x[1]))

    return ''.join([캐릭터_점수_튜플[0] for [캐릭터_점수_튜플, _] in 정렬된_배열])