https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit 

 

프로그래머스

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

programmers.co.kr


 

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit 

 

프로그래머스

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

programmers.co.kr


<스택/큐>
Q.같은 숫자는 싫어 

def solution(arr):
    answer = []
    for a in arr : 
        if a not in answer or a!= answer[-1] : 
            answer.append(a)
    return answer



Q.기능개발 #***

'''
#틀림 --> x > dq[0] 에서 부등호 빠짐 ㅠ x>=q[0] 이여야함 
#반례 : [90, 90, 90, 90],[30, 1, 1, 1],[1, 3] 
from collections import deque 
def solution(progresses, speeds):
    answer = []
    dq=[]
    for p,s in zip(progresses,speeds) : 
        n=(100-p)//s 
        if n*s+p < 100 : 
            n+=1 
        dq.append(n)
        
    dq=deque(dq)
    cnt=0
    
    while True : 
        if len(dq)==0 : 
            break 
            
        x=dq.popleft()
        cnt=1
        while dq and x > dq[0] : 
            dq.popleft()
            cnt+=1
        answer.append(cnt)
    
    return answer

'''
from collections import deque 
def solution(progresses, speeds):
    answer = []
    dq=[]
    dq=deque(dq)
    
    for p,s in zip(progresses,speeds) : 
        n=(100-p)//s 
        while True : 
            if n*s+p < 100 : 
                n+=1
            else : 
                break
        
        dq.append(n)
    
    while True : 
        if len(dq)==0 : 
            break 
        if len(dq)==1 : 
            answer.append(1)
            break 
            
        x=dq.popleft()
        cnt=1
        while dq and x >= dq[0] : 
            dq.popleft()
            cnt+=1
            
        answer.append(cnt)
    
    return answer


Q.올바른 괄호 

def solution(s):
    answer = True
    stack=[] 
    
    if s[0] == ')' : 
        return False 
    
    for x in s : 
        if x=='(' : 
            stack.append(x) 
        else : #')'
            if len(stack)==0 : 
                return False 
            stack.pop()
            
    if len(stack) > 0 : 
        return False

    return True


Q.프로세스 #***

from collections import deque 
def solution(priorities, location):
    answer = 0
    dq = deque() 
    for i,p in enumerate(priorities) :  
        dq.append((i,p))
        
    while True : 
        x=dq.popleft()
        if any(x[1]<d[1] for d in dq) : 
            dq.append(x)
        else : 
            answer+=1
            if x[0] == location :
                break
    return answer
#queue =  [(i,p) for i,p in enumerate(priorities)]


Q.다리를 지나는 트럭 #***

'''
#틀림
from collections import deque 
def solution(bridge_length, weight, truck_weights):
    answer = 0
    dq=deque([0]*bridge_length)
    dq=deque(dq)
    truck_weights = deque(truck_weights)
    while True : 
        if len(truck_weights) == 0 and len(dq) == 0 : 
            break 
            
        if len(truck_weights) > 0 and (sum(dq)+truck_weights[0]) <= weight : 
            dq.append(truck_weights.popleft())
        else : 
            dq.popleft()
        answer+=1
        
    return answer

'''
from collections import deque 
def solution(bridge_length, weight, truck_weights):
    answer = 0
    
    #시간 초과 / 5번 테스트 케이스만 .. >> sum() 함수 : O(n) 이라 김  um보다는 변수를 가감하는 방식으로 변경해야 
    dq=deque([0]*bridge_length)
    truck_weights = deque(truck_weights)
    sum_truck= 0 
    
    while dq:
        answer+=1
        sum_truck-=dq.popleft()
        if truck_weights:
            #if sum(dq)+truck_weights[0]<=weight:
            if sum_truck+truck_weights[0]<=weight:
                x=truck_weights.popleft()
                sum_truck+=x
                dq.append(x)
            else:
                dq.append(0)
    
    return answer


Q.주식가격 #***

def solution(prices):
    answer = []
    
    '''
    #테스트 케이스 1번 제외 하고 틀림 
    #반례 [4,5,1,2,6,1,1], [2,1,4,2,1,1,0] 
    for i, p in enumerate (prices) : 
        cnt=0
        print(p, prices[i+1:])
        for j in prices[i+1:] : 
            if p <= j : 
                cnt+=1
        answer.append(cnt)
    
    '''

    '''
    #효율성 테스트 모두 실패 
    for i,p in enumerate (prices) : 
        cnt=0
        stack=[]
        for t in prices[i+1:] : 
            stack.append(t)
            if stack[-1] < p :
                cnt=len(stack)
                break
            else : 
                cnt+=1
        answer.append(cnt)
    '''

    return answer

from collections import deque 
def solution(prices):
    answer = []
    dq=deque(prices)
    
    while dq : 
        x=dq.popleft()
        cnt=0
        for i in dq : 
            cnt+=1 
            if i < x :
                break 
        answer.append(cnt)
    return answer

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit 

 

프로그래머스

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

programmers.co.kr


<해시> 
Q.완주하지 못한 선수 #***

def solution(participant, completion):
    answer = ''
    '''
    #틀림. 효율성 테스트 모두 실패 
    for c in completion : 
        participant.remove(c)
    answer=participant[0]
    '''
    tmp=dict() 
    for p in participant : 
        tmp[p]=tmp.get(p,0) +1
    for c in completion :
        tmp[c]=tmp[c]-1
    
    for t in tmp.keys() :
        if tmp[t] > 0 :
            answer=t
            break
    
    return answer

'''
import collections
def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]
'''
'''
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[len(participant)-1]
'''


Q.폰켓몬

def solution(nums):
    answer = 0
    cnt=len(nums)
    nums=set(nums)
    if len(nums) > cnt/2 :
        answer = cnt/2 
    else : 
        answer=len(nums)
    return answer
    #return min(len(ls)/2, len(set(ls)))


Q.전화번호 목록 #***

def solution(phone_book):
    '''
    #틀림 ㅠ 
    answer = True
    x = min(phone_book) 
    for p in phone_book : 
        if x in p and p!=x: 
            answer=False
            break
    '''
    answer=True
    phone_book = sorted(phone_book)
    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1): 
            answer=False
            break
    return answer


Q.의상 #*** 

'''
A 종류 N개,B 종류 M개 일 때 가능한 모든 경우의 수는 (N+1)(M+1)
(N+1)(M+1) = NM + N + M + 1
NM: N과 M을 모두 사용하는 경우
N: N만 사용하는 경우
M: M만 사용하는 경우
1: 모두 사용하지 않는 경우 
따라서, 결괏값 리턴시 -1을 통해 아무것도 입지 않는 경우를 제외하여 
최소 1개 이상의 의상을 입는 경우의 수만 리턴할 수 있도록 함 
(출처 구글링)
'''
def solution(clothes):
    answer = 0
    tmp=dict() 
    for c in clothes : 
        type=c[1]
        tmp[type] = tmp.get(type,0) + 1 
        
    answer=1
    for type,cnt in tmp.items() : 
        answer*=(cnt+1)
    answer-=1
    
    return answer


Q.베스트 앨범 #*** 

def solution(genres, plays):
    answer = []
    dic1={}
    dic2={}
    for i , (g,p) in enumerate(zip(genres, plays)) : #dic1 : 장르 인덱스 , 값 정리 (리스트로 저장)
        #print(i,g,p)
        if g not in dic1 : 
            dic1[g] = [(i,p)]
        else :
            dic1[g].append((i,p))
        #print(dic1) #{'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)]}
        
        if g not in dic2 : #dic2 : 장르별 합계
            dic2[g] = p 
        else : 
            dic2[g] += p 
        #print(dic2) #{'classic': 1450, 'pop': 3100} 
        
    for (k,v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True) : #같은 장르 내에서는 최대 2곡까지 
        for (i,p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]: 
            answer.append(i)
    return answer

https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit

 

프로그래머스

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

programmers.co.kr


 

 

https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit 

 

프로그래머스

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

programmers.co.kr


<JOIN>

Q. 상품 별 오프라인 매출 구하기 | Level 2

select p.product_code, (sum(os.sales_amount) * p.price) as sales
from offline_sale os 
left join product p on os.product_id = p.product_id
group by os.product_id
order by sales desc, p.product_code asc

 

Q. 조건에 맞는 도서와 저자 리스트 출력하기 | Level 2

select b.book_id , a.author_name, DATE_FORMAT(b.published_date, "%Y-%m-%d") as published_date
from author a 
inner join book b on a.author_id = b.author_id and b.category = '경제'
order by b.published_date asc
-- DATE_FORMAT !!

 

Q. 없어진 기록 찾기 | Level 3

/* 오답!
select ao.animal_id, ao.name
from animal_outs ao 
inner join animal_ins ai on ao.animal_id != ai.animal_id
order by ao.animal_id;
*/

select ao.animal_id, ao.name
from animal_outs ao 
left join animal_ins ai on ao.animal_id = ai.animal_id
where ai.animal_id is null
order by ao.animal_id;
-- !! a left join b on a.key = b.key where b.key is null 조건 !

 

Q. 있었는데요 없었습니다 | Level 3

select ai.animal_id, ai.name
from animal_ins ai
inner join animal_outs ao on ai.animal_id = ao.animal_id
where ao.datetime < ai.datetime
order by ai.datetime

 

Q. 오랜 기간 보호한 동물(1) | Level 3

select ai.name, ai.datetime
from animal_ins ai 
left join animal_outs ao on ai.animal_id = ao.animal_id
where ao.animal_id is null
order by ai.datetime asc 
limit 3

 

Q. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 | Level 4 >> 하는 즁 ! 

/* 오답
select 
    A.car_id
    , A.car_type
    , round(daily_fee*30*(1-discount_rate/100),0) as fee
from (
    select *
    from car_rental_company_car crcc 
    where crcc.car_type in ('세단', 'SUV')
    and crcc.car_id not in (
        select crcrh.car_id -- 대여 불가 (기간 내 대여중)
        from car_rental_company_rental_history crcrh
        where crcrh.start_date between '2022-11-01' and '2022-12-01'
        or crcrh.end_date between '2022-11-01' and '2022-12-01'
        )
    ) A
left join (
    select * 
    from car_rental_company_discount_plan crcdp
    where crcdp.duration_type like "30%"
    order by discount_rate desc 
    ) B
on A.car_type = B.car_type
-- fee 조건 ... 
order by fee desc, car_type asc, car_id desc

*/
-- 대여 start_date, end_date 조건 주의 !
-- CAST(REPLACE(DISCOUNT_RATE, '%', '') AS DECIMAL) 안해도 되네 ? 

-- (1-DISCOUNT_RATE/100) 계산식

 

 

Q. 5월 식품들의 총매출 조회하기 | Level 4

Q. 주문량이 많은 아이스크림들 조회하기 | Level 4

Q. 그룹별 조건에 맞는 식당 목록 출력하기 | Level 4

Q. 보호소에서 중성화한 동물 | Level 4

Q. FrontEnd 개발자 찾기 | Level 4

Q. 상품을 구매한 회원 비율 구하기 | Level 5

https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit 

 

프로그래머스

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

programmers.co.kr


<IS NULL>
Q.경기도에 위치한 식품창고 목록 출력하기

SELECT
    WAREHOUSE_ID
    , WAREHOUSE_NAME
    , ADDRESS
    , IFNULL(FREEZER_YN,'N') as FREEZER_YN
FROM FOOD_WAREHOUSE 
WHERE ADDRESS LIKE '경기도%'
ORDER BY WAREHOUSE_ID


Q.이름이 없는 동물의 아이디

SELECT ANIMAL_ID
FROM ANIMAL_INS 
WHERE NAME IS NULL
ORDER BY ANIMAL_ID


Q.이름이 있는 동물의 아이디

SELECT ANIMAL_ID 
FROM ANIMAL_INS 
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID


Q.NULL 처리하기

SELECT 
    ANIMAL_TYPE
    , IFNULL(NAME,"No name") as NAME
    , SEX_UPON_INTAKE
FROM ANIMAL_INS


Q.나이 정보가 없는 회원 수 구하기

SELECT COUNT(*)
FROM USER_INFO 
WHERE AGE IS NULL


https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit 

 

프로그래머스

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

programmers.co.kr


<GROUP BY>
Q.즐겨찾기가 가장 많은 식당 정보 출력하기

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO 
WHERE (FOOD_TYPE,FAVORITES) IN (SELECT FOOD_TYPE,MAX(FAVORITES)
                FROM REST_INFO
                GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC


Q.저자 별 카테고리 별 매출액 집계하기

SELECT 
    au.AUTHOR_ID
    , au.AUTHOR_NAME
    , bo.CATEGORY
    , SUM(SALES*PRICE) as TOTAL_SALES
FROM BOOK_SALES as bs
INNER JOIN BOOK as bo ON bs.BOOK_ID = bo.BOOK_ID 
INNER JOIN AUTHOR as au ON bo.AUTHOR_ID = au.AUTHOR_ID
WHERE YEAR(bs.SALES_DATE)=2022
AND MONTH(bs.SALES_DATE)=1
GROUP BY au.AUTHOR_NAME, bo.CATEGORY 
ORDER BY au.AUTHOR_ID , bo.CATEGORY DESC


Q.자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE (OPTIONS LIKE '%통풍시트%' 
      OR OPTIONS LIKE '%열선시트%'
      OR OPTIONS LIKE '%가죽시트%')
#WHERE OPTIONS LIKE '%시트%' 
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE


Q.조건에 맞는 사용자와 총 거래금액 조회하기

/*
SELECT WRITER_ID
FROM USED_GOODS_BOARD
WHERE STATUS='DONE'
GROUP BY WRITER_ID
HAVING SUM(PRICE)>=700000
*/
SELECT ugb.WRITER_ID, ugu.NICKNAME, SUM(ugb.PRICE) as TOTAL_SALES
FROM USED_GOODS_BOARD as ugb
JOIN USED_GOODS_USER  as ugu ON ugb.WRITER_ID = ugu.USER_ID
WHERE STATUS='DONE'
GROUP BY ugb.WRITER_ID
HAVING SUM(ugb.PRICE)>=700000
ORDER BY TOTAL_SALES

 

Q.성분으로 구분한 아이스크림 총 주문량

SELECT 
     ii.INGREDIENT_TYPE as INGREDIENT_TYPE
    ,SUM(TOTAL_ORDER) as TOTAL_ORDER 
FROM FIRST_HALF as fh
LEFT JOIN ICECREAM_INFO as ii ON fh.FLAVOR=ii.FLAVOR
GROUP BY ii.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER


Q.카테고리 별 도서 판매량 집계하기

SELECT
    b.CATEGORY as CATEGORY
    ,SUM(SALES) as TOTAL_SALES
FROM BOOK_SALES as bs
LEFT JOIN BOOK as b ON bs.BOOK_ID = b.BOOK_ID
WHERE YEAR(bs.SALES_DATE)=2022 and MONTH(bs.SALES_DATE)=1
GROUP BY b.CATEGORY
ORDER BY CATEGORY


Q.진료과별 총 예약 횟수 출력하기

SELECT 
    MCDP_CD as 진료과코드
    ,COUNT(*) as 5월예약건수
FROM APPOINTMENT
WHERE DATE_FORMAT(APNT_YMD,"%Y-%m-%d") LIKE "2022-05-%"
GROUP BY MCDP_CD
ORDER BY 5월예약건수,진료과코드


Q.자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

SELECT 
    CAR_ID
    ,MAX(
    #CASE WHEN ('2022-10-16' between DATE_FORMAT(START_DATE,"%Y-%m-%d") and DATE_FORMAT(END_DATE,"%Y-%m-%d") )
    CASE WHEN ('2022-10-16' between START_DATE and END_DATE )
    THEN '대여중'
    ELSE '대여 가능' END
    ) as AVAILABILITY
    #,MAX(if('2022-10-16' between START_DATE and END_DATE, '대여중','대여 가능'))
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
GROUP BY CAR_ID #CAR_ID별로 기록하기 위함
ORDER BY CAR_ID DESC
/*
MAX()함수는 GROUP BY와 함께 사용해야함
GROUP BY를 통해 CAR_ID 기준으로 묶어주고, 
위 조건을 MAX() 통해 반환하면
, 같은 CAR_ID 중에 가장 큰 값이 실행 결과로 나타난다.
*/


Q.대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

SELECT MONTH(START_DATE) as MONTH, CAR_ID, COUNT(HISTORY_ID) as RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY  
WHERE CAR_ID IN (
    SELECT CAR_ID 
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY   
    WHERE MONTH(START_DATE) between 8 and 10
    GROUP BY CAR_ID 
    HAVING COUNT(HISTORY_ID)>=5
    )
AND MONTH(START_DATE) between 8 and 10
GROUP BY MONTH, CAR_ID
HAVING RECORDS>0
ORDER BY MONTH,CAR_ID DESC


Q.식품분류별 가장 비싼 식품의 정보 조회하기

/* 틀린 답 
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
GROUP BY CATEGORY 
HAVING CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY PRICE DESC
*/
SELECT CATEGORY, PRICE AS MAX_PRICE ,PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE (CATEGORY,PRICE) IN (
    SELECT CATEGORY,MAX(PRICE) AS MAX_PRICE
    FROM FOOD_PRODUCT
    GROUP BY CATEGORY 
    HAVING CATEGORY IN ('과자', '국', '김치', '식용유')
    )
ORDER BY MAX_PRICE DESC


Q.고양이와 개는 몇 마리 있을까

SELECT ANIMAL_TYPE,count(*)
FROM ANIMAL_INS 
GROUP BY ANIMAL_TYPE 
ORDER BY ANIMAL_TYPE


Q.동명 동물 수 찾기

SELECT NAME, COUNT(*)
FROM ANIMAL_INS 
GROUP BY NAME 
HAVING COUNT(NAME)>=2
ORDER BY NAME


Q.년, 월, 성별 별 상품 구매 회원 수 구하기

SELECT YEAR(os.SALES_DATE) as YEAR
    ,MONTH(os.SALES_DATE) as MONTH
    ,ui.GENDER as GENDER
    ,COUNT(distinct ui.USER_ID) as USERS 
FROM ONLINE_SALE as os 
INNER JOIN USER_INFO as ui 
ON os.USER_ID = ui.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR , MONTH, GENDER
ORDER BY YEAR , MONTH, GENDER


Q.입양 시각 구하기(1)

SELECT HOUR(DATETIME) AS HOUR , COUNT(*) AS COUNT
FROM ANIMAL_OUTS 
WHERE HOUR(DATETIME) between 9 and 19 
GROUP BY HOUR
ORDER BY HOUR


Q.입양 시각 구하기(2)#***

/*
틀린 답
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME) 
ORDER BY HOUR
*/

/*
SET @변수명 = 대입값; 
SELECT @변수명 := 대입값; # :=는 할당 연산자
*/

SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS HOUR,
    (SELECT COUNT(HOUR(DATETIME)) 
    FROM ANIMAL_OUTS 
    WHERE HOUR(DATETIME)=@HOUR) AS COUNT 
    FROM ANIMAL_OUTS
WHERE @HOUR < 23;


Q.가격대 별 상품 개수 구하기 #***

SELECT 
    TRUNCATE(PRICE,-4) as PRICE_GROUP #4자릿수를 버림. 
    , COUNT(*) as PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
/*
TRUNCATE(PRICE,-4)  #4자릿수를 버림. 
TRUNC(수, [, 자릿수])
수를 지정된 소수점 자리까지 버림하여 반환해주는 함수이다. 
자릿수를 명시하지 않았을 경우 기본값은 0 . 즉, 정수로 반환
*/

 

https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit 

 

프로그래머스

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

programmers.co.kr


<SUM, MAX, MIN>
Q.가격이 제일 비싼 식품의 정보 출력하기

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT 
ORDER BY PRICE DESC 
LIMIT 1


Q.가장 비싼 상품 구하기

SELECT MAX(PRICE) as MAX_PRICE
FROM PRODUCT


Q.최댓값 구하기

SELECT MAX(DATETIME) as 시간
FROM ANIMAL_INS 
/*
SELECT DATETIME as 시간
FROM ANIMAL_INS 
ORDER BY DATETIME DESC
LIMIT 1
*/


Q.최솟값 구하기

SELECT MIN(DATETIME) AS 시간
FROM ANIMAL_INS


Q.동물 수 구하기

SELECT count(*) as count
FROM ANIMAL_INS


Q.중복 제거하기

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS 
WHERE NAME is not null

 

https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit 

 

프로그래머스

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

programmers.co.kr


<SELECT>
Q.3월에 태어난 여성 회원 목록 출력하기

SELECT MEMBER_ID,MEMBER_NAME,GENDER,DATE_FORMAT(DATE_OF_BIRTH,"%Y-%m-%d")
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH)=3
AND GENDER='W'
AND TLNO is not null 
ORDER BY MEMBER_ID;
/*
DATE_FORMAT(DATE_OF_BIRTH, 원하는 형식) 
DATE_FORMAT(DATE_OF_BIRTH, "%Y-%m-%d") AS BIRTH, #1992-03-16
DATE_FORMAT(DATE_OF_BIRTH, "%Y") AS YEAR, 
DATE_FORMAT(DATE_OF_BIRTH, "%m") AS MONTH,
DATE_FORMAT(DATE_OF_BIRTH, "%d") AS DAY
*/


Q.12세 이하인 여자 환자 목록 출력하기

SELECT PT_NAME, PT_NO, GEND_CD, AGE, ifnull(TLNO,'NONE') as TLNO
FROM PATIENT
WHERE AGE<=12 
and GEND_CD='W'
ORDER BY AGE DESC, PT_NAME ASC
/*
IFNULL(Column명, "Null일 경우 대체 값")
*/


Q.평균 일일 대여 요금 구하기

SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE 
FROM CAR_RENTAL_COMPANY_CAR 
WHERE CAR_TYPE='SUV';


Q.인기있는 아이스크림

SELECT FLAVOR
FROM FIRST_HALF 
ORDER BY TOTAL_ORDER DESC,SHIPMENT_ID ASC


Q.흉부외과 또는 일반외과 의사 목록 출력하기

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,"%Y-%m-%d") as HIRE_YMD
FROM DOCTOR 
WHERE MCDP_CD IN ('CS','GS')
ORDER BY HIRE_YMD DESC, DR_NAME


Q.조건에 맞는 도서 리스트 출력하기

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE,"%Y-%m-%d") as PUBLISHED_DATE 
FROM BOOK
WHERE YEAR(PUBLISHED_DATE)=2021
AND CATEGORY='인문'


Q.조건에 부합하는 중고거래 댓글 조회하기

SELECT
    ugb.TITLE
    , ugb.BOARD_ID
    , ugr.REPLY_ID
    , ugr.WRITER_ID
    , ugr.CONTENTS
    , DATE_FORMAT(ugr.CREATED_DATE,"%Y-%m-%d") as CREATED_DATE
FROM USED_GOODS_BOARD as ugb
INNER JOIN USED_GOODS_REPLY as ugr
ON ugb.BOARD_ID = ugr.BOARD_ID
WHERE YEAR(ugb.CREATED_DATE) = 2022 
AND MONTH(ugb.CREATED_DATE) = 10 
ORDER BY ugr.CREATED_DATE, ugb.TITLE


Q.과일로 만든 아이스크림 고르기

SELECT ii.FLAVOR 
FROM ICECREAM_INFO as ii
INNER JOIN FIRST_HALF as fh 
ON ii.FLAVOR = fh.FLAVOR
WHERE fh.TOTAL_ORDER>3000
and ii.INGREDIENT_TYPE = 'fruit_based'
ORDER BY fh.TOTAL_ORDER DESC


Q.서울에 위치한 식당 목록 출력하기

SELECT 
    ri.REST_ID
    ,ri.REST_NAME
    ,ri.FOOD_TYPE
    ,ri.FAVORITES
    ,ri.ADDRESS
    ,ROUND(AVG(rr.REVIEW_SCORE),2) as SCORE
FROM REST_INFO  as ri
INNER JOIN REST_REVIEW as rr
ON ri.REST_ID = rr.REST_ID
WHERE ri.ADDRESS LIKE '서울%'
GROUP BY ri.REST_ID #***
ORDER BY SCORE DESC, ri.FAVORITES DESC


Q.강원도에 위치한 생산공장 목록 출력하기

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY  
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID


Q.재구매가 일어난 상품과 회원 리스트 구하기 

SELECT USER_ID,PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID,PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID, PRODUCT_ID DESC


Q.모든 레코드 조회하기

SELECT ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS  
ORDER BY ANIMAL_ID


Q.오프라인/온라인 판매 데이터 통합하기 

SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d") as SALES_DATE
    ,PRODUCT_ID
    ,USER_ID
    ,SALES_AMOUNT
FROM ONLINE_SALE 
WHERE MONTH(SALES_DATE)=3
#WHERE SALES_DATE LIKE '2022-03%'
#WHERE DATE_FORMAT(ons.SALES_DATE,"%Y-%m")='2022-03'
UNION
SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d") as SALES_DATE
    ,PRODUCT_ID
    ,NULL as USER_ID
    ,SALES_AMOUNT
FROM OFFLINE_SALE 
WHERE MONTH(SALES_DATE)=3
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
/*
UNION (DISTINCT) : 쿼리의 결과를 합친다. 중복된 ROW는 제거 
<-> UNION ALL
*/


Q.역순 정렬하기

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC


Q.아픈 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS  
WHERE INTAKE_CONDITION='Sick'
ORDER BY ANIMAL_ID


Q.어린 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS  
WHERE INTAKE_CONDITION!='Aged'
ORDER BY ANIMAL_ID


Q.동물의 아이디와 이름

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID


Q.여러 기준으로 정렬하기

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS  
ORDER BY NAME , DATETIME DESC


Q.상위 n개 레코드

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1


Q.조건에 맞는 회원수 구하기 

SELECT count(*) #count(USER_ID) as USERS
FROM USER_INFO
WHERE AGE between 20 and 29 #AGE >= 20 and AGE<=29
and YEAR(JOINED)=2021

프로그래머스-코딩테스트 입문

https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc

 

코딩테스트 입문 | 프로그래머스 스쿨

코딩테스트에 처음 도전하는 사람들을 위한 입문 문제 모음. 쉬운 문제부터 하나씩 도전해 보면서 코딩테스트에 자신감도 붙이고 문제 해결 능력을 키워보세요!

school.programmers.co.kr


코딩테스트 입문 캘린더


DAY 1.사칙연산

Q.두 수의 합

def solution(num1, num2):
    return (num1+num2)


Q.두 수의 차

def solution(num1, num2):
    return (num1-num2)


Q.두 수의 곱

def solution(num1, num2):
    return (num1*num2)


Q.몫 구하기

def solution(num1, num2):
    return (num1//num2)

 

DAY 2.사칙연산, 조건문, 배열
Q.두 수의 나눗셈

def solution(num1, num2):
    return (num1/num2)*1000//1
    #return int(num1 / num2 * 1000)


Q.숫자 비교하기

def solution(num1, num2):
    return 1 if num1==num2 else -1


Q.분수의 덧셈***

def solution(numer1, denom1, numer2, denom2): #**
    answer = []
    x=numer1*denom2+denom1*numer2
    y=denom1*denom2
    
    #약분>최대공약수 : 공통되는 약수 중에서 최대 값 
    '''
    #틀림 ㅠ 왜 ? 
    for i in range(2,min(x,y)) :         
        if x%i==0 and y%i==0 :
            x=x//i 
            y=y//i
    '''   
    
    '''
    import math
    gcd(): 최대공약수
    lcm(): 최소공배수
    '''
    
    '''
    #for문으로 최대 공약수 찾기
    for i in range(min(x,y),0,-1) : #뒤에서 부터
        if x%i==0 and y%i==0 :
            x=x//i 
            y=y//i
            break 
    '''
    '''
    #유클리드 호제법으로 최대 공약수(GCD, Greatest Common Divisor)를 찾기
    def euclidean_algorithm(a, b):
    # 큰 수와 작은 수를 구분하여 대입
    if a < b:
        a, b = b, a
    
    # b가 0이 될 때까지 반복
    while b != 0:
        # a를 b로 나눈 나머지를 a에 대입하고, b에는 이전의 a를 대입
        a, b = b, a % b
    
    # 최대 공약수인 a를 반환
    return a
    '''
    '''
    #유클리드 호제법2
    def gcd(a, b):
    while b > 0:
        a, b = b, a % b
    return a
    '''

    a=x
    b=y
    
    if a<b :
        a,b = b,a
    while b>0 : 
        a,b = b, a%b 
    z=a #최대 공약수
    
    x=x//z
    y=y//z

            
    answer.append(x)
    answer.append(y)
    return answer


Q.배열 두 배 만들기 

def solution(numbers):
    return [i*2 for i in numbers]

 


DAY 3.사칙연산, 배열, 수학
Q.나머지 구하기

def solution(num1, num2):
    return num1%num2


Q.중앙값 구하기

def solution(array):
    answer = 0
    x=sorted(array,reverse=True)
    answer = x[len(x)//2]
    return answer
    #sorted(array)[len(array) // 2]


Q.최빈값 구하기***

def solution(array):
    answer = 0 
    
    '''
    #런타임 에러 ㅠ 
    cont=[0]*(len(array)+1) 
    for i in array :
        cont[i]+=1
        
    maxCont=-1
    tmp=[]
    for i in range(len(cont)) :
        if maxCont<cont[i] :
            maxCont=cont[i]
    for i in range(len(cont)) : 
        if cont[i] == maxCont :
            tmp.append(i)
    if len(tuple(tmp))>1 :
           answer = -1
    else : 
           answer = tmp[0]
    '''
    
    '''
    #런타임 에러 ㅠ 
    cont=[0]*(len(array)+1)  #카운트 배열 생성
    for i in array :
        cont[i]+=1
        
    maxVal=0 #최빈값 출연 횟수
    for i in cont :
        if i == max(cont) :
            maxVal+=1;
    
    if maxVal > 1 :
        answer = -1
    else : 
        answer = cont.index(max(cont))
    '''
    
    while len(array)!=0 : 
        for i,x in enumerate(set(array)) :
            array.remove(x)
        if i==0 :
            return x 
    return -1

    return answer


Q.짝수는 싫어요

def solution(n):
    answer = [i for i in range(1,n+1) if i%2!=0]
    return answer
    #return [i for i in range(1, n+1, 2)]


DAY 4.수학, 배열
Q.피자 나워 먹기 (1)

def solution(n):
    answer = 0
    i=1
    while 7*i<n :
        i+=1
    answer = i
    return answer
    '''
    if n%7 != 0:
        answer = (n//7) + 1
    else:
        answer = n//7
    '''


Q.피자 나워 먹기 (2)

def solution(n):
    answer = 0
    i=1
    while True : #while(1):
        if (6*i)%n==0 :
            answer=i
            break
        i+=1
    return answer


Q.피자 나워 먹기 (3)

def solution(slice, n):
    answer = 0
    i=1
    while (1):
        if (slice*i)>=n :
            answer=i
            break
        i+=1
    return answer


Q.배열의 평균값

def solution(numbers):
    return sum(numbers)/len(numbers)


DAY 5.수학, 배열
Q.옷가게 할인 받기

def solution(price):
    if price>=500000:
        price*=0.8
    elif price>=300000:
        price*=0.9
    elif price>=100000:
        price*=0.95
    return int(price) #return price는 오답


Q.아이스 아메리카노

def solution(money):
    answer = []
    answer.append(money//5500)
    answer.append(money%5500)
    return answer
    #answer = [money // 5500, money % 5500]


Q.나이 출력

def solution(age):
    return 2022-age+1


Q.배열 뒤집기

def solution(num_list):
    for i in range (len(num_list)//2) :
        num_list[i],num_list[len(num_list)-1-i] = num_list[len(num_list)-1-i], num_list[i]
    return num_list
    #return num_list[::-1]
    #num_list.reverse()
    #while(num_list):
    #    result.append(num_list.pop())



DAY 6.문자열, 반복문, 출력, 배열, 조건문
Q.문자열 뒤집기

def solution(my_string):
    answer = ''
    for x in my_string : 
        answer=x+answer
    return answer
    #return my_string[::-1]
    #return ''.join(list(reversed(my_string)))
    #for i in range(len(my_string)-1, -1, -1) :
    #    answer += my_string[i]


Q.직각삼각형 출력하기

n = int(input())
for i in range(1,n+1) :
    for j in range(i) :
        print("*",sep='',end='')
    print()
#for i in range(n):
#    print('*'*(i+1))


Q.짝수 홀수 개수

def solution(num_list):
    sum1=0
    sum2=0
    for x in (num_list):
        if x%2==0 :
            sum1+=1
        else :
            sum2+=1
    answer=[sum1,sum2]
    return answer
    '''
    answer = [0,0]
    for n in num_list:
        answer[n%2]+=1
    '''


Q.문자 반복 출력하기

def solution(my_string, n):
    answer = ''
    for x in my_string : 
        answer+=((x)*n)
    return answer
    #return ''.join(i*n for i in my_string)


DAY 7.문자열, 조건문, 수학, 반복문
Q.특정 문자 제거하기

def solution(my_string, letter):
    answer = ''
    for x in my_string :
        if x!=letter : 
            answer+=x
    return answer
    #return my_string.replace(letter, '')
    #return ''.join([c for c in my_string if c != letter])


Q.각도기

def solution(angle):
    answer = 0
    if angle==90:
        answer=2
    elif angle==180 :
        answer=4
    elif angle<90:
        answer=1
    elif angle>90:
        answer=3
    return answer


Q.양꼬치

def solution(n, k):
    answer = 0
    if n>=10 and k>0:
        k-=n//10
    answer+=n*12000 + k*2000
    return answer
    #return 12000 * n + 2000 * (k - n // 10)


Q.짝수의 합

def solution(n):
    answer = 0
    for i in range(0,n+1) :
        if i%2==0:
            answer+=i
    return answer
    #return sum([i for i in range(2, n + 1, 2)])


DAY 8.배열, 구현, 수학
Q.배열 자르기

def solution(numbers, num1, num2):
    return numbers[num1:num2+1]


Q.외계행성의 나이

def solution(age):
    answer = ''
    for x in str(age) :
        tmp=''
        if x=='0' : tmp='a'
        elif x=='1' : tmp='b'
        elif x=='2' : tmp='c'
        elif x=='3' : tmp='d'
        elif x=='4' : tmp='e'
        elif x=='5' : tmp='f'
        elif x=='6' : tmp='g'
        elif x=='7' : tmp='h'
        elif x=='8' : tmp='i'
        elif x=='9' : tmp='j'
        answer+=tmp
    return answer
    '''
    age = str(age)
    age = age.replace("0", "a")
    '''



Q.진료순서 정하기

def solution(emergency):
    answer = []
    tmp=sorted(emergency,reverse=True)
    for i in emergency : 
        answer.append(tmp.index(i)+1)
    return answer
    #return [sorted(emergency, reverse=True).index(e) + 1 for e in emergency]



Q.순서쌍의 개수

def solution(n):
    answer = 0
    for i in range(1,n+1) :
        if n%i==0 : 
            answer+=1
    return answer



DAY 9.수학, 문자열, 해시, 완전탐색, 조건문
Q.개미 군단

def solution(hp):
    answer = 0
    while hp>0 :
        if hp>=5:
            answer+=hp//5
            hp=hp%5
        elif hp>=3:
            answer+=hp//3
            hp=hp%3
        elif hp>=1:
            answer+=hp//1
            hp=hp%1
    return answer
    #return hp // 5 + (hp % 5 // 3) + ((hp % 5) % 3)


Q.모스부호 (1)

def solution(letter):
    answer = ''
    morse = { 
    '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'
    }
    for x in list(letter.split()) :
        answer+=morse.get(x)
        #answer+=morse[x]
    return answer


Q.가위 바위 보

def solution(rsp):
    answer = ''
    for x in rsp : 
        if x=='0':
            answer+='5'
        elif x=='2':
            answer+='0'
        elif x=='5':
            answer+='2'
    return answer
    '''
    d = {'0':'5','2':'0','5':'2'}
    return ''.join(d[i] for i in rsp)
    '''


Q.구슬을 나누는 경우의 수

def solution(balls, share):
    answer = 0
    def fac(n):
        ret=1
        for i in range(1,n+1) :
            ret*=i
        return ret
    answer = fac(balls)//((fac(balls-share))*fac(share))
    return answer
    '''
    서로 다른 n개 중 m개를 뽑는 경우의 수 공식
    조합 nCm = (n-m)!*m! 분의 n! 
    n! 
    ---------
    (n-m)!*m!
    '''
    '''
    import math
    def solution(balls,share):
        return math.comb(balls,share)
    '''

 

DAY 10.조건문, 배열, 수학, 시뮬레이션
Q.점의 위치 구하기

def solution(dot):
    answer = 0
    x=dot[0]
    y=dot[1]
    if x>0 :
        if y>0:
            answer=1
        elif y<0:
            answer=4
    if x<0:
        if y>0:
            answer=2
        elif y<0:
            answer=3
    return answer


Q.2차원으로 만들기

def solution(num_list, n):
    answer=[]
    for i in range(0,len(num_list),n) :
        answer+=[num_list[i:i+n]]
        #answer.append(num_list[i:i+n])
    return answer


Q.공 던지기***

def solution(numbers, k):
    answer = 0
    i=0
    cont=0
    while (1) :
        cont+=1 #횟수
        if cont==k:
            answer=numbers[i]
            break 
        if i==(len(numbers)-1) :
            i=1
        elif i==(len(numbers)-2) :
            i=0
        else :
            i+=2
    return answer
    #return numbers[2 * (k - 1) % len(numbers)]


Q.배열 회전시키기

def solution(numbers, direction):
    if direction=='right':
        numbers.insert(0,numbers.pop())
    elif direction=='left':
        numbers.append(numbers.pop(0))
    return numbers


DAY 11.수학, 반복문
Q.주사위의 개수***

def solution(box, n):
    answer = 0
    a,b,c=box
    answer = (a//n)*(b//n)*(c//n)
    return answer


Q.합성수 찾기

def solution(n):
    answer = 0
    for i in range(1,n+1):
        cont=0
        for j in range(1,i+1):
            if i%j==0:
                cont+=1
        if cont>=3:
            answer+=1 
    return answer


Q.최댓값 만들기(1)

def solution(numbers):
    maxValue=-2147000000
    for i in range(len(numbers)) :
        for j in range(i+1,len(numbers)) :
            if numbers[i]*numbers[j]>maxValue:
                maxValue=numbers[i]*numbers[j]
    return maxValue
    '''
    numbers.sort()
    return numbers[-2] * numbers[-1]

    numbers = sorted(numbers, reverse=True)
    return numbers[0]*numbers[1]
    '''


Q.팩토리얼

def solution(n):
    answer = 0
    i=1
    while (1):
        answer=i
        tmp=1
        for j in range(1,i+1) :
            tmp*=j
        if tmp==n :
            break
        elif tmp>n:
            answer=i-1
            break
        else :
            i+=1
    return answer
    '''
    factorial = 1
    while factorial <= n:
        answer += 1
        factorial = factorial * answer
    answer -= 1
    '''


DAY 12.문자열, 정렬, 사칙연산, 수학
Q.모음 제거

def solution(my_string):
    answer = ''
    for x in my_string:
        if x=='a' or x=='e' or x=='i' or x=='o' or x=='u':
            continue
        answer+=x
    return answer
    '''
    vowels = ['a','e','i','o','u']
    for vowel in vowels:
        my_string = my_string.replace(vowel, '')
    '''


Q.문자열 정렬하기 (1)

def solution(my_string):
    answer = []
    for x in my_string :
        if x.isalpha() : #if i.isdigit():
            continue 
        answer.append(int(x))
    answer.sort()
    return answer


Q.숨어있는 숫자의 덧셈 (1)

def solution(my_string):
    answer = 0
    for x in my_string :
        if x.isdigit():
            answer+=int(x)
    return answer


Q.소인수분해***

def solution(n):
    answer = []
    x=2
    while x<=n :
        if n%x==0 :
            if x not in answer :
                answer.append(x)
            n=n//x
        else :
            x+=1
    return answer


DAY 13.문자열, 배열, 사칙연산, 수학, 조건문
Q.컨트롤 제트

def solution(s):
    answer = 0
    tmp=s.split()
    for i in range(len(tmp)) :
        if tmp[i]=="Z":
            answer-=int(tmp[i-1])
        else :
            answer+=int(tmp[i])
    return answer


Q.배열 원소의 길이

def solution(strlist):
    answer = []
    for x in strlist :
        answer.append(len(x))
    return answer
    #return [len(str) for str in strlist]


Q.중복된 문자 제거

def solution(my_string):
    answer = ''
    tmp=[]
    x=list(my_string)
    for i in my_string :
        if i not in tmp :
            tmp.append(i)
            answer+=i
    return answer
    '''
    answer = ''
    for i in my_string:
        if i not in answer:
            answer+=i
    return answer
    '''



Q.삼각형의 완성조건(1)

def solution(sides):
    answer = 0
    a,b,c=sorted(sides,reverse=True)
    if a<b+c:
        answer=1
    else :
        answer=2
    return answer



DAY 14.조건문, 반복문, 시뮬레이션, 문자열
Q.가까운 수

def solution(array, n):
    answer = 0
    minValue=2147000000
    for x in array :
        if abs(n-x) < minValue :
            minValue=abs(n-x)
            answer=x
        if minValue == abs(n-x) and answer>x:
                answer=x
    return answer


Q.369게임

def solution(order):
    answer = 0
    for x in str(order) :
        if x=='3' or x=='6' or x=='9':
            answer+=1
    return answer


Q.암호 해독

def solution(cipher, code):
    answer = ''
    for i in range(code-1,len(cipher),code) :
        answer+=cipher[i]
    return answer
    # return cipher[code-1::code]


Q.대문자와 소문자

def solution(my_string):
    answer = ''
    for x in my_string :
        if x.isupper():
            answer+=x.lower()
        elif x.islower():
            answer+=x.upper()
    return answer
    #return my_string.swapcase()


DAY 15.문자열, 해시, 배열, 수학
Q.영어가 싫어요

def solution(numbers):
    '''
    #왜 안돼 ㅠ ? 실행조차 안됨.. 
    answer = 0
    number={"zero":0, "one":1, "two":2, "three":3, "four":4, "five":5, "six":6, "seven":7, "eight":8, "nine":9}
    i=1
    while len(numbers)>0:
       # print(numbers[:i])
        #print(number.get(numbers[:i]))
        if number.get(numbers[:i]) != None :
            nembers=numbers[:i]
            i=1
        else :
            i+=1
    '''
    
    nums=["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    for i,n in enumerate(nums):
        numbers=numbers.replace(n,str(i))
    return int(numbers)


Q.인덱스 바꾸기

def solution(my_string, num1, num2):
    my_string=list(my_string)
    my_string[num1],my_string[num2] = my_string[num2],my_string[num1]
    return ''.join(my_string)


Q.한 번만 등장한 문자

def solution(s):
    answer = ''
    tmp=[]
    for x in s :
        if s.count(x)==1 :
            tmp.append(x)
    tmp=sorted(tmp)
    answer=answer.join(tmp)
    return answer


Q.약수 구하기

def solution(n):
    answer = []
    for i in range(1,n+1) : 
        if n%i==0 :
            answer.append(i)
    return answer


DAY 16.문자열, 수학, 배열, 조건문
Q.편지

def solution(message):
    return len(message)*2


Q.가장 큰 수 찾기

def solution(array):
    #answer.append(max(array))
    #answer.append(array.index(max(array)))
    maxValue=-2147000000
    idx=0
    for i in range(len(array)) : 
        if array[i]>maxValue :
            maxValue=array[i]
            idx=i
    answer=[maxValue,idx]
    return answer


Q.문자열 계산하기

def solution(my_string):
    answer = 0
    '''
    #런타임 에러ㅠ 
    a,b,c=(my_string).split()
    if str(b)=="+" :
        answer=int(a)+int(c)
    elif str(b)=="-":
        answer=int(a)-int(c)
    '''
    my_string=my_string.split()
    answer=int(my_string[0])
    for i in range(2,len(my_string)) :
        if my_string[i-1]=="+" :
            answer+=int(my_string[i])
        elif my_string[i-1]=="-" :
            answer-=int(my_string[i])
    return answer
    #solution=eval


Q.배열의 유사도

def solution(s1, s2):
    answer = 0
    for i in range (len(s1)) :
        for j in range(len(s2)) :
            if s1[i]==s2[j] :
                answer+=1
                break
    return answer
    #return len(set(s1)&set(s2));
    #set()의 & 연산자는 두 집합(sets) 간의 교집합을 반환
    '''
    for word in s1:
        if word in s2:
            answer += 1
        else:
            continue
    '''


DAY 17.문자열, 수학, 조건문, 배열, 사칙연산
Q.숫자 찾기

def solution(num, k):
    answer = 0
    num=str(num)
    for i in range(len(num)) :
        if int(num[i])==k:
            answer=i+1
            break
    else :
        answer=-1
    return answer


Q.n의 배수 고르기

def solution(n, numlist):
    answer = []
    for x in numlist :
        if x%n==0 : 
            answer.append(x)
    return answer
    #answer = [i for i in numlist if i%n==0]


Q.자릿수 더하기

def solution(n):
    answer = 0
    n=str(n)
    for x in n :
        answer+=int(x)
    return answer
    #return sum(int(i) for i in str(n))


Q.OX퀴즈

def solution(quiz):
    answer = []
    for x in quiz : 
        x,a,y,b,z = x.split()
        if str(a)=="+" :
            if int(x)+int(y)==int(z) :
                answer.append('O')
            else : 
                answer.append('X')
        elif str(a)=="-" :
            if int(x)-int(y)==int(z) :
                answer.append('O')
            else : 
                answer.append('X')
    return answer


DAY 18.문자열, 수학, 조건문, 정렬
Q.문자열안에 문자열

def solution(str1, str2):
    answer = 1 if str1.find(str2)>=0 else 2
    return answer
    #return 1 if str2 in str1 else 2


Q.제곱수 판별하기

def solution(n):
    answer = 0
    x=n**(1/2) #제곱근 2분의 1승
    if x%1==0: #정수일 경우
        answer=1
    else : 
        answer = 2 
    return answer


Q.세균 증식

def solution(n, t):
    answer=n
    for i in range(0,t) :
        answer*=2
    return answer


Q.문자열 정렬하기 (2)

def solution(my_string):
    return "".join(sorted(my_string.lower()))


DAY 19.문자열, 배열, 조건문
Q.7의 개수

def solution(array):
    answer = 0
    for x in array :
        for i in range(len(str(x))) :
            if str(x)[i]=='7':
                answer+=1
    return answer
    #return str(array).count('7')


Q.잘라서 배열로 저장하기

def solution(my_str, n):
    answer = []
    for i in range(0,len(my_str),n):
        answer.append(my_str[i:i+n])
    return answer


Q.중복된 숫자 개수

def solution(array, n):
    return array.count(n)


Q.머쓱이보다 키 큰 사람

def solution(array, height):
    answer = 0
    array.sort()
    for x in array : 
        if x>height : 
            answer+=1
    return answer
    '''
    array.append(height)
    array.sort(reverse=True)
    return array.index(height)
    '''


DAY 20.수학, 시뮬레이션, 문자열, 사칙연산
Q.직사각형 넓이 구하기

def solution(dots):
    answer = 0
    a=set()
    b=set()
    for x in dots :
        a.add(x[0])
        b.add(x[1])
    x=abs(list(a)[0]-list(a)[1])
    y=abs(list(b)[0]-list(b)[1])
    answer=x*y
    return answer
    #return (max(dots)[0] - min(dots)[0])*(max(dots)[1] - min(dots)[1]) 
    '''
    x, y = [], []
    for dot in dots:
        x.append(dot[0])
        y.append(dot[1])
    return (max(x) - min(x)) * (max(y) - min(y))
    '''


Q.캐릭터의 좌표

def solution(keyinput, board):
    answer = []
    
    dx=[1,0,-1,0]
    dy=[0,-1,0,1]
    x=0
    y=0
    print((board[0]//2),(board[1]//2))
    for k in keyinput : 
        if k=="right" :
            i=0
        elif k=="down" :
            i=1
        elif k=="left" :
            i=2
        elif k=="up" :
            i=3
        if abs(x+dx[i])>(board[0]//2) or abs(y+dy[i])>(board[1]//2) :
            continue
        x=x+dx[i]
        y=y+dy[i]
            
    answer=[x,y]
    return answer


Q.최댓값 만들기 (2)

def solution(numbers):
    answer = 0
    numbers.sort()
    answer=numbers[0]*numbers[1]
    if answer<(numbers[len(numbers)-1]*numbers[len(numbers)-2]) :
        answer=(numbers[len(numbers)-1]*numbers[len(numbers)-2])
    return answer
    '''
    numbers = sorted(numbers)
    return max(numbers[0] * numbers[1], numbers[-1]*numbers[-2]) 
    '''


Q.다항식 더하기***

def solution(polynomial):
    # if tmpx==1 경우 주의  
    answer = ''
    tmpx=0
    tmpc=0
    polynomial=polynomial.split(' + ')
    for p in polynomial :
        '''
        if 'x' in p:
            tmp=p.replace('x','')
            if tmp=='' :
                tmpx+=1
            else :
                tmpx+=int(tmp)
        else : 
            tmpc+=int(p)
        '''
        
        
        if 'x' in p: 
            if p.isalpha():
                tmpx+=1
            else :
                tmp=p.replace('x','')
                tmpx+=int(tmp)
        elif p.isdigit() :
            tmpc+=int(p)
        
    if tmpx>0 :
        if tmpx==1 : #주의
            answer+='x'
        else : 
            answer+=str(tmpx)+'x'
        
        if tmpc>0 :
            answer+=' + '+str(tmpc)
    else :
        if tmpc>0 :
            answer+=str(tmpc)
    return answer

    def solution(polynomial):
    tmpx = 0
    tmpc = 0
    for c in polynomial.split(' + '):
        if c.isdigit():#상수항
            tmpc+=int(c)
        else:
            tmpx = tmpx+1 if c=='x' else tmpx+int(c[:-1])
    if tmpx == 0:
        return str(tmpc)
    elif tmpx==1:
        return 'x + '+str(tmpc) if tmpc!=0 else 'x'
    else:
        return f'{tmpx}x + {tmpc}' if tmpc!=0 else f'{tmpx}x'
    
    return answer


DAY 21.문자열, 사칙연산, 시뮬레이션, 2차원배열, 수학, 배열
Q.숨어있는 숫자의 덧셈 (2)

def solution(my_string):
    answer = 0
    for i in range(len(my_string)) : 
        if my_string[i].isalpha() :
            my_string=my_string.replace(my_string[i],' ')
    my_string = list(map(int,my_string.split()))
    answer = sum(my_string)
    return answer


Q.안전지대***

def solution(board):
    answer = 0
    dx=[-1,0,1,1,0,0,-1,-1]
    dy=[0,1,0,0,-1,-1,0,0]
    n=len(board)
    tmp=[]
    '''
    for i in board :
        print(i)
    '''
    #지뢰 위치 파악
    for i in range(n):
        for j in range(n) :
            if board[i][j]==1 :
                tmp.append([i,j])
                
    for t in tmp :
        x,y=t #지뢰 위치
        for i in range(8) :
            '''
            #틀림 ㅠ 
            if(x+dx[i]>=n or y+dy[i]>=n or x+dx[i]<0 or y+dy[i]<0) :
                continue
            x=x+dx[i]
            y=y+dy[i]
            if board[x][y]==1 :
                continue
            board[x][y]=1
            '''
            x=x+dx[i]
            y=y+dy[i]
            if 0 <= x < n and 0 <= y < n:
                board[x][y] = 1
            
    #안전지대 카운팅
    for i in range(n):
        for j in range(n):
            if board[i][j]==0:
                answer+=1
    
    return answer


Q.삼각형의 완성조건 (2)

def solution(sides):
    answer = 0
    #가장 큰 변의 길이 값이 sides 안에 있는 경우
    for i in range(max(sides)-min(sides)+1,max(sides)+1):
        answer+=1
    #아닌 경우 
    for i in range(max(sides)+1,max(sides)+min(sides)):
        answer+=1
    return answer


Q.외계어 사전

def solution(spell, dic):
    answer = 2
    for d in dic :
        if len(set(spell)-set(d))==0 : #차집합
        #if not (set(spell)-set(d)) : #차집합
            answer=1
            break 
    return answer


DAY 22.dp, 수학, 조건문, 배열
Q.저주의 숫자 3

def solution(n):
    answer = 0
    i=1 #3x 마을에서 쓰는 숫자
    cont=1 #10진법
    while cont<=n :
        #print('10진법 : ', cont , ' 3x 마을: ',i)
        if(cont==n) : 
            answer = i
        if (str(i).find('3')>=0) or (i%3==0) :
        #if i % 3 and '3' not in str(i):
            i+=1
        else : 
            cont+=1
            i+=1
    return answer


Q.평행***

def solution(dots):
    answer = 0
    
    #기울기가 같다면 평행 
    #기울기 = y좌표의차이/x좌표의차이 
    
    cont=1
    while cont<=3 :
        if cont==1 :
            d1,d2,d3,d4 = dots[0],dots[1],dots[2],dots[3]
        if cont==2 :
            d1,d2,d3,d4 = dots[0],dots[2],dots[1],dots[3]
        if cont==3 :
            d1,d2,d3,d4 = dots[0],dots[3],dots[1],dots[2]
        
        l1=(d1[1]-d2[1])/(d1[0]-d2[0])
        l2=(d3[1]-d4[1])/(d3[0]-d4[0])
        '''
        if d1[1]-d2[1]==0 or d1[0]-d2[0]==0 :
            l1=0
        else :
            l1=(d1[1]-d2[1])/(d1[0]-d2[0])
            
        if d3[1]-d4[1]==0 or d3[0]-d4[0]==0 :
            l2=0
        else :
            l2=(d3[1]-d4[1])/(d3[0]-d4[0])
        '''
        if l1==l2:
            return 1
        cont+=1 
        
    return answer


Q.겹치는 선분의 길이***

def solution(lines):
    answer = 0
    
    '''
    tmps=[]
    for l in lines :
        tmp=[]
        for i in range(min(l),max(l)) :
            tmp.append(i)
        tmps.append(set(tmp))
    print('tmps:',tmps) # [{0}, {2, 3, 4}, {3, 4, 5, 6, 7, 8}]
    '''
    
    '''
    집합(set) 자료형
    교집합 s1 & s2 
    합집합 s1 | s2 
    차집합 s1 - s2
    값 1개 추가하기 - add(): add(1) 
    값 여러 개 추가하기 - update() : s1.update([4, 5, 6]) 
    특정 값 제거하기 - remove() : s1.remove(2)
    '''
    sets=[ set(range(min(l),max(l))) for l in lines] #range(min(l), max(l)): 최소값과 최대값 사이의 숫자들로 이루어진 범위를 생성 
    #range(start, end+1)로 하면 오류남 .. 시작점이 같은 것만 계산
    answer = (len(sets[0]&sets[1] | sets[0]&sets[2] | sets[1]&sets[2])) #각 선분끼리의 교집합을 구하고 각각의 교집합의 합집합의 길이를 반환
    
    return answer


Q.유한소수 판별하기

def solution(a, b):
    ''' 일부 테스트케이스 틀림.. 왜 ? ㅠ 
    answer = 0
    
    if a%b==0 : #정수가 되는 경우
        return 1
        
    #최대공약수 찾기
    x=max(a,b)
    y=min(a,b)
    while y!=0:
        x,y=y,x%y
    z=x #최대공약수
    
    #분자와 분모의 최대공약수로 약분
    a=a//z
    b=b//z
    
    #분모 약수 찾기
    tmp=[]
    for i in range(2,b+1):
        if b%i==0 :
            tmp.append(i)
    print(tmp)    
    
    if (2 in tmp) or (5 in tmp) : 
        if (2 in tmp):
            tmp.remove(2)
        if (5 in tmp) :
            tmp.remove(5)
        if len(tmp)>0 :
            return 2
        else : 
            return 1
    #elif (2 in tmp) and (5 in tmp) : 
    #    while
    else : 
        return 2
    '''

    answer = 0
    #기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
    
    #정수도 유한소수로 분류 
    if a==b % a%b==0:
        return 1
    
    x=max(a,b)
    y=min(a,b)
    while y!=0 : 
        x,y=y,x%y
    a=a//x #x = 최대공약수
    b=b//x
    
    for i in range(b//2) :
        if b%2==0 :
            b=b//2
            if b==1 :
                break
        elif b%5==0:
            b=b//5
            if b==1 : 
                break
    answer = 1 if b==1 else 2 
    
    return answer

'''
from math import gcd 
def solution(a, b):
    b //= gcd(a,b) #gcd (num1, num2....) : num1,num2... 들의 최대 공약수를 출력함 
    while b%2==0:
        b//=2
    while b%5==0:
        b//=5
    return 1 if b==1 else 2
'''

'''
from math import gcd

def solution(a, b):
    b = b / gcd(a, b)
    for i in [2, 5]:
        while not b % i:
            b //= i

    return 1 if b == 1 else 2
'''



DAY 23.배열, 정렬, 문자열
Q.특이한 정렬***

def solution(numlist, n):
    answer=[]
    answer=sorted(numlist,reverse=True)
    answer=sorted(answer,key=lambda x: abs(n-x))
    #key=lambda x: abs(n - x) 의 값에서 나온 결과값이 작은 순서대로 정렬되는 것임. 
    
    '''#?
    answer = sorted(numlist,key = lambda x : (abs(x-n), n-x)) 
     
    '''
    '''
    sorted: 리스트를 정렬하는 파이썬 내장 함수입니다.
    numlist: 정렬할 리스트입니다.
    key: 정렬 기준을 지정하는 옵션입니다. key에는 함수를 전달할 수 있으며, 이 함수의 반환값을 기준으로 리스트를 정렬합니다.
    lambda x: (abs(x - n), n - x): 람다 함수를 사용하여 각 원소 x에 대한 정렬 키를 정의합니다. 이 람다 함수는 튜플을 반환합니다.
    첫 번째 요소는 x와 n 사이의 차이의 절댓값인 abs(x - n)입니다.
    두 번째 요소는 x와 n 사이의 차이인 n - x입니다.
    따라서 리스트 numlist는 주어진 키에 따라 정렬되어 answer에 할당됩니다.
    이 코드의 결과는 numlist의 원소들이 주어진 n 값과의 차이에 따라 정렬된 리스트가 됩니다.

    '''
    return answer


Q.등수 매기기#***

def solution(score):
    answer = []
    tmp=[]
    for i in score : 
        tmp.append(sum(i)/len(i))
    #print('tmp',tmp)
    sort_tmp = sorted(tmp,reverse=True)
    #print('sort_tmp',sort_tmp)
    
    #tmmp=[]
    for t in tmp :
        #print('for: t ',t, ' sort_tmp.index(t)',sort_tmp.index(t))
        answer.append(sort_tmp.index(t)+1)
    
    ''' #틀림 ㅠ 
    for i,j in score :
        tmp.append((i+j)//2)
    tmp.sort(reverse=True)
    print('tmp',tmp)
    
    for i,j in score :
        #print(tmp.index((i+j)//2)+1,end=' ')
        answer.append(tmp.index((i+j)//2)+1)
    #index()는 리스트에서 특정 원소의 인덱스를 반환해주는 함수, 중복된 원소가 있으면 가장 작은 인덱스를 리턴 
    '''
    return answer


Q.옹알이 (1)#***

def solution(babbling):
    words=["aya", "ye", "woo", "ma"]
    answer = 0
    tmp=[]
    
    for b in babbling : 
        for w in words :
            b=b.replace(w," ") #지우고 남은 문자끼리 합쳐지지 않도록 일부러 공백을 둔다.
            #print('b',b,'strip()',b.strip())
            tmp.append(b)
            
            if not b.strip(): 
            #만약 b가 공백 문자열이라면 if b.strip():는 if ''가 되어 거짓(False)이 되고, b가 공백 문자열이 아니라면 if b.strip():는 if b가 되어 참(True)이 됩니다.
                answer+=1 #i가 공백 문자열 또는 문자열 내에 공백만 있는 경우에 참이 되고, 그 외의 경우에는 거짓이 됩니다.
                break
            
        '''
        'abcdefg'.strip('a') : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
        'abcdefg'.lstrip('a') : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
        'abcdefg'.rstrip('a') : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.
        인자가 없을 경우 공백 제거
        
        '''
                
    return answer


Q.로그인 성공?

def solution(id_pw, db):
    answer = ''
    for d in db :
        if d==id_pw : 
            answer='login'
            break
        elif str(d[0])==str(id_pw[0]):
            answer='wrong pw'
            break #*
            '''
            본 조건에도 break가 필요하다. 
            
            login과 wrong pw, fail에 우선 순위가 있기 때문임. 아래 반례 예시 
            입력값 〉 ["abc04", "345"], [["abc04", "335"], ["abc03", "345"]]
            기댓값 〉 "wrong pw"
            '''
        else :
            answer='fail'
    return answer


DAY 24.수학, 시뮬레이션, 문자열, 조건문, 반복문
Q.치킨 쿠폰#***

def solution(chicken):
    answer = 0
    
    coupon = chicken 
    while coupon >=10: 
        ch=coupon//10
        answer+=ch
        coupon=coupon%10
        coupon+=ch
        #print(answer,ch,coupon)
    return answer


Q.이진수 더하기#***

def solution(bin1, bin2):
    answer = ''
    x=int(bin1,2) #int(bin1,2) : bin1 값을 2진수로 변환. 단, bin1 문자열을 받아 정수로 변환 
    y=int(bin2,2)
    #print(bin(x + y))
    answer = bin(x + y)[2:] #ex :  0b11000 처럼 0b가 붙어 나오므로 자름
    #bin(x + y).replace("0b","")
    
    '''
    -int('x',8) 함수 : 8/16/2진수 만자열을 정수형(int) 숫자로 형변환 할 수 있다. 
    
    -oct() : 10진수>8진수 문자열 
    -hex() : 10진수>16진수 문자열 
    -bin() : 10진수 > 2진수 문자열 
    '''
    
    return answer


Q.A로 B 만들기

def solution(before, after):
    answer = 0
    tmp=''
    size=len(before)
    for i in range(size) :
        x=after[i]
        if x in before : 
            idx=before.index(x)
            tmp+=before[idx]
            before = before[:idx]+before[idx+1:]
        else :
            break
    if tmp==after :
        answer = 1
    return answer

    '''
    before=sorted(before)
    after=sorted(after)
    if before==after:
        return 1
    else:
        return 0

    '''


Q.k의 개수

def solution(i, j, k):
    answer = 0
    arrs=list(range(i,j+1))
    for a in arrs :
        if str(k) in str(a) :
            answer+=(str(a).count(str(k)))
    return answer
    #answer = sum([ str(i).count(str(k)) for i in range(i,j+1)])


DAY 25.시뮬레이션, 조건문, 수학
Q.문자열 밀기#***

def solution(A, B):
    answer = 0
    cnt=0
    for i in range(len(A)) : 
        if A == B : 
            break
        else :
            A=list(A)
            A.insert(0,A.pop())
            A=''.join(A)
            cnt+=1
    if A==B :
        answer = cnt
    else :
        answer = -1
        
    return answer

    '''
    from collections import deque

    def solution(A, B):
        a, b = deque(A), deque(B)
        for cnt in range(0, len(A)):
            if a == b:
                return cnt
            a.rotate(1)
        return -1 
    '''


Q.종이 자르기 #***

def solution(M, N):
    answer = 0
    answer=(M*N)-1
    '''
    종이를 1번 자르면 2장
    종이를 2번 자르면 3장
    종이를 3번 자르면 4장
    '''
    return answer


Q.연속된 수의 합 #***

def solution(num, total):
    answer = []
    start=total
    '''
    9번 테스크 케이스만 안됨. 반례예시
    #num=3,total=0,result=[-1,0,1] 일 경우를 위해 
    아래 if num>total 조건을 추가하였음 
    '''
    if num>total :
            start=total+num
    while True :
        arrs=list(range(start,start-num,-1))
        if sum(arrs)==total:
            answer=arrs
            break
        start-=1
        '''
        else :
            arrs=list(range(start,start+num))
            if sum(arrs)==total:
                answer=arrs
                break
            start+=1
        '''
    answer=sorted(answer)
    return answer
    #return [(total - (num * (num - 1) // 2)) // num + i for i in range(num)]
    '''댓글 해석 참조 펌
    1. result를 일반화 시키면 [x+0, x+1, x+2, x+3 ... x + (num-1)]
    2. 그리고 위 값을 전부 더한 값이 total이 됨. total = num*x + num*(num-1)//2 ※ result의 전체요소의 갯수는 num개 이므로 x의 갯수는 num개 이고 상수 부분은 첫번째 항이 0이고 마지막항이 num-1인 등차가 1인 등차수열의 합임.
    3. 2번에서 도출한 공식을 이제 위 코드에 대입해보면 [(total - (num * (num - 1) // 2)) // num + i for i in range(num)] = [num*x + (num * (num - 1) // 2)) - (num * (num - 1) // 2)) // num + i for i in range(num)] = [num*x // num + i for i in range(num)] = [x + i for i in range(num)] 1번에서의 result x식과 일치하므로 정답이 됨.


    '''


Q.다음에 올 숫자

def solution(common):
    answer = 0
    if abs(common[1]-common[0]) == abs(common[2]-common[1]) :
        x=common[1]-common[0] 
        answer=common[-1]+x
    elif (common[1]/common[0]) == common[2]/common[1] :
        x=(common[1]/common[0])
        answer=common[-1]*x 
    return answer

사용 문법 정리


-최대공약수 (약분>최대공약수 : 공통되는 약수 중에서 최대 값)
#for문으로 최대 공약수 찾기
    for i in range(min(x,y),0,-1) : #뒤에서 부터
        if x%i==0 and y%i==0 :
            x=x//i 
            y=y//i
            break 

#유클리드 호제법으로 최대 공약수(GCD, Greatest Common Divisor)를 찾기
    def euclidean_algorithm(a, b):
    # 큰 수와 작은 수를 구분하여 대입
    if a < b:
        a, b = b, a
    
    # b가 0이 될 때까지 반복
    while b != 0:
        # a를 b로 나눈 나머지를 a에 대입하고, b에는 이전의 a를 대입
        a, b = b, a % b
    
    # 최대 공약수인 a를 반환
    return a

#유클리드 호제법2
def gcd(a, b):
    while b > 0:
        a, b = b, a % b
    return a

#math 사용하여 최대 공약수 찾기 
'''
from math import gcd 
def solution(a, b):
    b //= gcd(a,b) #gcd (num1, num2....) : num1,num2... 들의 최대 공약수를 출력함 
    while b%2==0:
        b//=2
    while b%5==0:
        b//=5
    return 1 if b==1 else 2
'''

'''
from math import gcd

def solution(a, b):
    b = b / gcd(a, b)
    for i in [2, 5]:
        while not b % i:
            b //= i

    return 1 if b == 1 else 2
'''


-import math
    gcd(): 최대공약수
    lcm(): 최소공배수

-중앙값
x=sorted(array,reverse=True)
answer = x[len(x)//2]

sorted(array)[len(array) // 2]

-최빈값 
while len(array)!=0 : 
    for i,x in enumerate(set(array)) :
        array.remove(x)
    if i==0 :
        return x 
return -1

-짧게
return [i*2 for i in numbers]
answer = [i for i in range(1,n+1) if i%2!=0]
return [i for i in range(1, n+1, 2)]
return sum([i for i in range(2, n + 1, 2)])
answer = sorted(numlist,key = lambda x : (abs(x-n), n-x)) 

-배열 뒤집기 
for i in range (len(num_list)//2) :
    num_list[i],num_list[len(num_list)-1-i] = num_list[len(num_list)-1-i], num_list[i]
num_list[::-1]
num_list.reverse()
while(num_list):
    result.append(num_list.pop())

-문자열 뒤집기
for x in my_string : 
    answer=x+answer
return my_string[::-1]
return ''.join(list(reversed(my_string)))
for i in range(len(my_string)-1, -1, -1) :
    answer += my_string[i]

-리스트>문자열
str = ''.join(list)

-딕셔너리 dictionary 
dic = {"a": 1, "b": 2}
dic[key] : dic["a"] > 1 #단, key 값이 없는 경우 에러
dic.get(key) : dic.get("a") > 1 #key 값이 없는 경우 None  
dict.get(key, default=None) : print(a.get("c", 0)) > 0 #key가 존재하지 않을 경우 default 값을 출력함 

-조합 ; 경우의 수 
서로 다른 n개 중 m개를 뽑는 경우의 수 공식
조합 nCm = (n-m)!*m! 분의 n! 
n! 
---------
(n-m)!*m!

import math
    def solution(balls,share):
        return math.comb(balls,share)

def fac(n):
        ret=1
        for i in range(1,n+1) :
            ret*=i
        return ret
answer = fac(balls)//((fac(balls-share))*fac(share))


-배열 회전 
if direction=='right':
    numbers.insert(0,numbers.pop())
elif direction=='left':
    numbers.append(numbers.pop(0))

-팩토리얼
factorial = 1
while factorial <= n:
    factorial = factorial * answer

-함수 
isalpha() : x.isalpha() 알파벳 인지 ? 
isdigit() : i.isdigit() 숫자인지 ? 

-집합(set) 자료형
교집합 s1 & s2 : set(s1)&set(s2) 교집합 #set()의 & 연산자는 두 집합(sets) 간의 교집합을 반환 
합집합 s1 | s2 
차집합 s1 - s2
값 1개 추가하기 - add(): add(1) 
값 여러 개 추가하기 - update() : s1.update([4, 5, 6]) 
특정 값 제거하기 - remove() : s1.remove(2)

-평행 ; 기울기
좌표에서 기울기가 같다면 평행
기울기 = y좌표의차이/x좌표의차이 

-수
제곱수  x=n**(1/2) #제곱근 2분의 1승
기약분수 분모의 소인수가 2와 5만 존재해야 합니다.

-int()
int() : x=int(bin1,2) #bin1 값을 2진수로 변환. 단, bin1 문자열을 받아 정수로 변환  
>>>> bin(x)[2:], bin(x).replace("0b","") #ex:0b11000 처럼 0b가 붙어 나오므로 자름 
int('x',8) 함수 : 8/16/2진수 만자열을 정수형(int) 숫자로 형변환 할 수 있다. 
oct() : 10진수>8진수 문자열 
hex() : 10진수>16진수 문자열 
bin() : 10진수 > 2진수 문자열 

-문자열 밀기 
from collections import deque

def solution(A, B):
        a, b = deque(A), deque(B)
        for cnt in range(0, len(A)):
            if a == b:
                return cnt
            a.rotate(1)
        return -1 

-종이 자르기
answer=(M*N)-1
'''
종이를 1번 자르면 2장
종이를 2번 자르면 3장
종이를 3번 자르면 4장
'''

+ Recent posts