⚡️algorithm 98

[DFS, 백트래킹, 조합] 프로그래머스 lv.2 양궁 대회

프로그래머스 lv.2 양궁 대회문제 바로가기문제 요약어피치가 양궁을 먼저 다 쐈다. 화살의 수와 어피치의 과녘 현황을 입력값으로 줬을 때, 라이언이 어떻게 과녘을 맞춰야 최대 점수차이로 이길 수 있는지 반환해라.주의할 점최대 점수 차이가 같을 경우, 낮은 점수에 많이 맞은 경우를 답으로 처리한다.배열에 해당하는 과녘은 10점 과녘부터 0점까지 순서대로 주어진다.문제 접근완전 탐색에 조기종료 조건이 가능하므로 DFS를 사용한 백트래킹과녘의 수가 고정되어 있기 때문에 점수 현황을 고정 길이의 배열로 만들어서 과녘의 선택/ 미선택 두개의 정보를 담을 수 있다.조기 종료 조건 (유망함수)남은 화살이 더이상 없을 때.과녘의 끝에 다다랐을 때.오답노트1. recursive overflow 에러 발생.- DFS 접근..

다익스트라와 이진트리 (feat. min heap 구현)

다익스트라가 사용되는 때알고리즘 접근법 중 다익스트라는 가중치가 있는 그래프에서 최소 비용 경로를 구할 때 주로 사용한다. 파이썬에서의 다익스트라는 큐에서 가장 최소값을 꺼내기 위해 내장 라이브러리인 heapq를 사용하면 됐었지만 기본 자바스크립트에서는 heap을 지원하지 않기 때문에 직접 구현해서 쓸 수 있다.다익스트라의 구현큐에서 가장 최소값을 꺼내기 위해 heap이 아닌 우선순위큐를 구현해서 할 수도 있지만, 두 방식은 시간 복잡도에 큰 차이가 있다.구체적인 구현 방식을 서술해보자면, 우선순위 큐(Priority Queue)는 요소의 추가(삽입, push) 혹은 제거(꺼내기, pop)때 마다 정렬을 새로 해줘야 한다. 자바스크립트의 내장 sort는 N*logN 의 비용이 들고, 제거할 때 조차 배열..

[구현, 그리디?] 프로그래머스 lv2. 과제 진행하기

문제 프로그래머스 문제 바로가기 요약 * 1. 정해진 시간이 되면 과제를 시작한다. * 2. 진행중이던 건 멈춘다. * 3. 정해둔거 끝나면 멈춰둔거 한다 * 4. 멈춰둔거 여러개면 마지막에 하던거 한다 => 스택 접근 ''' CASE 1. done : 다음꺼까지 남은 시간 >= 소요시간 1-1. wait 리스트 소모 CASE 2. not done : 다음꺼까지 남은 시간 < 소요시간 2-1. wait 으로 넘김 남은 시간 업데이트 ''' def solution(plans): # 과목 , 시작, 소요시간 def getTime(time_str): h, m = map(int, time_str.split(':')) time_int = h*60+m return time_int wait = [] done = []..

[투포인터, 정렬된 배열의 구간합] 프로그래머스 lv2. 연속된 부분 수열의 합

문제 : 연속된 부분 수열의 합 프로그래머스 문제 바로가기 조건 1. 오름차순으로 정렬된 배열 조건 2. 배열의 길이 ≤ 1,000,000 요구사항 : 구간합이 특정 값이 되었을 때, 구간의 인덱스를 반환하라 단, 여러 구간이라면 길이가 짧은 구간을 채택하고, 길이마저 같다면 시작인덱스가 작은 구간을 채택하라. 접근 배열의 크기가 10^6이기 때문에 O(n^2) 알고리즘은 사용할 수 없다. 정렬된 배열의 특성을 최대한 이용한다. 구간합에 관한 문제이기 때문에 투포인터를 사용할 수 있다. (이진탐색은 특정 값을 찾는 데 사용) 내 풀이 def solution(sequence, k): sp = 0 ep = 1 tot = sequence[0] sequence+=[0] answer = [] chance = 1 ..

[합집합, 교집합, 병합 정렬] 프로그래머스 lv2. 뉴스클러스터링

문제 : 프로그래머스 lv2. 뉴스클러스터링 (바로가기)[https://school.programmers.co.kr/learn/courses/30/lessons/17677] 문제 요구사항 // 1. str1과 str2를 정규식을 사용하여 영문만 남기고 숫자, 특수문자 등은 모두 " " 공백처리한다. // 2. 문자열 배열을 구한다. // 영문이 연속으로 나와야 문자열이 유효하다. 따라서 두번째 문자에 " " 공백이 있으면 제외한다. // 3. 문자열 배열의 합집합을 구한다. // 4. 문자열 배열의 교집합을 구한다. // 5. 답을 구한다.내 풀이 def solution(str1, str2): def getJachard(a,b): common=[] for each in a: if each in b: b...

[스택, 수 비교] 프로그래머스 lv2. 뒤에 있는 큰 수 찾기

lv.2 뒤에 있는 큰 수 찾기 문제 바로가기 다른 분 풀이.. # def solution(numbers): # answer = [-1]*(len(numbers)) # stack = [] # for i in range(len(numbers)): # while stack and numbers[stack[-1]] < numbers[i]: # answer[stack.pop()] = numbers[i] # stack.append(i) # return answer * 다시 써보기.. 어렵다..... def solution(numbers): long = len(numbers) answer = [-1] * long stack = [] # for i in range(long): while stack and number..

[프로그래머스] lv.0 옹알이(1) - 반복문 주의

https://school.programmers.co.kr/learn/courses/30/lessons/120956# 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 순열 조합으로 풀어 봄 틀린 풀이 from itertools import permutations def solution(babb): answer = 0 possible = ["aya", "ye", "woo", "ma"] cand = set() for i in range(1,5): for comb in permutations(possible, i): cand.add(''.join(comb)) #..

[gcd, 최대공약수] 프로그래머스 lv 0. 유한소수 판별하기

문제 문제 바로가기 유클리드 호제법이란 정수 A와 B가 있다. A * s + B * t = r 을 만족하는 정수 s와 t가 있다는 것을 전제로 최대공약수 r을 구한다. 128과 42를 예시로 식을 풀어보자면, 128_s + 42_t = 최대공약수 r 128 = 42 * 어떤 몫 + r 형식으로 표현하고, 42와 r을 계속해서 풀어나가다 보면 나머지가 0이 된다. 그 때 마지막으로 대입됐던 수(이전 식의 나머지였던 수)가 128과 42의 최대 공약수가 된다. 128과 54 예시 128 = 54 * 2 + 20 54 = 20 * 2 + 14 20 = 14 * 1 + 6 14 = 6 * 2 + 2 6 = 2 * 3 + 0 따라서 2가 128과 54의 최대공약수이다. gcd는 최대공약수를 구할 때 사용한다. 파..

[set, 집합, 기본] 프로그래머스. 외계어 사전

https://school.programmers.co.kr/learn/courses/30/lessons/120869 아래의 문제 조건이 집합으로 풀 수 있게 했음 dic과 spell 모두 중복된 원소를 갖지 않습니다. 집합을 이용한 풀이 def solution(spell, dic): spell = set(spell) for word in dic: if not spell-set(word): return 1 return 2 원래 내 풀이 def solution(spell, dic): answer = 2 checked = [0]*len(spell) check_dir = {key:idx for idx, key in enumerate(spell)} for word in dic: for letter in word:..

[DP] 백준 9184. 신나는 함수실행

백준 9184. 신나는 함수실행 문제 요약 : 재귀함수로 돌리면 너무 오래 걸린다! 어떻게 할까? 다음과 같은 재귀함수 w(a, b, c)가 있다. if a 20, then w(a, b, c) returns: w(20, 20, 20) if a < b and b < c, then w(a, b, c) returns: w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) otherwise it returns: w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) 위의 함수를 구현하는 것은 매우 쉽다. 하지만, 그대로 구현하면 값을 구하는데 매우 오랜 시간이 걸린다. (예를 들면, a=15, b=15, c=15) a, b..