PS/프로그래머스 24

[Python] 가장 많이 받은 선물

✏️ 문제 문제 파악처음엔 준 사람이랑 받은 사람 구분하려고 { "muzi" : ["frodo", "frodo"] ... } 이런 식으로 딕셔너리 쓰려고 했는데준 사람과 받은 사람, 서로 받은 선물의 수를 비교할 때 복잡해질 것 같았다.  생각해보니 friends 배열에 이름이 차례대로 들어오고 굳이 이름으로 구분 안해도 될 것 같아서 friends의 인덱스를 활용해 이차원 배열을 사용해서 서로 받은 선물의 수를 비교했다.  코드def solution(friends, gifts): people = [[0] * len(friends) for _ in range(len(friends))] cnt = {} # 선물 지수 gift = [0] * len(friends) # 받는 선물 수 ..

[Python] 성격 유형 검사하기

✏️ 문제 문제 파악R과 T, C와 F 는 세트(?)이기 때문에 이 세트를 살리기 위해 딕셔너리를 각각 나눠주면서 튜플을 사용했다.그리고 유형이 반대로 들어올 수도 있기 때문에 반대에 해당하는 유형도 배열에 넣어줘서 딕셔너리의 값을 더할 때 인덱스 [0]과 인덱스 [1]로 구분해서 더해주었다.  코드def solution(survey, choices): answer = '' ary = ['R', 'T', 'C', 'F', 'J', 'M', 'A', 'N'] aryC = ['RT', 'TR', 'CF', 'FC', 'JM', 'MJ', 'AN', 'NA'] category = {'R' : 0, 'T' : 0}, {'C' : 0, 'F' : 0}, {'J' : 0, 'M' : 0}, {..

[Python] 신고 결과 받기

✏️ 문제 문제 파악매치하기 힘들 때는 손으로 적어가면서 정리하는 게 훨씬 잘된다! id 딕셔너리에는 { 유저 ID : [유저가 신고한 ID] } 를 주었고 stop 딕셔너리에는 { 유저 ID : 신고당한 횟수 } 를 주어서 신고당한 횟수가 k 이상이면 id 딕셔너리와 매치해서 인덱스 값을 결과 배열에 추가했다.  코드def solution(id_list, report, k): answer = [0] * len(id_list) id = {} stop = {} for i in id_list: id[i] = [] stop[i] = 0 for r in report: s, e = r.split(' ') ..

[Python] 1번 / 동영상 재생기

✏️ 문제 문제 파악조건이 너~~~~~무 많았다........... 그래서 반례를 잘 생각해봐야 하는 문제 내가 정리한 조건은 다음과 같다.오프닝 시작 위치 명령 처리 후 시작 위치 대해초가 59초 이상이면 분 += 1, 초 %= 60초가 0초 이하이면 분 -= 1, 초 += 60분과 초가 00:00 이하이면 분 = 0, 초 = 0비디오 시간보다 크면 분 = 비디오 시작 분, 초 = 비디오 시작 초오프닝 시작 위치  시작 위치 = 오프닝 끝나는 위치그리고 난 분과 초를 처리하는 과정에서 2차원 배열 total에 대해 total[1] = total[0] 이런식으로 값을 주고 total[0]에 대한 값을 건들인 적이 없는데 나중에 출력해보니 total[1]을 바꿀때마다 total[0] 값이 변했었다.아마 복..

[Python] 개인정보 수집 유효기간

✏️ 문제 문제 파악문제 자체가 연도, 월, 일을 가지고 말하는 것이기 때문에 12월이 넘었는지, 28일이 넘었는지 처리를 잘해주어야 한다. ~에 해당하면 ~를 매치해주어야할 때 딕셔너리만큼 편한 것이 없어서 약관 종류와 유효기간을 다룰 때 딕셔너리를 활용해서 풀었다. 이 문제를 풀었다면 더 확장된 문제인 1번 동영상 재생기 문제를 풀어보면 좋을 것 같다! 코드def solution(today, terms, privacies): answer = [] term_dict = {} cur_year, cur_month, cur_day = map(int, today.split('.')) for term in terms: key, value = term.split() ..

[Python] 10번 / 공원

✏️ 문제 문제 파악돗자리를 내림차순으로 제공하지 않기 때문에 내림차순을 한 후 풀어야한다! (아니면 틀림)몇중의 for 반복문을 작성해서 풀었다.. 이것밖에 딱히 생각나는 풀 코드가 없었다..  코드def solution(mats, park): mats.sort(reverse=True) h, w = len(park), len(park[0]) for mat_size in mats: for i in range(h - mat_size + 1): for j in range(w - mat_size + 1): can_place = True for k in range(mat_size): ..

[Python] 공원 산책

✏️ 문제 문제 파악원래 좌표 이동과 좀 다르게 아래로 갈수록 +1 되는 형식인데... 이런 형식만 나오면 왜이렇게 헷갈리는 지..  그래서 방향을 처리하는 게 매우매우 중요하다. 그리고 원래 좌표 이동과 별개로 생각하고 계산하는 게 편하다..!중요한 건 routes 중 하나를 처리하는 중에 공원을 벗어나거나 장애물을 만나면 무조건 해당 명령을 받아들이기 전 위치에서 다음 명령을 수행해야한다! 처음에 난 continue를 사용했는데 결과를 보니 예시 3번과 같은 경우 E 2를 처리할 때 장애물을 벗어나므로 E 2라는 명령을 처리하기 전 위치로 가야하는데 E 1까지는 장애물을 벗어나지 않으니까 E 1까지 처리한 후에 다음 명령을 수행해서 계속 틀렸었따 ㅠ  이럴 땐 continue가 아닌 break를 사용..

[Python] 1번 / 붕대 감기

✏️ 문제 문제 파악중요한 건 문제를 잘 읽는 것..! 조건은 다음과 같다.공격을 받으면초당 회복 X연속 성공 = 0현재 체력 -= 피해량공격을 받지 않으면초당 회복 O연속 성공 += 1if 연속 성공 == 시전 시간:현재 체력 += 추가 회복량연속 성공 = 0if 현재 체력 > 최대 체력:현재 체력 = 최대 체력현재 체력 여기서 나의 킥(ㅎㅎ)은 시간이 attack[n][0]의 값과 같은 지 시간이 업데이트될 때마다 attack의 전체를 돌아서 확인하도록 한 것이 아니라 맨 앞인 attack[0][0]만 비교하여 같다고 처리되면 pop()을 통해 맨 앞을 없애 시간복잡도를 줄였다.   코드def solution(bandage, health, attacks): cur_health = health ..

[Python] 햄버거 만들기

✏️ 문제 문제 파악문제를 읽자마자 스택을 사용하는 코드라고 짐작했는데 .... 스택을 여러 개 사용해서 푸는 줄 알고 무슨 조건일 때 스택을 추가하며 .. 이런 고민 때문에 난이도에 비해 시간이 좀 걸렸다.(스택 하나로도 풀 수 있는 문제였음 ..! 🥲)  코드def solution(ingredient): answer = 0 stack = [] for i in ingredient: if i != 1 and len(stack) == 0: continue else: stack.append(i) if stack[-4:] == [1, 2, 3, 1]: answer += 1 ..