알고리즘 315

[프로그래머스, 파이썬] 숫자 짝꿍

풀이 첫 풀이 접근으로는 x의 각 문자에 해당하는 인덱스 값에 1증가, y에 해당하는 인덱스 값에 1 감소하면서 result에 추가하여 해결하려 했지만 시간초과가 발생 그래서 x와 y에 교집합에 해당하는 문자를 찾고 조건 분기로 같은 게 없다면 -1, 있지만 1개이고 그게 0이라면 개수에 상관없이 0을 return 그게 아닐 경우엔 다음 return으로 가서 count를 사용하여 적은 만큼 출력하여 해결 def solution(x,y): xy = set(x) & set(y) if not xy: return "-1" elif len(xy) == 1 and "0" in xy: return "0" return "".join(sorted([i*min(x.count(i),y.count(i)) for i in xy..

알고리즘 2024.03.07

[프로그래머스, 파이썬] 소수 찾기

풀이 처음에는 특정 수의 절반까지만 조회를 하는 코드를 적용했는데 해당 코드는 시간초과와 효율성 문제로 해결되지 못하였다. 그래서 찾아보니 특정 수의 제곱근까지만 약수를 확인하면 된다고 하여 첫 번째 풀이는 round(i**(1/2))까지 탐색하도록 하니 해결할 수 있었다. 그리고 두 번째 풀이는 에라토스테네스의 체를 사용한 방법으로 대량의 소수들을 구할 때 사용하는 알고리즘이라고 해서 사용해봤는데 해당 알고리즘은 특정 수의 배수를 범위까지 조사하며 지우는 것으로 2번째 for문에서 i에 해당하는 배수부터 시작해서, n까지 조사하되, i만큼 계속 j가 커지도록 하여 조사하기. 효율성 시간을 확인해보니 확실히 차이가 있는 것을 확인할 수 있음. 기본 풀이 def solution(n): result = [2..

알고리즘 2024.03.07

[프로그래머스, 파이썬] 뒤에 있는 큰 수 찾기

풀이 처음에는 두 번째 풀이처럼 접근을 했지만 2개의 시간초과로 인해 해결하지 못했다. 이유는 범위를 최대한 좁히려고 했지만 범위가 너무 넓은 배열을 2중 for문이기에 좁혀도 무리가 있었던것 같다. 그래서 첫 번째 풀이처럼 deque를 활용해서 우선 q가 있는지 그리고 q의 첫 번째 값의 숫자가 지금 조회하는 num보다 큰지 확인하여 그렇다면 q의 첫 번째 인덱스에 해당하는 result에 현재의 num을 적용하며 해결 from collections import deque def solution(numbers): result = [-1]*len(numbers) q = deque([(numbers[0],0)]) for i,n in enumerate(numbers[1:]): while q and q[0][0]

알고리즘 2024.03.05

[프로그래머스, 파이썬] 체육복

풀이 딕셔너리를 활용해서 학생의 수에 따른 각각의 체육복을 채워주고 이후 여분의 체육복을 가진 학생과 잃어버린 학생의 교집합에 해당하는 학생에 대한 처리 후 나머지 잃어버린 학생들에 대한 처리 결과는 dic.values()에 있는 값 중 1을 넘어가는 값만 카운팅한 합을 출력하여 해결 def solution(n, lost, reserve): dic = {i:1 for i in range(1,n+1)} for i in reserve: dic[i] += 1 s_re,s_lo = set(reserve),set(lost) for i in s_re.intersection(s_lo): dic[i] -=1 for i in s_lo-s_re: dic[i] -= 1 if dic[i] == 0: if dic.get(i-1..

알고리즘 2024.03.05

[프로그래머스, 파이썬] 대충 만든 자판

풀이 keymap으로 받아오는 자판을 딕셔너리로 각 문자를 할당 후 해당 순서에 따른 인덱스값을 딕셔너리의 값으로 할당 가장 적게 누르기를 원하기에 최소값을 넣어주기 이후 targets에 해당하는 문자를 입력하여 cnt 변수에 누적합 적용 만약 특정문자가 없는 경우 반복문 탈출하여 해결 def solution(keymap, targets): dic = dict() result = [] for keys in keymap: for idx,key in enumerate(keys): if dic.get(key): dic[key] = min(dic.get(key),idx+1) else: dic[key] = idx+1 for tg in targets: cnt = 0 for i in tg: if dic.get(i):..

알고리즘 2024.03.05

[프로그래머스, 파이썬] 모음 사전

풀이 재귀와 백트래킹을 활용한 풀이로 return이 존재하면 입력으로 주어지는 word와 같은 단어이기에 멈추고 아닐 경우 다시 이전의 해당 idx의 값을 빈 문자로 변경 하여 해결 cnt = 0 def solution(word): li = ['']*5 def find(idx): global cnt if "".join(li) == word: return cnt elif idx == 5: return else: for i in ['A','E','I','O','U']: cnt += 1 li[idx] = i if find(idx+1): return cnt li[idx] = '' return find(0)

알고리즘 2024.02.29

[프로그래머스, 파이썬] 최빈값 구하기

풀이 딕셔너리를 활용하여 해결하고자 했으며 return으로는 mx라는 중복된 각 문자의 개수가 있는 dic.values()에서 가장 큰 값이 dic.values()에서 몇 개가 있는지 확인 후 1개가 아닐 경우 -1을 아닐 경우 해당 값이 몇 번째 인덱스에 존재하는지 확인 후 해당 인덱스 값을 dic.key()에서 찾아 return 하여 해결 def solution(array): dic = dict() for i in array: if dic.get(i): dic[i] += 1 else: dic[i] = 1 mx = max(dic.values()) return -1 if list(dic.values()).count(mx) != 1 else list(dic.keys())[list(dic.values())...

알고리즘 2024.02.29