-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/299310 """ # 풀이 과정 """ -- 전체 생각: sql문 구성 시 불러오는 순서 생각 후 구성 -- 부모 개체가 전년도 개체일 것인거 생각 -- group by 사용시 select문에서 group by 관련되지 않은 컬럼은 포함 불가이다. select year(A.DIFFERENTIATION_DATE) "YEAR",(B.check- A.SIZE_OF_COLONY) as "YEAR_DEV",A.ID -- join 방식 및 구성 방식 고민 후 > 작성 -- 직전 부모 개체를 파악하는 테이블 합성 > 크로스 조인? -- 연도별 그룹 묶는거로 인해 크로스 조인 오류 가능성 발생 -- 조인 방법 생각해보기 from ECOLI_DATA A, (select max(SIZE_OF_COLONY) "check",year(DIFFERENTIATION_DATE) "y" from ECOLI_DATA group by year(DIFFERENTIATION_DATE) ) as B where year(A.DIFFERENTIATION_DATE)= B.y -- 연도별 최고 무게 대장균과 지금 현재 무게의 편차를 구하기 # where A.PARENT_ID=B.ID -- 연도별? > 연도를 묶는 Group by Having 절 생각 order by year(A.DIFFERENTIATION_DATE) asc,YEAR_DEV asc """
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/299310 """ # 풀이 과정 """ -- 전체 생각: sql문 구성 시 불러오는 순서 생각 후 구성 -- 부모 개체가 전년도 개체일 것인거 생각 -- group by 사용시 select문에서 group by 관련되지 않은 컬럼은 포함 불가이다. select year(A.DIFFERENTIATION_DATE) "YEAR",(B.check- A.SIZE_OF_COLONY) as "YEAR_DEV",A.ID -- join 방식 및 구성 방식 고민 후 > 작성 -- 직전 부모 개체를 파악하는 테이블 합성 > 크로스 조인? -- 연도별 그룹 묶는거로 인해 크로스 조인 오류 가능성 발생 -- 조인 방법 생각해보기 from ECOLI_DATA A, (select max(SIZE_OF_COLONY) "check",year(DIFFERENTIATION_DATE) "y" from ECOLI_DATA group by year(DIFFERENTIATION_DATE) ) as B where year(A.DIFFERENTIATION_DATE)= B.y -- 연도별 최고 무게 대장균과 지금 현재 무게의 편차를 구하기 # where A.PARENT_ID=B.ID -- 연도별? > 연도를 묶는 Group by Having 절 생각 order by year(A.DIFFERENTIATION_DATE) asc,YEAR_DEV asc """
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/301647 """ -- bin(): 이진법 변환 -- select A.ID,A.GENOTYPE,B.GENOTYPE "PARENT_GENOTYPE" -- cross join 형식 cross join은 생략 가능! -- from ECOLI_DATA A, ECOLI_DATA B where A.PARENT_ID = B.ID and A.GENOTYPE & B.GENOTYPE = B.GENOTYPE # and cast(bin(A.GENOTYPE) as char) like CONCAT('%', CAST(BIN(B.GENOTYPE) AS CHAR)) order by A.ID
-
""" 출처:프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/72413 """ # 풀이 과정 """ 생각방향: 다익스트라 알고리즘 각각으로 구하는것과 개별로 구하는 것 중 최소값으로 구하기 두 명 요금의 합이 최소가 되는 조건 """ from collections import defaultdict from collections import deque import heapq # 요금 f = defaultdict(list) # 연결된 경로 d = defaultdict(list) def diikstra_road(start, n): # 최소 경로 갱신 v = [float("inf")] * (n + 1) # 경로를 저장 order = [[]] * (n + 1) # 처음 부분 0 v[start] = 0 q = [] heapq.heappush(q, [0, start, []]) while q: now_fare, now_dir, o = heapq.heappop(q) if v[now_dir] < now_fare: continue for end in d[now_dir]: if v[end] > now_fare + f[(now_dir, end)]: v[end] = now_fare + f[(now_dir, end)] new = o[:] new.append(end) order[end] = new heapq.heappush(q, [now_fare + f[(now_dir, end)], end, new]) return v, order def diikstra(start, n): # 최소 경로 갱신 v = [float("inf")] * (n + 1) # 처음 부분 0 v[start] = 0 q = [] heapq.heappush(q, [0, start]) while q: now_fare, now_dir = heapq.heappop(q) if v[now_dir] < now_fare: continue for end in d[now_dir]: if v[end] > now_fare + f[(now_dir, end)]: v[end] = now_fare + f[(now_dir, end)] heapq.heappush(q, [now_fare + f[(now_dir, end)], end]) return v def solution(n, s, a, b, fares): global f, d for i, j, k in fares: f[(i, j)] = k f[(j, i)] = k d[i].append(j) d[j].append(i) # s>a,s>b v, order = diikstra_road(s, n) v = diikstra(s, n) result = float("inf") # 어느 지점까지 동승 후 재 배열 for i in range(1, n + 1): count = 0 count += v[i] v_new = diikstra(i, n) # a 목적지 count += v_new[a] # b 목적지 count += v_new[b] result = min(count, result) return result
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/388352 """ # 풀이 과정 from itertools import combinations """ n: 가능한 자연수 개수 q: 시도한 자연수 배열 집합 ans: 맞춘 자연수 개수 집합 > 스무고개 아이디어 생각! """ def solution(n, q, ans): check = [k + 1 for k in range(n)] num_list = list(combinations(check, len(q[0]))) num_list = list(map(list, num_list)) result = 0 for n in num_list: for count, q_ in enumerate(q): if len(q[0]) * 2 - len(set(q_ + n)) == ans[count]: pass else: break else: result += 1 return result
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/59036 """ """ 풀이 과정 SELECT ANIMAL_ID,NAME from ANIMAL_INS where INTAKE_CONDITION="Sick" order by ANIMAL_ID """
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/59037 """ """ 풀이 과정 SELECT ANIMAL_ID,NAME from ANIMAL_INS where INTAKE_CONDITION !="Aged" order by ANIMAL_ID """
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/59403 """ """ SELECT ANIMAL_ID,NAME from ANIMAL_INS order by ANIMAL_ID asc """
-
""" 출처: 프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/68646 """ # 풀이 과정 """ 맨 끝에 두 개는 항상 살아남음 """ def solution(a): result = [] if len(a) >= 3: check = [0] * len(a) left_num = float("inf") # 좌로 확인 for l in range(len(a)): if left_num < a[l]: check[l] += 1 else: left_num = a[l] # 우로 확인 right_num = float("inf") for r in range(len(a) - 1, -1, -1): if right_num < a[r]: check[r] += 1 else: right_num = a[r] else: return len(result) return len(a) - check.count(2)
-
""" 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/150367 """ # 풀이 과정 # 왼쪽 자식 노드가 1일때 오른쪽 노드는 반드시 1이고,부모노드 또한 1이어야한다 이걸 바탕으로 확인해야한다 from collections import deque def solution(numbers): result = [] n = numbers for i in n: k = bin(i)[2:] l = len(k) # 포화이진 트리 찾기 h = 0 # 깊이 count = 0 while count < l: count += 2 ** h h += 1 # 포화 이진트리로 모형으로 변환 k = "0" * (count - l) + k # 맨 처음 노드 번호 start = (len(k) + 1) // 2 - 1 # -1인이유: 인덱스 번호 d = (start + 1) // 2 # print(start,i, "start") q = deque([start]) m = [False for _ in range(len(k))] flag = False son = [] # 자식노드 모음 while True: arrive = q.popleft() a = arrive # 방문 확인 m[a] = True # 부모 노드 0일때 if k[a] == "0": if 0 <= a + d < len(k) and k[a + d] == "1" and m[a + d] == False: # print(1,i,"d:",d,"a :",a,"a+d:",a+d) flag = True break elif 0 <= a + d < len(k) and k[a + d] == "0" and m[a + d] == False: # print(2,i) son.append(a + d) if 0 <= a - d < len(k) and k[a - d] == "1" and m[a - d] == False: # print(3,i) flag = True break elif 0 <= a - d < len(k) and k[a - d] == "0" and m[a - d] == False: # print(4,i) son.append(a - d) else: if 0 <= a + d < len(k) and m[a + d] == False: son.append(a + d) if 0 <= a - d < len(k) and m[a - d] == False: son.append(a - d) if len(q) == 0: if len(son) == 0: break else: q += son d //= 2 son = [] # print(q) if flag == True: result.append(0) # print("--------",i,"result") else: result.append(1) # print("--------",i,"result") return result