문제 : https://programmers.co.kr/learn/courses/30/lessons/62284

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

▶ FROM 절에서 사용되는 서브쿼리

FROM 절에서 사용되는 서브쿼리를 인라인 뷰(inline view)라고 한다.

FROM 절에는 테이블 명이 오도록 되어 있다.

그런데 서브쿼리가 FROM절에 사용되면 뷰(View)처럼 결과가 동적으로 생성된 테이블로 사용할 수 있다.

임시적인 뷰이기 때문에 데이터베이스에 저장되지는 않는다.

또한, 인라인 뷰로 동적으로 생성된 테이블이어서 인라인 뷰의 컬럼은 자유롭게 참조가 가능하다.

(출처: https://snowple.tistory.com/360)

 

▶ SQL 코드

풀이 1: FROM절 서브쿼리 이용

SELECT A.cart_id 
FROM 
(SELECT cart_id FROM CART_PRODUCTS WHERE NAME='우유') as A, 
(SELECT cart_id FROM CART_PRODUCTS WHERE NAME='요거트') as B 
WHERE A.cart_id = B.cart_id

 

풀이 2: WHERE절에 그냥 NAME을 단순2개 비교하는 조건은 없기때문에, 서브쿼리로 id하나 구해준뒤 AND사용 
SELECT cart_id 
FROM CART_PRODUCTS 
WHERE cart_id in (SELECT cart_id FROM CART_PRODUCTS WHERE name='우유') 
        AND NAME='요거트' 
ORDER BY cart_id asc;

풀이 3: SELF JOIN
SELECT C.cart_id
FROM CART_PRODUCTS C, CART_PRODUCTS T
WHERE C.cart_id = T.cart_id
    AND (C.name='우유' AND T.name='요거트')
ORDER BY C.cart_id

CREATE DATABASE file;
USE file;

CREATE TABLE customer (
	user_id varchar(50),
    user_name varchar(50),
    membership int);
    
CREATE TABLE library (
	book_id int,
    book_name varchar(50),
    price int);
    
CREATE TABLE orderinfo (
	order_no int,
    buyer_id varchar(50),
    book_id int);
    
insert into customer values ('랄로123', '랄로', 2);
insert into customer values ('도파123', '도파', 1);
insert into customer values ('파카123', '파카', 3);
insert into customer values ('미야123', '미야', 4);
insert into customer values ('말구123', '말구', 1);

insert into library values (10, '메이플 1권', 30000);
insert into library values (11, '메이플 2권', 31000);
insert into library values (12, '메이플 3권', 32000);
insert into library values (13, '메이플 4권', 33000);

insert into orderinfo values (1, '랄로123', '12');
insert into orderinfo values (2, '도파123', '10');
insert into orderinfo values (3, '도파123', '11');
insert into orderinfo values (4, '파카123', '13');
insert into orderinfo values (5, '미야123', '12');
insert into orderinfo values (6, '말구123', '10');
insert into orderinfo values (7, '말구123', '13');

select*from customer;
delete from customer;
select*from library;
delete from library;
select*from orderinfo;
delete from orderinfo;

#문제: 멤버십등급이 1등급인 고객을 찾아 해당 고객의 아이디와 전체 기간에 대한 누적 구매액을 구하시오.
#ex) 
#고객 아이디   누적 구매액
# 도파123      100000

SELECT sum(price)
FROM library
WHERE book_id = '10';

SELECT user_id as '고객 아이디'
FROM customer
WHERE membership = 1;

#join으로 풀면 될듯...
#정답 쿼리문
SELECT c.user_name, sum(lb.price)
FROM customer c, orderinfo oi, library lb
WHERE c.user_id = oi.buyer_id 
	AND lb.book_id = oi.book_id
    AND c.membership = 1
GROUP BY c.user_id;

문제 : https://www.acmicpc.net/problem/11279

 

11279번: 최대 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 2^31보다 작다.

www.acmicpc.net

heapq 사용법 : https://www.daleseo.com/python-heapq/

 

[파이썬] heapq 모듈 사용법

Engineering Blog by Dale Seo

www.daleseo.com

▶ 코드

import heapq
import sys

N = int(sys.stdin.readline())
heap = []

for _ in range(N):
    num = int(sys.stdin.readline())
    if num == 0:
        if len(heap) == 0:
            print(0)
        else:
            print(heapq.heappop(heap)[1]) # (우선순위, 값) 중 '값'을 pop 
    else:
        heapq.heappush(heap, (-num,num)) # (배열, (우선순위, 값))

'코테 기본개념 > 최소힙' 카테고리의 다른 글

[백준 1927] 최소 힙  (0) 2020.05.10

문제 : https://www.acmicpc.net/problem/1927

 

1927번: 최소 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 2^31보다 작다.

www.acmicpc.net

heapq 사용법 : https://www.daleseo.com/python-heapq/

 

[파이썬] heapq 모듈 사용법

Engineering Blog by Dale Seo

www.daleseo.com

▶ 코드

import heapq
import sys

N = int(input())
heap = []

for _ in range(N):
    num = sys.stdin.readline()
    num = int(num)
    if num == 0:
        if len(heap) == 0:
            print(0)
        else:
            print(heapq.heappop(heap))
    else:
        heapq.heappush(heap, num)
       

'코테 기본개념 > 최소힙' 카테고리의 다른 글

[백준 11279] 최대 힙  (0) 2020.05.10

[백준 11654] 아스키 코드 https://www.acmicpc.net/problem/11654 

[백준 1157] 단어 공부 https://www.acmicpc.net/problem/1157

[백준 2908] 상수 https://www.acmicpc.net/problem/2908

[백준 2743] 단어  길이 재기 https://www.acmicpc.net/problem/2743

[백준 10808] 알파벳 개수 https://www.acmicpc.net/problem/10808

[백준 2902] KMP는 왜 KMP일까? https://www.acmicpc.net/problem/2902

[백준 1100] 하얀칸 https://www.acmicpc.net/problem/1100

[백준 10988] 팰린드롬인지 확인하기 https://www.acmicpc.net/problem/10988

[백준 11656] 접미사 배열 https://www.acmicpc.net/problem/11656

[백준 2864] 5와 6의 차이 https://www.acmicpc.net/problem/2864

[백준 10987] 모음의 개수 https://www.acmicpc.net/problem/10987

[백준 5598] 카이사르 암호 https://www.acmicpc.net/problem/5598

[백준 2789] 유학 금지 https://www.acmicpc.net/problem/2789

 

[백준 1427] 소트인사이드 https://www.acmicpc.net/problem/1427

[백준 10989] 수 정렬하기 3 https://www.acmicpc.net/problem/10989

[백준 1026] 보물 https://www.acmicpc.net/problem/1026

[백준 11650] 좌표 정렬하기 https://www.acmicpc.net/problem/11650

[백준 11651] 좌표 정렬하기2 https://www.acmicpc.net/problem/11651

[백준 10825] 국영수 https://www.acmicpc.net/problem/10825

[백준 1431] 시리얼 번호 https://www.acmicpc.net/problem/1431

 

▶ 코드

 

# 110 = 1,2,3,,,,9,10,,,99 -> 99 개

n = int(input())

def isHansoo(i): # i 는 세자리수 또는 네자리수(1000도 포함)
    i = str(i)
    while len(i) > 2:
        if len(i) == 3:
            if int(i[2]) - int(i[1]) == int(i[1]) - int(i[0]):
                return True
        else:
            if int(i[3]) - int(i[2]) == int(i[2]) - int(i[1]) == int(i[1]) - int(i[0]):
                return True
        return False
    
if n<=99:
    print(n)
elif n<=110:
    print(99)
else:
    c=0
    for i in range(111, n+1):
        if isHansoo(i):
            c += 1
    print(99+c)

 

▶ 코드

 

# 문제     : 서류,면접 등수가 모두 자기보다 낮은게 있으면 OUT

# 아이디어 : 1 .서류등수 기준으로 오름차순 한 다음,
#            2. 서류등수 1등인사람의 면접점수를 min값으로 두고,
#            3. 서류등수가 올라가는 순서로 되어있으므로, 그 다음번 원소의 면접등수는 앞에꺼보다 무조건 높은등수여야만 한다.
#            4. (따라서 min값을 계속 갱신해 나가야 한다)


T = int(input())

for _ in range(T):
    
    n = int(input())
    s = [0]*(n+1)
    
    # 입력
    for i in range(n):
        a, b = map(int, input().split())
        s[a] = b
    #print(s)

    min_number = s[1]           # 서류등수 1등인 사람의 면접등수 

    c = 0
    for i in range(2, len(s)):  # 서류점수 2등~ n등까지 차례대로 면접등수 검사 
        if s[i] > min_number:
            #print('걸러진것->(', i, s[i], ')')
            c += 1
        else:
            min_number = s[i]
    print(n - c)
    

# 정답 : https://pacific-ocean.tistory.com/343



'''시간초과'''
'''
#t=[[3,2],[1,4],[4,1],[2,3],[5,5]]
#t=[[3,6],[7,3],[4,2],[1,4],[5,7],[2,5],[6,1]],
# 배열에서 둘다 높아지는 경우 OUT

T = int(input())

for _ in range(T):
    n = int(input())
    t = []
    for i in range(n):
        t.append(list(map(int, input().split())))
        
    t1 = sorted(t, key=lambda x: x[0])
    t2 = sorted(t1, key=lambda x: x[1])
    #print(t2)

    c = 0
    i = 0
    j = 1
    length = len(t2)

    while j < len(t2):
        if t2[i][0] > t2[j][0] or t2[i][1] > t2[j][1]:
            i += 1
            j += 1
        else:
            #print('삭제할것->', t2[j])
            t2 = t2[:j] + t2[j+1:]
            #print('t2다시 ->', t2)
            c += 1
                
    print(length-c)
'''

'코테 기본개념 > 그리디' 카테고리의 다른 글

[백준 2875] 대회 or 인턴  (0) 2020.05.05
[백준 10610] 30  (0) 2020.05.05
[백준 1931] 회의실배정  (0) 2020.05.03
[백준 5585] 거스름돈  (0) 2020.05.03
[백준 11047] 동전 0  (0) 2020.05.03
[백준 11399] ATM  (0) 2020.05.03

 

▶ 코드

 

woman,man,k = map(int, input().split())

team = 0
while woman>=2 and man>=1 and woman+man>=k+3:
    woman -=2
    man -=1
    team += 1
print(team)



# 정답 : https://yongku.tistory.com/entry/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%80-2875%EB%B2%88-%EB%8C%80%ED%9A%8C-or-%EC%9D%B8%ED%84%B4-%ED%8C%8C%EC%9D%B4%EC%8D%ACPython

'코테 기본개념 > 그리디' 카테고리의 다른 글

[백준 1946] 신입 사원  (0) 2020.05.05
[백준 10610] 30  (0) 2020.05.05
[백준 1931] 회의실배정  (0) 2020.05.03
[백준 5585] 거스름돈  (0) 2020.05.03
[백준 11047] 동전 0  (0) 2020.05.03
[백준 11399] ATM  (0) 2020.05.03

▶ 코드

 

# 30, 60, 90, 120, 150, 180...
# 80875542 -> 88755420

n = int(input())
n2 = list(map(int, str(n)))

if 0 not in n2:         # 0이 포함되어있지 않다면
    print(-1)
elif sum(n2) % 3 != 0:  # 3의 배수가 아니라면 
    print(-1)
else:
    n2 = sorted(n2, reverse=True)   # 내림차순 정렬 
    
    answer = ''
    for a in n2:
        answer += str(a)
    print(answer)
    

'코테 기본개념 > 그리디' 카테고리의 다른 글

[백준 1946] 신입 사원  (0) 2020.05.05
[백준 2875] 대회 or 인턴  (0) 2020.05.05
[백준 1931] 회의실배정  (0) 2020.05.03
[백준 5585] 거스름돈  (0) 2020.05.03
[백준 11047] 동전 0  (0) 2020.05.03
[백준 11399] ATM  (0) 2020.05.03

 

▶ 코드

 

import sys

def greedy(temp):
    c = 0
    start = 0
    
    for t in temp:
        if t[0] >= start:
            start = t[1]
            c += 1
            print(start)
    return c

if __name__ == "__main__":
    N = int(sys.stdin.readline())
    temp = []
    for i in range(N):
        start, end = map(int, sys.stdin.readline().split())
        temp.append((start, end))
    temp = sorted(temp, key=lambda t:t[0]) # 시작시간 기준으로 오름차순 정렬
    print('시작시간 기준 = ',temp)
    temp = sorted(temp, key=lambda t:t[1]) # 종료시간 기준으로 오름차순 정렬
    print('시작+종료시간 기준 = ',temp)
    # 1. 이렇게하면, 기존의 시작 시간 기준으로 정렬한 값들을 '최대한 유지'하려 하기 때문에, 종료 시간이 같다면, 시작 시간이 빠른 기준으로 정렬된 결과가 나타난다. ex.. (1,2), (2,2)
    # 2. 종료 시간이 짧은것 먼저 정렬했기 때문에 더 많은 회의들을 추가할 수 있다. 

    # 시작시간 기준 =  [(0, 6), (1, 4), (2, 13), (3, 5), (3, 8), (5, 7), (5, 9), (6, 10), (8, 11), (8, 12), (12, 14)]
    # 시작+종료시간 기준 =  [(1, 4), (3, 5), (0, 6), (5, 7), (3, 8), (5, 9), (6, 10), (8, 11), (8, 12), (2, 13), (12, 14)]
    
    print(greedy(temp))

'코테 기본개념 > 그리디' 카테고리의 다른 글

[백준 1946] 신입 사원  (0) 2020.05.05
[백준 2875] 대회 or 인턴  (0) 2020.05.05
[백준 10610] 30  (0) 2020.05.05
[백준 5585] 거스름돈  (0) 2020.05.03
[백준 11047] 동전 0  (0) 2020.05.03
[백준 11399] ATM  (0) 2020.05.03

▶ 코드

 

import sys

if __name__ == "__main__":
    N = int(sys.stdin.readline()) # N은 1000미만의 정수
    c = 0
    N = 1000 - N
    while N > 0:
      if N >= 500:
        N-=500
        c += 1
      elif N >= 100:
        N-=100
        c += 1
      elif N >= 50:
        N-=50
        c += 1
      elif N >= 10:
        N-=10
        c += 1
      elif N >= 5:
        N-=5
        c += 1
      elif N >= 1:
        N-=1
        c += 1
    print(c)

'코테 기본개념 > 그리디' 카테고리의 다른 글

[백준 1946] 신입 사원  (0) 2020.05.05
[백준 2875] 대회 or 인턴  (0) 2020.05.05
[백준 10610] 30  (0) 2020.05.05
[백준 1931] 회의실배정  (0) 2020.05.03
[백준 11047] 동전 0  (0) 2020.05.03
[백준 11399] ATM  (0) 2020.05.03

▶ 코드

 

N, k = map(int, input().split(' '))

lst = [0]*N
for i in range(N):
    lst[i] = int(input()) # [1,5,10]

lst = sorted(lst, reverse=True)
#print(lst)
      
c = 0
while k > 0:
  for i in range(len(lst)):
    if k >= lst[i]:
        q = k//lst[i]
        k -= q * lst[i]
        c += q
print(c)

'코테 기본개념 > 그리디' 카테고리의 다른 글

[백준 1946] 신입 사원  (0) 2020.05.05
[백준 2875] 대회 or 인턴  (0) 2020.05.05
[백준 10610] 30  (0) 2020.05.05
[백준 1931] 회의실배정  (0) 2020.05.03
[백준 5585] 거스름돈  (0) 2020.05.03
[백준 11399] ATM  (0) 2020.05.03

▶ 코드

# 3 1 4 3 2
# 1 2 3 3 4 
# 1 3 6 9 13 -> 32

N = int(input())
lst = list(map(int, input().split(' ')))
#print(lst)
lst.sort()
#print(lst)

s = 0
for i in range(len(lst)):
    s += sum(lst[:i+1])
print(s)

'코테 기본개념 > 그리디' 카테고리의 다른 글

[백준 1946] 신입 사원  (0) 2020.05.05
[백준 2875] 대회 or 인턴  (0) 2020.05.05
[백준 10610] 30  (0) 2020.05.05
[백준 1931] 회의실배정  (0) 2020.05.03
[백준 5585] 거스름돈  (0) 2020.05.03
[백준 11047] 동전 0  (0) 2020.05.03