-
""" 출처:프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/42898 """ # 풀이과정 from collections import deque def solution(m, n, puddles): puddles = set(list(map(tuple, puddles))) check = [[0] * (m + 1) for _ in range(n + 1)] for i in range(2, m + 1): if not (i, 1) in puddles: check[1][i] = 1 else: break for j in range(2, n + 1): if not (1, j) in puddles: check[j][1] = 1 else: break for i in range(2, n + 1): for j in range(2, m + 1): if not (j, i) in puddles: check[i][j] = check[i - 1][j] + check[i][j - 1] else: check[i][j] = 0 return check[n][m] % 1000000007
-
""" 출처: 프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/169198 """ # 풀이 과정 def solution(m, n, startX, startY, balls): result = [] for x, y in balls: check = [] # 아래벽 if startY >= y and startX == x: pass else: d_1 = ((abs(startX - x) ** 2 + abs(-startY - y) ** 2)) check.append(d_1) # 왼쪽벽 if startX >= x and startY == y: pass else: d_2 = ((abs(-startX - x) ** 2 + abs(startY - y) ** 2)) check.append(d_2) # 위쪽벽 if startY <= y and startX == x: pass else: d_3 = ((abs(startX - x) ** 2 + abs(2 * n - startY - y) ** 2)) check.append(d_3) # 오른쪽벽 if startX <= x and startY == y: pass else: d_4 = ((abs(2 * m - startX - x) ** 2 + abs(startY - y) ** 2)) check.append(d_4) # 왼쪽 사이드 d_5 = ((abs(-startX - x) ** 2 + abs(-startY - y) ** 2)) check.append(d_5) # 왼쪽 위 사이드 d_6 = ((abs(-startX - x) ** 2 + abs(2 * n - startY - y) ** 2)) check.append(d_6) # 오른쪽 위 사이드 d_7 = ((abs(2 * m - startX - x) ** 2 + abs(2 * n - startY - y) ** 2)) check.append(d_7) # 오른쪽 아래 사이드 d_8 = ((abs(2 * m - startX - x) ** 2 + abs(-startY - y) ** 2)) check.append(d_8) result.append(min(check)) return result
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/43163 """ # 풀이 과정 from collections import deque import copy def solution(begin, target, words): english = list("abcdefghijklmnopqrstuvwxyz") words = set(words) if target not in words: return 0 elif len(target) != len(begin): return 0 max_count = len(begin) result = [] q = deque([(begin, 0)]) check = set([]) check.add(begin) while q: start, count = q.popleft() check.add(start) if start == target: result.append(count) change_words = list(start) for change in range(len(begin)): for eng in english: new = copy.deepcopy(change_words) new[change] = eng new_words = str("".join(new)) if not new_words in check and new_words in words: q.append((new_words, count + 1)) return min(result)
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/12911 """ # 풀이 과정 def solution(n): a = bin(n) b = a[2:] c = b.count("1") k = n while True: k += 1 t = bin(k) v = t[2:].count("1") if v == c: return k answer = 0 return answer
-
""" 출처:프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/42884 """ # 풀이 과정 from collections import defaultdict from collections import deque import heapq def solution(routes): check = [] car_start = defaultdict(set) car_end = defaultdict(set) for c in range(len(routes)): check.append(routes[c][0]) check.append(routes[c][1]) car_start[routes[c][0]].add(c) car_end[routes[c][1]].add(c) start = min(check) end = max(check) check.sort() now = set([]) result = 0 check_car = set([]) # 이전에 발견되던게 지금 발견 안되면 그 지점은 무조건 카메라 설치 필수 for time in check: now = now | car_start[time] # 빠지는 차량 발생 if len(car_end[time]) > 0: if len(car_end[time] - check_car) > 0: result += 1 check_car = check_car | car_end[time] | now return result
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/42583 """ # 풀이과정 def solution(bridge_length, weight, truck_weights): from collections import deque b_l = bridge_length # 최대 수용 가능 차량 수 w = weight # 무게 t_w = deque(truck_weights) now = 0 # 시간 count_w = 0 # 다리 위 차량 무게 count_c = 0 # 차량 수 check = deque([]) while t_w: k = t_w.popleft() if len(check) == 0: check.append([now, k]) count_w += k count_c += 1 else: if now - check[0][0] == b_l: # 차가 다리를 벗어나는 시점 i, j = check.popleft() count_w -= j count_c -= 1 if count_w + k <= w and count_c + 1 <= b_l: check.append([now, k]) count_w += k count_c += 1 else: t_w.appendleft(k) now += 1 # print(check) continue if count_w + k <= w and count_c + 1 <= b_l: check.append([now, k]) count_w += k count_c += 1 else: t_w.appendleft(k) now += 1 # print(check) return check[-1][0] + b_l + 1
-
""" 출처:프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/77486 """ # 내 풀이 """ 생각방향:등비급수처럼 리스트를 만든 후 맨 위에 지속적으로 더해주는 형태 목표:enroll에 적힌 판매원들의 수익을 출력 """ from collections import defaultdict import math # 판매원 수익 명단 dic check = [] name = [] # 추천인 분배 def divide(e, r, n, p): global check, name # 1원 미만으로 분배금이 떨어질 경우 분배금 발생 x while n >= 1: # 등록자 번호 위치 k = name[p] # 추천인이 없는 경우 if r[k] == "-": break # 추천인이 있는 경우 else: check[r[k]] += math.ceil(n * (0.9)) n = int(n * (0.1)) # 더 위의 상위순번 추천자 시작 p = r[k] return 0 def solution(enroll, referral, seller, amount): global check, name check = defaultdict(int) name = defaultdict(int) for i, j in enumerate(enroll): check[j] = 0 name[j] = i # 구성원 e = enroll # 추천인 찾기 r = referral # 판매 집계 데이터의 판매원 이름 s = seller # 판매 집계 데이터 a = amount for i in range(len(a)): n = a[i] * 100 # 판매량*단가 p = s[i] # 판매원 # 처음 판매자 수익금 가져가기 check[p] += math.ceil((0.9) * (n)) # 분배할 금액 n = int(n * (0.1)) # 구성원 명단,추천인 명단,남은 분배금액, 최초 판매자 divide(e, r, n, p) result = [] for f in enroll: result.append(check[f]) return result
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/17677 """ # 풀이 과정 def solution(str1, str2): # a,b 모두 공집합일 경우 자카드 유사도 1로 정의 eng = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" eng = list(eng) str1 = list(str1.upper()) str2 = list(str2.upper()) a = [] # str1 집합 b = [] # str2 집합 u = 0 n = 0 for i in range(len(str1) - 1): new = "" if str1[i] in eng: new += str1[i] else: continue if str1[i + 1] in eng: new += str1[i + 1] else: continue a.append(new) for i in range(len(str2) - 1): new = "" if str2[i] in eng: new += str2[i] else: continue if str2[i + 1] in eng: new += str2[i + 1] else: continue if new in a: u += 1 n += 1 k = a.index(new) del a[k] else: u += 1 u += len(a) if u == 0 and n == 0: return 65536 else: return int((n / u) * 65536)
-
""" 출처:프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/43162 """ # 풀이 과정 from collections import defaultdict from collections import deque import copy def solution(n, computers): network = defaultdict(set) result = [] for i in range(len(computers)): network[i].add(i) for j in range(len(computers[0])): if computers[i][j] == 1: network[i].add(j) network[j].add(i) check = deque([i for i in range(n)]) visit = set([]) new = set([]) while check: start = check.popleft() if start in visit: continue q = deque([start]) while q: v = q.popleft() visit.add(v) new.add(v) for end in network[v]: if not end in visit and not end in new: q.append(end) net = copy.deepcopy(new) result.append(net) return len(result)
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/42586 """ # 풀이 과정 def solution(progresses, speeds): from collections import deque p = deque(progresses) s = deque(speeds) result = [] count = 0 # 작업 개수 check = len(p) # 1사이클 while p: count += 1 a = p.popleft() b = s.popleft() a += b p.append(a) s.append(b) if count == check: finish = 0 for f in list(p): if f >= 100: p.popleft() s.popleft() finish += 1 else: break if finish != 0: result.append(finish) check = len(p) count = 0 else: check = len(p) count = 0 return result