Simple_PS

  • Lv2 프로그래머스(Programmers)[Mysql] 월별 잡은 물고기 수 구하기
    """ 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/293260 """ # 풀이 과정 """ select count(TIME) "FISH_COUNT",month(TIME) "MONTH" from FISH_INFO # where LENGTH >=10 Group by month(TIME) order by month(TIME) """
  • Lv2 프로그래머스(Programmers)[Mysql] 특정 물고기를 잡은 총 수 구하기
    """ 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/298518 """ # 풀이 과정 """ select count(*) "FISH_COUNT" from FISH_INFO as A join FISH_NAME_INFO as B on A.FISH_TYPE = B.FISH_TYPE where B.FISH_NAME in ('BASS','SNAPPER') # and LENGTH is not null """
  • Lv2 프로그래머스(Programmers)[Python][파이썬] 후보키
    """ 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/42890 """ # 풀이 과정 """ 틀린 이유: 0 1번이 최소성을 유지해도 1 2 3이 최소성을 만들 수도 있다는걸 생각! """ """ 틀린 이유: 0 1번이 최소성을 유지해도 1 2 3이 최소성을 만들 수도 있다는걸 생각! """ def solution(relation): from itertools import combinations from collections import deque result = 0 k = [[] for t in range(len(relation[0]))] for a in range(len(relation)): for b in range(len(relation[a])): k[b].append(relation[a][b]) k = deque(k) # 최소성을 만족하는 리스트 제거_하나로 완전한 집합 제거 for e in range(len(relation[0])): i = k.popleft() if len(i) == len(set(i)): result += 1 else: k.append(i) count = 2 # 조합 시작 수 all_check = [] # 모든 만족 수 체크 while True: check_k = [] if len(k) >= count: check = deque(list(combinations(k, count))) else: break while check: d = check.popleft() new_ = [] # 비교군 for e in range(len(k[0])): new_check = [] for f in range(len(d)): new_check.append(d[f][e]) if new_check not in new_: new_.append(new_check) else: break if len(new_) == len(k[0]): all_d = [] for a in d: all_d += a all_check.append(all_d) else: continue count += 1 # 최소성을 만족하는 수 구분 final = [] # print(all_check) all_check = deque(all_check) for a in all_check: flag = False for b in all_check: flag_in = False if a == b: continue elif len(a) <= len(b): continue elif len(a) > len(b): for c in b: if c in a: if a.count(c) >= b.count(c): continue else: flag_in = True else: flag_in = True break if flag_in == False: flag = True break if flag == False: final.append(a) print(final) return len(final) + result
  • Lv2 프로그래머스(Programmers)[Python][파이썬] 혼자서 하는 틱택토
    """ 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/160585 """ # 풀이 과정 def solution(board): k = "".join(board) a = k.count("O") b = k.count("X") if b > a: return 0 elif abs(a - b) > 1: return 0 else: if a > b: for c in range(3): if board[c][0] == board[c][1] == board[c][2] == "X": return 0 if board[0][c] == board[1][c] == board[2][c] == "X": return 0 if board[0][0] == board[1][1] == board[2][2] == "X": return 0 elif board[0][2] == board[1][1] == board[2][0] == "X": return 0 return 1 else: for c in range(3): if board[c][0] == board[c][1] == board[c][2] == "O": return 0 if board[0][c] == board[1][c] == board[2][c] == "O": return 0 if board[0][0] == board[1][1] == board[2][2] == "O": return 0 elif board[0][2] == board[1][1] == board[2][0] == "O": return 0 return 1
  • Lv2 프로그래머스(Programmers)[Mysql] 분기별 분화된 대장균의 개체 수 구하기
    """ 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/299308 """ # 풀이 과정 """ select QUARTER, count(QUARTER) "ECOLI_COUNT" # case # when month(DIFFERENTIATION_DATE) <=3 then "1Q" # when 3< month(DIFFERENTIATION_DATE)<=6 then "2Q" # when 6< month(DIFFERENTIATION_DATE)<=9 then "3Q" # else "Q4"s # end as QUARTER from (select case when month(DIFFERENTIATION_DATE) <=3 then "1Q" when month(DIFFERENTIATION_DATE) > 3 and month(DIFFERENTIATION_DATE) <= 6 then "2Q" when month(DIFFERENTIATION_DATE) > 6 and month(DIFFERENTIATION_DATE) <= 9 then "3Q" else "4Q" end as QUARTER from ECOLI_DATA) as A group by QUARTER order by QUARTER asc """
  • Lv2 프로그래머스(Programmers)[Python][파이썬] 혼자 놀기의 달인
    """ 출처:프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/131130 """ # 풀이 과정 def solution(cards): result = [] for k in range(len(cards)): # k는 처음 박스 번호 box_1 = [] a = cards[k] while True: if not cards[a - 1] in box_1: box_1.append(cards[a - 1]) a = cards[a - 1] else: score_1 = len(box_1) break check_2 = set(cards) - set(box_1) if score_1 == len(cards): result.append(0) continue for t in check_2: box_2 = [] box_2.append(t) while True: if not cards[t - 1] in box_1 and not cards[t - 1] in box_2: box_2.append(cards[t - 1]) t = cards[t - 1] else: score_2 = len(box_2) break result.append(score_1 * score_2) return max(result)
  • Lv2 프로그래머스(Programmers)[Mysql] 연도별 대장균 크기의 편차 구하기
    """ 출처:프로그래머스, 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 """
  • Lv2 프로그래머스(Programmers)[Mysql] 연도별 대장균 크기의 편차 구하기
    """ 출처:프로그래머스, 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 """
  • Lv2 프로그래머스(Programmers)[Mysql] 부모의 형질을 모두 가지는 대장균 찾기
    """ 출처:프로그래머스, 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
  • Lv3 프로그래머스(Programmers)[Python][파이썬] 합승 택시 요금
    """ 출처:프로그래머스 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
  • << 1 2 3 4 5 6 7 >>