본문 바로가기

Study Language/Python

Python - 연습문제

중복된 문자 제거

def solution(my_string):
    answer = ''
    ex_letter = set(my_string)
    
    for i in my_string:
        if i in ex_letter:
            answer += i
            ex_letter.discard(i)
    return answer


정답

def solution(my_string):
    answer = ''
    exclusive_letters = set(my_string) # set은 그 자체로 중복을 제거합니다.
    for letter in my_string:  
        if letter in exclusive_letters: # O(1)의 빠른 containment test
            answer += letter # 앞쪽부터 차례로 이어붙이고
            exclusive_letters.discard(letter)  # 쓴 것은 제외해줍니다. O(1)

    return answer

 

 

한번만 등장한 문자

def solution(s):
    letters = list(s)
    answer_list = []
    
    for i in letters:
        if letters.count(i) == 1 :
            answer_list.append(i)
    
    answer_list.sort()
    answer = ''.join(answer_list)
    
    return answer

 

정답

def solution(s):
    letters = list(s)  # 스트링을 리스트로 쪼개는 방법
    answer_list = []

    for letter in letters:
        if letters.count(letter) == 1:
            answer_list.append(letter)

    answer_list.sort()
    answer = ''.join(answer_list)

    return answer

 

 

숫자 문자열과 영단어

def solution(s):
    nums = {
        'zero': '0', 'one': '1', 'two': '2',
        'three': '3', 'four': '4', 'five': '5',
        'six': '6', 'seven': '7', 'eight': '8', 'nine': '9'
    }

    for n in nums:
        s = s.replace(n, nums[n])

    return int(s)

 

신고결과 받기

'''
문제 조건 정리

1명 -> 한번에 1명씩 제한없이 신고 가능.
    -> 1명 여러번 신고 가능 but, 1회로 처리.
    
k번 신고당함 -> 정지, 신고한 유저들에게 메일로 발송함. (자료구조로 id저장하고 있어야.)
            정지먹을때마다 보내는게 아니라, 전체 input이 다 주어지고나서 취합해서 메일을 보냄.
            
원하는 자료구조 모양 -> frodo가 muzi에게 여러번 신고당해도 1로 체크만 되길 원함. (가산되길 원하면 +=1로 수정가능)
{'frodo' : 
    {'muzi':1,
    'appeach':1,
    }
}
frodo가 신고를 받았는데, muzi, appeach가 신고했다는 뜻.
취합은 report_dict[id_value]의 len을 돌려서 k이상인지 판별하고, 된다면 그 key들을 돌려서(dict에 대한 for loop은 key를 대상으로 돌려줍니다.) id list에 넣어주기.
'''

def solution(id_list, report, k):
    report_dict = {key: {} for key in id_list}  # id:dict 형식으로 자료구조생성 (순서를 유지하는 dict의 성질을 이용, O(1)탐색을 위함). "신고받은" 사람 입장의 자료구조.
    mail_dict = {key: 0 for key in id_list}     # 마지막 검사, 순서맞춰주기 위한 dict 생성. "신고한" 사람 입장에서 들어오는 메일을 세주기 위한 새로운 자료구조 생성.

    for report_item in report:                       # report안에 있는 모든 report_item에 대한 for loop
        reporter, reported = report_item.split()     # reporter가 reported를 신고한다. space로 구분되어있으니 split 메소드 사용.
        report_dict[reported][reporter] = 1          # 신고당한 id가 주가 되는 자료구조를 미리 짜두었음. -> reported가 신고를 당했는데, reporter가 신고를 했다는걸 1로 체크한다.

    for each_id in id_list:
        if len(report_dict[each_id]) >= k:           # 취합하면서 "신고받은" 사람의 value를 보면 {'muzi' : 1, 'appeach' : 1}로 되어있어 len이 2가됨을 만족하니, muzi와 appeach에게 메일을 보내야한다.
            for key in report_dict[each_id].keys():  # muzi, appeach만 뽑은 iterable한 객체를 for loop. (dict의 keys메소드는 key들을 뽑아서 iterable한 객체로 반환합니다.)
                mail_dict[key] += 1                  # 메일을 받게 된다는 뜻으로 += 1

    answer = list(mail_dict.values())         # 처음에 주어진 id_list순서를 유지하면서, 메일 개수가 가산된 자료구조인 mail_dict에서 value만 필요하므로, values메소드를 사용.
    return answer

'Study Language > Python' 카테고리의 다른 글

python - PCCP 2,3일차  (1) 2024.01.09
파이썬 메서드 정리  (0) 2024.01.06