알고리즘 384

[프로그래머스] 의상

# 한참 고민하다가 다른 분의 힌트를 받고 해답을 알게 됨. # 힌트는 각 섹션별로 착용하지 않는걸 생각한다면 편할 것 같다. # 예를 들어 아래와 같이 종류가 세가지가 있고 종류마다 2가지의 아이템인 (red, blue)이 있다고 했을 경우 # ["headgear", "eyewear", "underwear"] # red, blue, no 이렇게 3가지의 경우로 생각한다면 # 각 아이템 별로 개수를 곱한 다음 모든 아이템을 안입는(no) 경우인 # headgear-no, eyewear-no, underwear-no 인 경우를 하나 뺀 걸 return 하는 방식. from math import prod def solution(clothes): dic = {} for i in clothes: try: dic..

알고리즘 2023.06.25

[프로그래머스] [1차] 캐시

# 정답1 (deque의 maxlen 사용) # rotate 코드보다 더 빠른거 같음! from collections import deque def solution(cacheSize, cities): if cacheSize == 0: return len(cities)*5 cities = [ i.upper() for i in cities] result, cnt, cnt_idx, cache_li = 0, 0, 0, deque(maxlen=cacheSize) while cnt < len(cities): if cities[cnt] in cache_li: # 지역이 존재할 경우 가장 앞에 있는 값을 맨 뒤로 보내면서 +1 해주기 del cache_li[cache_li.index(cities[cnt])] cache..

알고리즘 2023.06.23

[프로그래머스] 행렬의 곱셈

우선 행렬의 곱셈에 대해 모를 경우 아래의 유튜브 링크로 들어가서 확인하면 좋을듯하다. (나도 몰랐으니까 ㅎ..) https://www.youtube.com/watch?v=9BFQ3_bxfUs # 어려웠던 부분은 행렬의 곱셈에 대해서 몰랐었던 부분? def solution(arr1, arr2): answer = [[0]*len(arr2[0]) for _ in range(len(arr1))] for i in range(len(arr1)): # arr1 행 for j in range(len(arr2[0])): # arr2 열 for x in range(len(arr2)): # arr2 행 answer[i][j] += arr1[i][x]*arr2[x][j] return answer

알고리즘 2023.06.22

[프로그래머스] n^2 배열 자르기

# 왼쪽, 오른쪽 사이에 해당하는 값으로 몫과 나머지를 구한 다음 큰 값에 +1 시켜줘서 추가해주기 def solution(n, left, right): result = [] for i in range(left, right+1): x, y = i//n, i%n if x >= y: result.append(x+1) else: result.append(y+1) return result # 시간초과 # 해당 풀이는 처음 접근한 방식으로 2차원 배열처럼 생각을 한 상태로 # 2중 for문을 돌려 해결해보려 했음. # 추후 시간 초과로 인해 첫번째 for문에서 left 값보다 cnt 값이 더 작으면 # n만큼 cnt에 추가해주는 형식으로 시간을 줄이려 했지만 엄청 빡빡한 타임으로 안됨... def solution..

알고리즘 2023.06.21

[프로그래머스] 연속 부분 수열 합의 개수

# 원래 dic의 값이 0 이 아닐때도 조건문을 통해 제어를 했는데 굳이 인가 싶어서 뺌 # 아래 코드보다 시간 효율이 더 좋음 def solution(elements): dic, ln = {i:0 for i in range(sum(elements)+1)}, len(elements) for i in range(ln): hap = elements[i] dic[hap] = hap for j in range(i+1, i+ln): hap += elements[j%ln] dic[hap] = hap return len([ i for i in list(dic.values()) if i != 0]) # 연결 리스트로 푼게 아닌 기존 배열을 두배로 늘려서 하다보니 엄청 시간이 길어짐 # 풀어지긴 함 def solutio..

알고리즘 2023.06.20

[프로그래머스] H-Index

# 정답 def solution(citations): h, c_ln, result = 0, len(citations), 0 for i in range(1, c_ln+1): ln = len([j for j in citations if j >= i]) if not (ln >= i): break elif ln >= i: result = i return result # 실패 # 이유는 8번 줄의 if not 부분으로 가는 경우가 없이 # for 문이 정상으로 마무리 되는 경우가 있기 때문! 9번 Case!! def solution(citations): h, c_ln, result = 0, len(citations), 0 for i in range(1, c_ln+1): ln = len([j for j in cit..

알고리즘 2023.06.19

[프로그래머스] 괄호 회전하기

# deque를 가져와서 rotate를 사용함으로 회전을 편하게 할 수 있었음. from collections import deque def solution(s): l_s = len(s) if l_s%2: return 0 q, cnt = deque(s), 0 for _ in range(l_s): flag, stack = True, [] for i in range(l_s): if q[i] in ['[', '{', '(']: stack = stack + [q[i]] else: if stack == []: flag = False break else: if (stack[-1] == '[' and q[i] == ']') or (stack[-1] == '{' and q[i] == '}') or (stack[-1] ..

알고리즘 2023.06.15

[프로그래머스] N개의 최소공배수

# 유클리드 호제법을 활용한 풀이 # 해당 문제에서 import math로 사용한 lcm을 사용할 수 없었다. 왜지..? def gcd(x,y): while y: x,y = y, x%y return x def lcm(x,y): return (x*y)//gcd(x,y) def solution(arr): result = 0 for i in arr: if result == 0: result = i else: result = lcm(result, i) return result # import math로 사용한 풀이 def solution(arr): result = 0 for i in arr: if result == 0: result = i else: result = math.lcm(result, i) retur..

알고리즘 2023.06.13