알고리즘 풀이/프로그래머스 109

[Level 3] 이중우선순위큐

https://programmers.co.kr/learn/courses/30/lessons/42628 코딩테스트 연습 - 이중우선순위큐 programmers.co.kr 접근 힙을 이용하여 주어진 명령어대로 최댓값을 삭제하거나 최솟값을 삭제한다. 구현 - 빈 배열인 numbers를 선언한다. - 주어진 operations를 탐색하여 명령어와 숫자를 분리하고 - 명령이 I일 때는 heappush로 숫자를 numbers에 대입한다. 이를 통해 numbers는 오름차순으로 정렬될 것이다. - 명령어가 D이고 numbers가 비어있지 않을 때는 - 숫자가 1일 때 리스트 메서드인 pop으로 최댓값을 삭제하고 -1일 때는 heappop로 최솟값을 삭제한다. - 연산을 모두 완료했을 때 numbers가 비어있다면 [..

[Level 2] 행렬 테두리 회전하기

https://programmers.co.kr/learn/courses/30/lessons/77485 코딩테스트 연습 - 행렬 테두리 회전하기 6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3] programmers.co.kr 접근 총 4방향으로 회전하기 때문에 각 방향에 대해 회전해야 하는 범위를 정하여 새로운 2차원 배열에 저장한다. 이후에 새로운 2차원 배열의 좌표에 아무 숫자도 들어있지 않았다면 기존의 숫자를 대입한다. 구현 - 아래는 좌표를 입력받아 테두리를 회전시키는 함수이다. - 각각의 4방향으로 나누고 범위를 지정하여 새로운 2차원 배열인 new_boa..

[Level 3] 보석 쇼핑

https://programmers.co.kr/learn/courses/30/lessons/67258 코딩테스트 연습 - 보석 쇼핑 ["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7] programmers.co.kr 접근 기본적으로 투 포인터 알고리즘을 적용하였다. left와 right가 처음에 0번째 인덱스를 가리킨다. 이제 right를 증가시키면서 해당되는 보석을 table에 추가한다. 만약 table의 길이가 보석의 종류와 같을 때는 최소 길이를 찾는다. 구현 - 먼저 set을 통해 보석 종류의 개수를 구한다. - left와 right가 0번째 인덱스를 가리키면서 탐색을 시작한다. - right가 증가하면서 table..

[Level 3] 징검다리 건너기

https://programmers.co.kr/learn/courses/30/lessons/64062 코딩테스트 연습 - 징검다리 건너기 [2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3 programmers.co.kr 접근 최대로 건널 수 있는 사람부터 한 명까지 탐색을 한다. 그리고 건널 수 있는 사람의 명수를 stones에 있는 각각의 숫자와 빼준다. 이때 0이하인 숫자가 K개 이하라면 해당 숫자가 최대로 건널 수 있는 사람의 명 수가 된다. 하지만 stones에 있는 원소는 최대 200,000,000의 수를 갖기 때문에 효율성 테스트에서 통과하지 못할 것이다. 따라서 선형적으로 탐색하는 것이 아니라 이진탐색을 활용한다. 이진 탐색으로 건널 수 있는 사람의 명수를 찾는다. 구현 - le..

[Level 3] 기지국 설치

https://programmers.co.kr/learn/courses/30/lessons/12979 코딩테스트 연습 - 기지국 설치 N개의 아파트가 일렬로 쭉 늘어서 있습니다. 이 중에서 일부 아파트 옥상에는 4g 기지국이 설치되어 있습니다. 기술이 발전해 5g 수요가 높아져 4g 기지국을 5g 기지국으로 바꾸려 합니다. 그런데 5 programmers.co.kr 접근 기지국의 영향을 받지 않는 곳의 크기를 구하고 이를 기지국이 영향을 주는 범위만큼 나눈다. 이제 몫을 올림하여 최종해에 더한다. 기지국의 영향을 받지않는 곳을 봤을 때 (2 * w + 1)로 나누면 필요한 기지국의 개수를 알 수 있다고 판단하였다. 구현 - 먼저 기지국의 범위를 (left, right)의 형태로 ranges에 추가한다. ..

[Level 3] 디스크 컨트롤러

https://programmers.co.kr/learn/courses/30/lessons/42627# 코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를 programmers.co.kr 접근 힙을 활용했다. job의 시작시간이 특정 시간의 범위 내에 있을 때 힙에 넣는다. 힙에 넣을 때는 작업이 소요되는 시간을 기준으로 넣을 수 있도록 한다. 여기서 힙이 비어있을 때는 시간을 1씩 증가하도록 한다. 구현 - 먼저 지난 시간 last를 -1, 현재 시간 cur을 jobs 중에 가장 빠른 시작시간으로 초기화한다. - 이제 while문을 통해..

[Level 2] 거리두기 확인하기

https://programmers.co.kr/learn/courses/30/lessons/81302 코딩테스트 연습 - 거리두기 확인하기 [["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1] programmers.co.kr 접근 대기실 내에서 사람의 좌표를 기준으로 BFS를 진행하고 맨해튼 거리가 2이하인 지원자..

[Level 2] 타겟 넘버

https://programmers.co.kr/learn/courses/30/lessons/43165 코딩테스트 연습 - 타겟 넘버 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+ programmers.co.kr 접근 전달받은 numbers의 숫자들을 더하거나 빼서 target을 만들 수 있는 경우의 수가 몇 개인지 구해야한다. 따라서 DFS를 통해 모든 경우의 수를 먼저 구했다. 구현 - DFS 내에서 현재 인덱스와 지금까지 합을 더하거나 뺄 때로 나눠서 재귀호출을 진행하였고 - idx가 N이 될 때는 모든 선택이 ..

[Level 2] 메뉴 리뉴얼

https://programmers.co.kr/learn/courses/30/lessons/72411 코딩테스트 연습 - 메뉴 리뉴얼 레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서 programmers.co.kr 접근 딕셔너리를 활용하였다. 먼저 각 손님들이 주문한 메뉴를 통해 만들 수 있는 코스 조합을 생성한다. 이 때 코스에 포함되는 메뉴의 수가 주어지기 때문에 해당 수만큼 메뉴가 포함된 조합을 생성한다. 이후 생성된 코스 조합을 딕셔너리에 key로 저장하고 value에는 해당 코스 조합의 개수를 저장한다. 이제 course의 들어있는 코스에 포함된 메뉴의 개수들 중 ..

728x90
반응형