본문 바로가기
반응형

프로그래머스55

게임맵 최단거리 [programmers&leetcode] 문제 풀이 처음 이 문제를 프로그래머스에서 마주쳤을때는 풀지 못했다. 나중에 풀고 넘어가야할 문제로 넘겼는데 오늘 leetcode 에서 비슷한 문제를 만나게 되고, 해당 문제의 hint를 보게 되어 ‘이렇게 푸는 거 구나!’ 싶어서 풀게 되었다. 그럼 저 문제를 풀기 전에 hint를 주었던 leetcode 오늘의 문제부터 살펴보기로 하자. hint 부분에 Do a breadth first search to find the shortest path. 라고 적혀 있는걸 보고 bfs로 푸는구나 하고 알게 되었다. leetcode의 문제를 보면 각 점 좌표에서 여덟방향으로 0이 있는지 조사후 해당 경로를 다음 단계에서 움직일 예정이라고 리스트에 저장한다. 예를 들어, 3*3 행렬(0-index)의 [1,1] 의.. 2022. 5. 16.
쿼드압축 후 개수 세기 [프로그래머스] 문제링크 문제풀이 예전에 한번 문제만 봤던건데 예전과 달라진 점은 이제 그림을 보고 “오! 재귀함수로 풀면 금방 풀리겠다” 가 보이는 단계로 진화했다. 문제풀이 각이 보이니 얼른 풀었다. 입력으로 들어오는 arr 행렬을 4등분해서 갯수를 세면 되겠다 싶었다. 규칙으로는 arr 행렬 4등분 하기 arr 의 길이가 1 이라면 해당 배열의 숫자 그냥 반환하기 4등분 된 각 부분의 모든 숫자가 같다면 그 숫자 하나만 반환하기 (압축) 그렇게 제일 작은 부분부터 사분면 합치면서 재귀함수 빠져나오기 하나씩 구현해보자 arr 행렬 4등분하기 def slice_arr(arr, upDown, direction): temp_arr = [] slice_num = len(arr)//2 if upDown == "up": # 가.. 2022. 2. 14.
배달 [프로그래머스] 문제 풀이 설명 그래프 보자마자 음 이건 dfs 문제군 이라고 감이 왔다. 확실히 예전보다는 문제를 많이 풀어봐서 감을 익힌듯 하다. 그래프 그림을 보면 주의 할 점이 보이는데, cycle 이 존재한다는 점이다. 연결된 node를 따라갈때, recursive 하게 함수를 짜게 되는데, 끝이 없다면 stack overflow로 에러가 날수 있다. 그래서 visited 라는 배열을 만들어 이전에 방문한 node에 대해 체크할 수 있도록 구현했다. 우선 road 매트릭스를 만들어 준다. 매트릭스 mat[i][j] 는 i번째 마을과 j 번째 마을의 road 길이로 세팅해준다. 각 마을 별로 방문했는지 여부를 알 수 있게 visited 리스트 역시 만들어준다. mat = [] for i in range(N): #.. 2022. 1. 29.
거리두기 확인하기 [프로그래머스] 문제 풀이 문제 풀이 자체가 별로 없다. P의 위치를 좌표 평면에서 x=0, y=0 이라고 했을때 맨하튼 거리가 2 이내 인 곳은 총 12 군데로 west ⇒ [-2,0] , [-1,0] southwest ⇒ [-1,-1] south ⇒ [0, -2] , [0, -1] southeast ⇒ [+1, -1] east ⇒ [+2,0], [+1,0] northeast ⇒ [+1,+1] north ⇒ [0,+2], [0+1] northwest ⇒ [-1,+1] 이렇게 총 12개의 공간을 확인해야 한다. 1, 3, 5, 7 번의 공간의 경우 맨하튼 거리가 1인 경우 P가 존재한다면 무조건 False 맨하튼 거리가 2인 경우 P가 존재한다면 중간 공간의 값이 X가 아니라면 무조건 False 2, 4, 6, 8 번의.. 2021. 11. 29.
땅따먹기 [프로그래머스] 문제 풀이 어... 처음에는 dp처럼 이전 계산 결과를 다 저장한다음에 마지막에 경로값을 쓰는? 문제인줄 알았으나 읽다보다 더 쉬운문제였다. 마지막에 계산 결과중 제일 큰값을 출력하면 되는 문제다. 그렇다면 이전 결과중에 제일 큰값 들만 저장하면서 진행하고, 마지막 결과값중에 제일 큰값을 찾아내면 된다는 얘기다. row의 각 값은 이전 값들과의 계산중 가장 큰값만을 저장하면 된다. [1, 2, 3, 5] [5, 6, 7, 8] → 이 단계에서 계산을 보면 (자신의 index와 같은 index는 피해서) 5 → [5+2, 5+3, 5+5] → max=10 6 → [6+1, 6+3, 6+5] → max=11 7 → [7+1, 7+2, 7+5] → max=12 8 → [8+1, 8+2, 8+3] → max=1.. 2021. 11. 26.
후보키 [프로그래머스] 문제풀이 이건 일단 "어떤 컬럼을 써서 후보키를 만드는지" 가 관건이다. 어떤 컬럼을 사용해야 하는지 모르기 때문에 더할 컬럼들 (0번 컬럼 + 1번 컬럼 등)의 후보를 만드는게 첫번째다. 또한 중복이 없어야 하며, 더하는 컬럼의 순서가 중요하지 않다. (0번 컬럼 + 1번 컬럼) 을 이용해 키를 만들어 구분하나 (1번 컬럼 + 0번 컬럼) 을 만들어 구분하나 똑같다. index 값을 이용해 더할 컬럼의 후보를 만들어 준다. com_len = len(relation[0]) from itertools import combinations # 중복이 없는 후보군들 반환 하기 위한 combination 임포트 com_list = [] index_list = [i for i in range(com_len)] fo.. 2021. 11. 25.
순위 검색 [프로그래머스] 문제 풀이 정리 문제 설명 보고 개쉽네ㅋ 하고 입장했다가 대가리 깨진 문제다. 일단 문제자체는 어렵지 않다. 조건에 맞는 score들만 가져와서 개수를 센다. 끝 :) 그렇게 안일하게 보고 코드를 짤 경우 for loop *4 의 지옥을 보고 어...? 이거 괜찮은가? 하면서 돌리게 된다. 물론 그럼 시간 초과 난다. (테스트는 통과하지만 효율성에서 막힌다.) 그럼 두번째 방법으로 생각 한 것이 json처럼 depth 구분이 있게끔 만들어서 조건에 맞는 애들만 좀 쉽게 관리하자! → dictionary 형태로 key:value 로 만들어 관리 but, 마지막 depth 의 score_list에서 특정 값이상의 숫자 개수를 반환하는데 있어서 효율성 탈락 자, 그럼 score_list에서 빠르게 꺼낼 방법을.. 2021. 11. 22.
주식 가격 [프로그래머스] 코드 def solution(prices): answer = [] prices = list(reversed(prices)) for index, price in enumerate(prices): if len(answer) == 0: answer.append(index) else: flag = False for i in range(index-1, -1, -1): if prices[i] < price: answer.append(index-i) flag = True break if not flag: answer.append(index) answer = list(reversed(answer)) return answer 문제 풀이 스택/큐 문제라는데 어떻게 써야할지 감이 안잡혔다. (지금도...) 첫번째 시도에선 .. 2021. 11. 17.
문자열 압축 [프로그래머스] 코드 def solution(s): answer = len(s) for n in range(1, len(s)//2+1): count = 1 temp_sentence = "" for index in range(0, len(s), n): prev_s = s[index:index+n] next_s = s[index+n:index+(2*n)] if prev_s == next_s: count+=1 else: if count != 1: temp_sentence += str(count)+prev_s else: temp_sentence += prev_s count = 1 # print(temp_sentence, len(temp_sentence)) if answer > len(temp_sentence): answer =.. 2021. 11. 14.
반응형