본문 바로가기

Algorithm144

[백준] 공유기 설치 / 2110번 / 파이썬 / python / 이분탐색 💡 solutions 💬 이분탐색 이용하여 문제 해결 💬 start, end, mid 변수값들은 공유기 사이 거리로 정한다. 💬 start는 공유기 사이의 최소 거리로, end는 공유기 사이의 최대 거리로 잡고 이분 탐색을 시작한다. 💬 집의 좌표를 담은 house 리스트를 정렬한 후 맨 첫 번째 집부터 공유기를 설치하는데 이때 공유기 사이의 거리를 mid만큼 잡는다. 💬 공유기를 설치한 횟수를 나타내는 count가 주어진 공유기 개수 C 이상이면 공유기 사이의 거리를 넓히고 (이때 공유기 사이 최대 거리를 나타내는 answer값을 mid로 갱신), C 미만이면 거리를 좁힌다. 👨‍💻 code import sys def binary_search(start, end): answer = 0 while sta.. 2022. 1. 1.
[프로그래머스] 징검다리 건너기 / 파이썬 / 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.. 2021. 12. 30.
[프로그래머스] 가장 먼 노드 / 파이썬 / 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] + .. 2021. 12. 27.
[프로그래머스] 야근 지수 / 파이썬 / Python / heap 💡 solutions 💬 야근 피로도를 최소한으로 만들기 위해서는 주어진 N시간 동안 works 리스트 안의 작업량 요소들을 가장 큰 값부터 -1씩 줄여나가는 과정이 필요하다. 💬 works와 n의 크기를 고려했을 때, 효율성을 통과하기 위해서는 값을 비교하는 로직을 위해 heaq 자료 구조를 사용해야 한다. 💬 주어진 예제 중에 3번과 같이 주어진 N시간 동안에 모든 작업량을 모두 끝마칠 수 있는 경우에는 0을 바로 리턴할 수 있도록 조건을 추가해야 한다. 👨‍💻 code import heapq def solution(n, works): answer = 0 if sum(works) 2021. 12. 26.
[프로그래머스] 정수 삼각형 / 파이썬 / python / 다이나믹 프로그래밍 오늘 파이썬을 정말 오랜만에 쓰는 거라 어색했다. 동빈나님 알고리즘 강의 중 다이나믹 프로그래밍을 공부했고, 이와 관련된 간단한 문제를 풀어보았다. 다이나믹 프로그래밍(Dynamic Programming)이란? 완전 탐색으로 시간이 오래 걸리는 프로그램의 수행 시간을, 메모리를 적절히 사용하여 효율화하는 방법이다. 이미 계산한 결과(작은 문제)를 별도 메모리 영역에 저장하여 다시 계산하지 않도록 하는 것이다. 다음을 만족하는 경우 다이나믹 프로그래밍으로 해결한다. 최적 부분 구조 -> 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있다. 중복되는 부분 문제 -> 동일한 작은 문제를 반복적으로 해결해야 한다. 다이나믹 프로그래밍의 두 가지 유형 탑다운(메모이제이션) .. 2021. 12. 23.
[프로그래머스] 문자열 내림차순으로 배치하기 / 자바 / Java / stringBuilder 💡solutions 💬 String.toCharArray()를 사용하여 문자열 s를 char형 배열(arr[ ])로 바꾼다. * 참고로 char형 배열을 하나의 문자열로도 만들 수 있다 -> String s1 = new String(charArr); 💬 arr 배열을 오름차순으로 정렬한다. 💬 stringBuilder을 사용하여 각 문자들을 appned()로 더한 후 문자열을 출력하기 위해 toString()을 사용한다. stringBuilder을 사용하는 이유 자바에서 String 객체는 변경 불가능하다. 따라서 String 객체끼리 더하는 연산은 메모리 할당과 해제를 발생시켜 성능적으로 좋지 않기 때문에 stringBuilder을 사용한다. stringBuilder은 String 객체를 더할 때 새로.. 2021. 11. 18.