Algorithm/Programmers
[프로그래머스] 기지국 설치 / level 3 / 파이썬 / python
💡 solutions 💬 문제에서 구해야 하는 답은 '증성해야 할 기지국 개수의 최솟값'이다. 따라서 이를 구하기 위해서는 설치된 기지국으로부터 전파가 전달되지 않는 아파트들을 먼저 찾아야 한다. 💬 설치된 기지국 리스트를 가지고 순차적으로 탐색한다. start, end값을 갱신하며 전파가 전달되지 않는 아파트의 개수(before)를 구간별로 찾는다. 💬 spread는 기지국 하나를 설치하면 결과적으로 전파를 전달 받는 아파트의 개수이다. (기지국의 위치 또한 포함) 예를 들어 w가 2이면 총 5개의 아파트가 전파를 전달 받을 수 있다. 💬 한 구간에서 전파가 전달되지 않은 아파트들의 개수를 spread로 나눈 몫을 올림한 값이 바로 증설해야 할 기지국 개수이다. 모든 구간을 탐색하여 증설해야 할 기지국..
[프로그래머스] 스티커 모으기(2) / 파이썬 / python / DP문제
💡 solutions 💬 첫 번째 스티커를 뜯은 경우 / 첫 번째 스티커를 뜯지 않은 경우 두 가지로 나눠서 DP 테이블을 만들고 풀이를 진행함. 💬 테스트케이스 33번이 런타임이 나서 찾아보니, 엣지 케이스 N = 1일 때를 처리해주지 않아서 인덱스 에러가 발생했고, 첫 번째 if문으로 해당 케이스를 보완. 👨💻 code def solution(sticker): if len(sticker) == 1: return sticker[0] dp1 = [0]*len(sticker) # 첫 번째 스티커를 뜯은 경우 dp2 = [0]*len(sticker) # 첫 번째 스티커를 뜯지 않은 경우 dp1[0] = sticker[0] dp1[1] = sticker[0] for i in range(2, len(stick..
[프로그래머스] 징검다리 건너기 / 파이썬 / python / 이진탐색
💡 solutions 💬 순차탐색으로는 효율성을 만족하기 어렵기 때문에 이진탐색으로 다리를 건널 수 있는 최대 인원을 찾아야 한다. 💬 start는 1, end는 max(stones) 디딤돌의 최댓값으로, mid는 (start+end)//2로 설정 💬 디딤돌을 앞에서부터 하나씩 꺼내와 mid값을 빼고 건널 수 있는지 없는지 확인 -> 건널 수 없는 경우 cnt += 1 / 건널 수 있는 경우 cnt = 0으로 초기화 💬 cnt값이 k개 이상이면 디딤돌을 mid명 만큼 건널 수 없기 때문에 반복문 break -> end를 mid-1 로 갱신 💬 반복문이 온전히 종료된 경우, 즉 mid명이 모든 디딤돌을 건널 수 있는 경우 -> start를 mid +1 로 갱신 👨💻 code def solution(sto..
[프로그래머스] 가장 먼 노드 / 파이썬 / python / BFS
💡 solutions 💬 최단 거리 로직을 위해 BFS 알고리즘으로 구현한다. -> deque 자료구조 사용 💬 visit 배열을 가지고 방문했는지 확인함과 동시에 1부터 해당 노드까지의 거리를 저장한다. 👨💻 code from collections import deque def solution(n, edge): adj = [[] for _ in range(n+1)] visit = [0] * (n+1) for a, b in edge: adj[a].append(b) adj[b].append(a) visit[1] = 1 q = deque([1]) while q: x = q.popleft() for next in adj[x]: if not visit[next]: visit[next] = visit[x] + ..
[프로그래머스] 야근 지수 / 파이썬 / Python / heap
💡 solutions 💬 야근 피로도를 최소한으로 만들기 위해서는 주어진 N시간 동안 works 리스트 안의 작업량 요소들을 가장 큰 값부터 -1씩 줄여나가는 과정이 필요하다. 💬 works와 n의 크기를 고려했을 때, 효율성을 통과하기 위해서는 값을 비교하는 로직을 위해 heaq 자료 구조를 사용해야 한다. 💬 주어진 예제 중에 3번과 같이 주어진 N시간 동안에 모든 작업량을 모두 끝마칠 수 있는 경우에는 0을 바로 리턴할 수 있도록 조건을 추가해야 한다. 👨💻 code import heapq def solution(n, works): answer = 0 if sum(works)
[프로그래머스] 정수 삼각형 / 파이썬 / python / 다이나믹 프로그래밍
오늘 파이썬을 정말 오랜만에 쓰는 거라 어색했다. 동빈나님 알고리즘 강의 중 다이나믹 프로그래밍을 공부했고, 이와 관련된 간단한 문제를 풀어보았다. 다이나믹 프로그래밍(Dynamic Programming)이란? 완전 탐색으로 시간이 오래 걸리는 프로그램의 수행 시간을, 메모리를 적절히 사용하여 효율화하는 방법이다. 이미 계산한 결과(작은 문제)를 별도 메모리 영역에 저장하여 다시 계산하지 않도록 하는 것이다. 다음을 만족하는 경우 다이나믹 프로그래밍으로 해결한다. 최적 부분 구조 -> 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있다. 중복되는 부분 문제 -> 동일한 작은 문제를 반복적으로 해결해야 한다. 다이나믹 프로그래밍의 두 가지 유형 탑다운(메모이제이션) ..
[프로그래머스] 문자열 내림차순으로 배치하기 / 자바 / Java / stringBuilder
💡solutions 💬 String.toCharArray()를 사용하여 문자열 s를 char형 배열(arr[ ])로 바꾼다. * 참고로 char형 배열을 하나의 문자열로도 만들 수 있다 -> String s1 = new String(charArr); 💬 arr 배열을 오름차순으로 정렬한다. 💬 stringBuilder을 사용하여 각 문자들을 appned()로 더한 후 문자열을 출력하기 위해 toString()을 사용한다. stringBuilder을 사용하는 이유 자바에서 String 객체는 변경 불가능하다. 따라서 String 객체끼리 더하는 연산은 메모리 할당과 해제를 발생시켜 성능적으로 좋지 않기 때문에 stringBuilder을 사용한다. stringBuilder은 String 객체를 더할 때 새로..
[프로그래머스] 섬 연결하기 / 파이썬 / Python / 크루스칼(Kruskal) 알고리즘
💡solutions ) 💬 '최소 비용으로 모든 노드(섬) 연결' -> 최소 신장 트리(MST)를 사용하는 크루스칼 알고리즘 활용 문제다. 신장 트리(Spanning Tree)란? 그래프 내의 모든 정점을 연결하는 트리로 간선의 개수가 n-1개로 최소 연결 부분 그래프이다. 최소 신장 트리(Minimum Spanning Tree )란? 신장 트리에서 사용된 간선들의 가중치의 합이 최소인 트리 즉, 최소 비용으로 모든 노드 연결하는 그래프이다. 참고 블로그 💬 먼저 다리 건설 비용 기준으로 costs를 오름차순 정렬한다. -> 적은 비용의 노드부터 꺼내와서 연결한다. 💬 노드의 부모를 찾는 find_parent를 통해 꺼내온 두 노드의 부모를 비교한다. ->사이클이 생기지 않게 하기 위해 부모가 다른 경우..
[프로그래머스] 체육복 / 자바 / Java / 그리디(Greedy) 알고리즘
💡solutions ) 💬 처음 코드를 제출했을 때 테스트케이스 13, 18번이 실패하였다. 8월 30일 기준으로 테케가 추가됐다고 하는데 아마도 lost나 reserve가 순서대로 들어오지 않은 경우일 것이다. (예를 들면, lost = [4,3,5]) 이때 sorting을 해주지 않으면 통과하지 못하게 된다. 💬문제에서 주어진 제한사항 중 5번째부터 해결한다. -> 첫 번째 이중 for문에서 여분의 체육복이 있지만 동시에 체육복을 도단당한 학생의 경우 다른 학생에게 체육복을 빌려줄 수 없는 상태로 만든다 reserve[j] = -1; 그리고 도난당한 학생 리스트에서도 제외해준다 lost[i] = -1; 💬 잃어버린 학생의 앞 또는 뒤에 있는 다른 학생으로부터 체육복을 빌려올 수 있는 경우 -> 빌려주..
[프로그래머스] 디스크 컨트롤러 / 파이썬 / Python / heapq 사용
💡solutions ) 💬 참고 : 디스크 컨트롤러 문제에서 요구하는 작업 처리 방식은 FIFO(First In First Out)가 아니라 SJF(Shortes Job First)방식이다. 즉, 요청된 작업들 중 가장 짧은 작업시간을 요구하는 작업부터 우선적으로 처리하는 방식이다. -> 이런 방식으로 진행하면 각각의 요청된 작업들의 대기 시간을 줄일 수 있다는 장점이 있다. (비선점형 스케줄링 방식에서 평균 대기 시간이 가장 짧다) 💬 heapq 모듈을 통해 최소 힙 사용하였음 -> heap에 작업의 소요시간, 작업이 요청되는 시점 순서로 값을 넣으면 (이번 예제에선 heap = [[3, 0], [6, 2], [9, 1]] 순으로 들어가는 셈) -> heappop할 때 작업의 소요시간을 기준으로 가장 ..
[프로그래머스] 실패율 / 파이썬 / python / 2019 KAKAO BLIND RECRUITMENT
💡solutions ) 💬 이번에 구현한 로직이 효율성면에서는 좋지 못한 코드다. 특히 for문 안에서 매번 count()를 하기 때문에 시간 복잡도가 O(N²)이고, remove() 메소드까지 있기 때문에 맨 처음 stages.sort()를 하지 않으면 몇가지 테스트 케이스에서 시간초과로 통과하지 못하는 문제가 있었다. 💬 참고로 첫 시도에서 1,6,7,9,13,23,24,25 테스트 케이스는 런타임에러가 났고, 질문하기를 통해 어떤 것이 문제인지 확인해보니 -> for문 안에서 전체 남아있는 total_user가 0인 경우 fail_user/total_user로 계산하게 되면 ZeroDivisionError가 발생하는 것이 문제였다. 💬 혹시 필자와 같은 테스트케이스가 런타임에러 나는 경우 아래 테스..
[프로그래머스] 비밀지도 / 파이썬 / python / 2018 KAKAO BLIND RECRUITMENT/ 카카오 코테
💡solutions ) 💬 arr1과 arr2에서 주어진 정수들을 bin()을 사용해 이진수로 변환한 후 주어진 n크기에서 부족한 만큼을 0으로 채워주기 위해 zfill()사용 -> e.g.) 9를 이진수 1001 변환했을 때 -> 지도 한변의 크기가 5(n= 5)라면 -> 01001로 바꿔주기 👨💻code ) def solution(n, arr1, arr2): answer = [''] * n for i in range(len(arr1)): a1 = bin(arr1[i])[2:].zfill(n) a2 = bin(arr2[i])[2:].zfill(n) for j in range(n): if a1[j] == '0' and a2[j] == '0': answer[i] += ' ' else: answer[i] ..