반응형

프로그래머스에 새로 생겼길래 풀어봤다. 풀이 자체는 생각 보다 어렵지 않아서 한 번에 포스팅한다!

 

 

1. 로또의 최고 순위와 최저 순위

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

해결 방법 : 단순 구현

def solution(lottos, win_nums):
    zeros = lottos.count(0)
    correct = [i for i in lottos if i in win_nums] # 맞은 개수
    highest  = 7 - len(correct) - zeros if len(correct) + zeros > 0 else 6 # 모든 zero가 맞음
    lowest  = 7 - len(correct) if len(correct) > 0 else 6 # 모든 zero가 틀림
    
    return [highest, lowest]

 

 

2. 행렬 테두리 회전하기

https://programmers.co.kr/learn/courses/30/lessons/77485

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

해결 방법 : 단순 구현

  • 깔끔하게 풀어보려고 생각해봤지만, 문제 조건상 실제로 테이블을 회전시키는 방법밖에 없는 것 같다.
def solution(rows, columns, queries):
    answer = []
    S = [[(i * columns + j + 1) for j in range(columns)] for i in range(rows)]

    for r1, c1, r2, c2 in queries:

        temp = S[r1-1][c1-1] # 처음에 변경되는 값 유지
        minv = temp # 현재 회전에서의 최솟값 변수
        for u in range(r1-1, r2-1): # 왼쪽 테두리 값 이동
            S[u][c1-1] = S[u+1][c1-1]
            minv = min(minv, S[u+1][c1-1])
        for l in range(c1-1, c2-1): # 아래쪽 테두리 값 이동
            S[r2-1][l] = S[r2-1][l+1]
            minv = min(minv, S[r2-1][l+1])
        for d in range(r2-1, r1-1, -1): # 오른쪽 ..
            S[d][c2-1] = S[d-1][c2-1]
            minv = min(minv, S[d-1][c2-1])
        for r in range(c2-1, c1-1, -1): # 위쪽 ..
            S[r1-1][r] = S[r1-1][r-1]
            minv = min(minv, S[r1-1][r-1])
        S[r1-1][c1] = temp
        
        answer.append(minv)
        
    return answer

 

 

3. 다단계 칫솔 판매

https://programmers.co.kr/learn/courses/30/lessons/77486

 

코딩테스트 연습 - 다단계 칫솔 판매

민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,

programmers.co.kr

 

해결 방법 : DFS 완전탐색

  • 문제에 주어진 Input들로 트리를 구성, 판매 금액 딕셔너리 저장
  • dfs postorder 방식으로 자식노드들의 수익 10%를 받도록 한다.
    • 한 node의 총 이익금의 10%가 아니라, 모든 개별 판매 내역마다 각자 10%씩 상위로 부여되는 것을 고려해야한다.
    • 따라서 각 판매 내역을 리스트에 저장하여 각 요소들을 기준으로 10% 연산하여 상위 node로 올려주었다.
    • 결국, 특정 노드의 순수익은 = sum(연관된 판매 내역 리스트) - sum(각 판매 내역별 10% 리스트)
from collections import defaultdict
import sys
sys.setrecursionlimit(20000)

def solution(enroll, referral, seller, amount):
    T = defaultdict(list) # 조직도 트리
    S = defaultdict(list) # {직원 : [판매금액1, 판매금액2, ..]} (조건에 seller 중복이 된다고 했으므로)
    R = dict() # {직원 : 최종 수익}

    for node, p in zip(enroll, referral):
        T[p].append(node)
    for s, a in zip(seller, amount):
        S[s].append(a*100)
        
    def dfs(node):
        tot = S[node] if S.get(node) != [] else [0]

        for c in T[node]:
            tot.extend(dfs(c)) # 각 판매내역을 리스트로 저장하기 때문에 extend
        
        R[node] = sum(tot)
        per10 = [int(t/10) for t in tot if int(t/10) > 0] # 상위로 보내지는 10% 금액들
        R[node] -= sum(per10)
        return per10

    dfs("-")
    answer = [R[e] for e in enroll]

    return answer

 

4. 헤비 유저가 소유한 장소

 

해결 방법 : 서브쿼리

  • 서브쿼리로 헤비유저를 산정하고 해당 host_id를 갖는 id를 추출하면 된다.
SELECT *
FROM places as p
WHERE host_id in (
    SELECT host_id
    FROM places
    GROUP BY host_id
    HAVING count(id) > 1)
ORDER BY ID
반응형

'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글

백준 5430 : AC  (0) 2021.06.07
백준 1033 : 칵테일  (0) 2021.05.29
매출 하락 최소화  (0) 2021.05.19
백준 1019 : 책 페이지  (0) 2021.05.18
백준 1016 : 제곱ㄴㄴ수  (0) 2021.05.17

+ Recent posts