Algorithm
[프로그래머스] 2022 KAKAO TECH INTERNSHIP/등산코스 정하기/파이썬/python
💡 solutions 💬 heap 자료 구조 사용, 각 출입구들을 노드로 넣고 다익스트라 알고리즘 탐색 💬 1. 산봉우리는 한 개만 지나야 하므로 탐색 노드가 산봉우리인 경우 탐색 중단 💬 2. 해당 노드를 지났던 기존 intensity(dist[node])가 현재의 intensity 보다 작은 경우는 이미 더 작은 intensity로 해당 노드를 지날 수 있다는 의미이므로 탐색 중단하도록 조건 처리 💬 각 노드의 intensity를 저장하는 dist 배열에서 값을 업데이트 할 때는 최대 intensity (현재 intensity, 다음 노드의 intensity 중 큰 값)로 저장한다. 💬 산봉우리들을 비교하여 가장 작은 intensity를 갖는 경우를 답으로 반환한다. 단, intensity가 동일한 ..
[프로그래머스] 2022 KAKAO TECH INTERNSHIP/두 큐 합 같게 만들기/파이썬/python
💡 solutions 💬 첫 번째 풀이, deque 자료 구조 활용하여 반복문으로 두 큐의 합 같게 연산, 두 큐의 최대 길이만큼 반복했는데도 두 큐의 합을 같게 하지 못하면 -1 반환하는 조건 추가 💬 두 번째 풀이, 두 개의 큐를 하나의 큐로 합쳐서 투 포인터로 두 큐의 합이 같아지는지 확인 🤖 code # 첫 번째 풀이 from collections import deque def solution(queue1, queue2): queue1, queue2 = deque(queue1), deque(queue2) sum1, sum2 = sum(queue1), sum(queue2) target_sum = (sum1 + sum2) // 2 cnt = 0 if max(queue1) > target_sum or ..
[프로그래머스] 2022 KAKAO TECH INTERNSHIP/성격 유형 검사하기/파이썬/python
💡 solution 💬 질문에 따른 선택을 기준으로, 딕셔너리 자료 구조 활용하여 각 성격 유형별 점수를 먼저 구한다. 💬 4가지 각 지표별로 두 가지 성격 유형의 점수를 비교하여 최종적으로 성격 유형을 결정한다. 👨💻 code def solution(survey, choices): charactors_dict = { 'R': 0, 'T': 0, 'C': 0, 'F': 0, 'J': 0, 'M': 0, 'A': 0, 'N': 0, } # 모든 질문의 성격 유형 점수 계산 for i in range(len(survey)): current_question = survey[i] current_answer = choices[i] default_score = 4 if current_answer < default..
[프로그래머스] 기지국 설치 / 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..
알고리즘 문제 풀이 700문제 기념🎉
그 동안 풀었던 알고리즘 문제 수가 벌써 700개 넘었다. 지금 세어보니 총 707문제였다. 알고리즘 문제 풀이는 SWEA, 백준, 프로그래머스를 이용해서 풀어왔고, 프로그래머스 같은 경우 반복해서 문제를 연습하고 싶어 계정을 2개로 만들어서 사용했다. 한번 해결했던 문제는 다른 언어로 해결해도 추가로 카운트 되지 않고, 코드업에서 풀었던 문제들은 포함하지 않았기 때문에 실질적으로 해결한 문제 수는 더 많긴 하다. 중간에 쉬었던 기간도 있지만 20년도부터 알고리즘 문제 풀이를 틈틈이 진행해왔고 돌아보니 생각보다 많은 문제를 해결한 거 같아 뿌듯하다. 알고리즘 문제 풀이를 시작한 계기는 원래 기업 채용을 위한 것이었지만, 주어진 문제에 대해 고민하고 해결했던 과정에서 논리적으로 생각하는 힘과 문제해결 능력..
[백준] 공유기 설치 / 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..
[프로그래머스] 징검다리 건너기 / 파이썬 / 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 객체를 더할 때 새로..