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://wikidocs.net/book/1 

 

점프 투 파이썬

이 책은 파이썬이란 언어를 처음 접해보는 독자들과 프로그래밍을 한 번도 해 본적이 없는 사람들을 대상으로 한다. 프로그래밍을 할 때 사용되는 전문적인 용어들을 알기 쉽게 풀어서 …

wikidocs.net

 

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

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장
'''

프로그래머스-코딩 기초 트레이닝

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

 

코딩 기초 트레이닝 | 프로그래머스 스쿨

프로그래밍 언어를 처음 접하거나 프로그래밍 언어에 익숙해지고 싶다면? 코딩 역량을 탄탄하게 길러주는 코딩 기초 트레이닝으로 차근차근 코딩에 대한 기초 감각을 길러 보세요.

school.programmers.co.kr


코딩 기초 트레이닝 캘린더

 

 


DAY1.출력

Q.문자열 출력하기

str = input()
print(str)


Q.a와 b 출력하기

a, b = map(int, input().strip().split(' '))
print('a =', a)
print('b =', b)

 


Q.문자열 반복해서 출력하기

a, b = input().strip().split(' ')
b = int(b)

for i in range(b) :
    print(a, end='')


Q.대소문자 바꿔서 출력하기

str = input()
str2='' 
for x in str : 
    if x.isupper() :
        str2+=x.lower()
    else:
        str2+=x.upper()
print(str2)
'''
오답(에러)
주어진 코드에서 출력이 원하는 대로 나오지 않는 이유는 
반복문 안에서 x 변수에 대한 변환 작업은 원본 문자열인 str에 적용되지 않기 때문입니다. 
Python에서 문자열은 불변(immutable)하며, 문자열을 수정하려면 새로운 문자열을 생성해야 합니다.
'''
for i in range(len(str)) : 
    if str[i].isupper() : 
        str[i].lower()
        print(str[i])
    else :
        str[i]=str[i].upper()
print(str)


Q.특수문자 출력하기

출력예시 : !@#$%^&*(\'"<>?:;

print('!@#$%^&*(\\\'"<>?:;')

 

Day 2.출력, 연산
Q.덧셈식 출력하기

a, b = map(int, input().strip().split(' '))
print(a,'+',b,'=',a+b)

Q. 문자열 붙여서 출력하기

str1, str2 = input().strip().split(' ')
print(str1+str2)
#print(str1, str2, sep='')

Q. 문자열 돌리기

str = input()
for x in str :
    print(x)

Q. 홀짝 구분하기

a = int(input())
if a%2==0 :
    print(a,'is even')
else :
    print(a, 'is odd')

Q. 문자열 겹쳐쓰기

def solution(my_string, overwrite_string, s):
    answer = ''
    answer+=my_string[0:s]
    answer+=overwrite_string
    if len(answer)<len(my_string):
        answer+=my_string[len(answer):]
    # answer = my_string[:s]+overwrite_string+my_string[s+len(overwrite_string):]
    return answer

 

Day 3.연산
Q.문자열 섞기

def solution(str1, str2):
    answer = ''
    for i in range(len(str1)):
        answer+=str1[i]+str2[i]
    return answer


Q.문자 리스트를 문자열로 변환하기

def solution(arr):
    answer = ''
    for x in arr:
        answer+=x
    return answer


Q.문자열 곱하기

def solution(my_string, k):
    answer = ''
    for i in range(k):
        answer+=my_string
    return answer



Q.더 크게 합치기

def solution(a, b):
    answer = 0
    x=int(str(a)+str(b))
    y=int(str(b)+str(a))
    if x>y or x==y:
        answer=x
    else :
        answer=y

    return answer



Q.두 수의 연산값 비교하기

def solution(a, b):
    answer = 0
    x=int(str(a)+str(b))
    y=2*int(a)*(b)
    if x>y or x==y :
        answer=x
    else : 
        answer=y
    return answer
    #return max(int(str(a) + str(b)), 2 * a * b)
    #return int(str(a) + str(b)) if int(str(a) + str(b)) > 2*a*b else 2*a*b


Day 4.연산, 조건문
Q.n의 배수

def solution(num, n):
    answer = 1 if num%n==0 else 0
    return answer


Q.공배수

def solution(number, n, m):
    #오답
    #answer = 1 if number%(n*m)==0 else 0
    answer = 1 if (number%n==0 and number%m==0) else 0 
    return answer



Q.홀짝에 따라 다른 값 반환하기

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


Q.조건 문자열

def solution(ineq, eq, n, m):
    answer = 0
    #ㅎㅎ?
    if ineq=='<':
        if eq=='=' and n<=m :
            answer = 1 
        if eq=='!' and n<m :
            answer = 1
    elif ineq=='>':
        if eq=='=' and n>=m :
            answer = 1 
        if eq=='!' and n>m :
            answer = 1
    return answer



Q.flag에 따라 다른 값 반환하기

def solution(a, b, flag):
    answer = 0
    answer = a+b if flag else a-b
    return answer

 


DAY 5.조건문
Q.코드 처리하기

def solution(code):
    ret = ''
    mode=0
    for i in range(len(code)) : 
        x=str(code[i])
        if mode==0 :
            if x!='1' and i%2==0  :
                ret+=x
            elif x=='1': 
                mode=1
        else :
            if x!='1' and i%2!=0 :
                ret+=x
            elif x=='1': 
                mode=0
        #print(i, x, mode, ret, sep=' ')
    ret= 'EMPTY' if ret=='' else ret 
    # return answer if answer else 'EMPTY'
    return ret


Q.등차수열의 특정한 항만 더하기

def solution(a, d, included):
    answer = 0
    for i in range(len(included)) : 
        if included[i]==True : 
            answer+=a+(d*i)    
    return answer


Q.주사위 게임 2

def solution(a, b, c):
    answer = 0
    if a==b==c : 
        answer+=(a+b+c)*(a*a+b*b+c*c)*(a*a*a+b*b*b+c*c*c)
    elif a==b or a==c or b==c :
        answer+=(a+b+c)*(a*a+b*b+c*c)
    else :
        answer+=(a+b+c)
    return answer
    #answer *= a**(i+1)+b**(i+1)+c**(i+1)


Q.원소들의 곱과 합

def solution(num_list):
    answer = 0
    sum1=0
    sum2=1
    for x in num_list :
        sum1+=x
        sum2*=x
    if sum1**2>sum2 :
        answer = 1    
    elif sum1**2<sum2 : 
        answer = 0 
    return answer
    #sum(num_list)



Q.이어 붙인 수

def solution(num_list):
    answer = 0
    a=''
    b=''
    for x in num_list : 
        if x%2==0 : 
            a+=str(x)
        else : 
            b+=str(x)
    answer = int(a) + int(b)
    return answer



DAY 6.조건문, 반복문
Q.마지막 두 원소

def solution(num_list):
    answer = []
    size=len(num_list)
    if num_list[size-1] > num_list[size-2] :
        num_list.append(num_list[size-1]-num_list[size-2])
    else : 
        num_list.append(num_list[size-1]*2)
    answer=num_list
    return answer
    # a=num_list[-1]
    # b=num_list[-2]



Q.수 조작하기 1

def solution(n, control):
    for x in control :
        if x=='w' : 
            n=n+1 
        elif x=='s':
            n=n-1
        elif x=='d':
            n=n+10
        elif x=='a':
            n=n-10
    return n


Q.수 조작하기 2

def solution(numLog):
    answer = ''
    for i in range(1,len(numLog)) :
        tmp = numLog[i]-numLog[i-1]
        if tmp==1 :
            answer+='w'
        elif tmp==-1:
            answer+='s'
        elif tmp==10:
            answer+='d'
        elif tmp==-10:
            answer+='a'
    return answer


Q.수열과 구간 쿼리 3

def solution(arr, queries):
    for x in queries : 
        i,j=x[0],x[1]
        arr[i],arr[j] = arr[j],arr[i]
    return arr
    #for a,b in queries:
    #    arr[a],arr[b]=arr[b],arr[a]


Q.수열과 구간 쿼리 2

def solution(arr, queries):
    answer = []
    for s,e,k in queries : 
        tmp=arr[s:e+1]
        minValue = 2147000000 
        for x in tmp :
            if x>k and minValue>x : 
                minValue = x
        if minValue!=2147000000 : 
            answer.append(minValue)
        else :
            answer.append(-1)
    return answer
    #m=float('inf')
    #min(tmp)


DAY 7.반복문
Q.수열과 구간 쿼리 4

def solution(arr, queries):
    for s,e,k in queries : 
        #tmp = arr[s:e+1]
        for i in range(s,e+1) : 
            if i%k==0 : 
                arr[i]=arr[i]+1
    return arr


Q.배열 만들기 2

def solution(l, r):
    answer = []
    #*
    for num in range(l,r+1):
        if not set(str(num)) - set(['0','5']) :
            answer.append(num)
'''
set(str(num))은 num을 문자열로 변환하고, 문자열을 중복되지 않는 집합(set)으로 변환합니다. 집합은 중복된 요소를 포함하지 않으므로, 각 문자가 한 번만 나타납니다.
set(['0', '5'])는 문자 '0'과 '5'로 이루어진 문자열 리스트를 집합으로 변환합니다.
그런 다음 set(str(num)) - set(['0', '5'])는 num을 문자열로 변환한 집합에서 '0'과 '5'로 이루어진 집합을 뺀 결과를 나타냅니다. 만약 num의 문자열 표현에 '0' 또는 '5'가 없다면, 이 연산 결과는 빈 집합이 됩니다.
'''
    return answer if answer else [-1]


Q.카운트 업

def solution(start_num, end_num):
    return list(range(start_num, end_num+1))
#return [i for i in range(start,end+1)]


Q.콜라츠 수열 만들기

def solution(n):
    answer=[n]    
    while n>1 : 
        if n%2==0 : 
            n=n//2
        else :
            n=3*n+1
        answer.append(n)
    return answer


Q.배열 만들기 4

def solution(arr):
    stk = []
    i=0
    while i < len(arr) :
        if len(stk)==0 : 
            stk.append(arr[i])
            i+=1
        else : 
            if stk[-1] < arr[i] :
                stk.append(arr[i])
                i+=1
            else : 
                stk.pop() #*
    return stk


DAY 8.조건문,문자열
Q.간단한 논리 연산

def solution(x1, x2, x3, x4):
    #논리합 OR ∨ , 논리곱 AND ∧ (True 1, False 0)
    answer = True
    a=(True if x1==True or x2==True else False)
    b=(True if x3==True or x4==True else False)
    answer = False if a==False or b==False else True 
    return answer
#return (x1 | x2) & (x3 | x4)
#return (x1 or x2) and (x3 or x4)


Q.주사위 게임 3

#런타임에러 ㅠ ㅠ 
def solution(a, b, c, d):
    answer = 0
    x=set([a,b,c,d])
    y=list([a,b,c,d])

    if len(x)==1 : 
        answer=1111*a
    elif len(x)==4 :
        answer=min(x)
    elif len(x)==3 :
        ch=[0]*7
        p=0
        for i in y:
            ch.insert(i,(ch[i]+1))
        for i in ch:
            if ch[i]>1 :
                p=i
                break
        tmp=y
        tmp.remove(p) #list.remove(value) 하나만 제거함
        tmp.remove(p)
        q=tmp[0]
        r=tmp[1]
        answer=q*r
    elif len(x)==2 :
        ch=list([0]*7)
        for i in y:
            ch[i]=ch[i]+1
        #answer=int(str(ch[0])+str(ch[1])+str(ch[2])+str(ch[3])+str(ch[4])+str(ch[5])+str(ch[6]))
        for i in range(len(ch)):
            if ch[i]==3:
                answer=333
                tmp=y
                p=i
                tmp.remove(p)
                tmp.remove(p)
                tmp.remove(p)
                q=tmp[0]
                answer=(10*p+q)**2
                break
                
        if answer==0 :
            tmp=list(x)
            p=tmp[0]
            q=tmp[1]
            answer=(p+q)*abs(p-q)
    return answer

#정답 코드 https://school.programmers.co.kr/questions/47795 
def solution(a, b, c, d):
    answer = 0
    arr=[a,b,c,d]
    counts=[arr.count(i) for i in arr] #각 숫자의 출현 횟수를 저장
    
    if max(counts)==4 : #모두 같은 경우
        answer=1111*a
    elif max(counts)==3 : #pppq
        p=arr[counts.index(3)]
        q=arr[counts.index(1)]
        answer=(10*p+q)**2
    elif max(counts)==2: #ppqr or ppqq 
        if min(counts) == 2:
            return (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b) #?
        else:
            p = arr[counts.index(2)]
            return (a * b * c * d) / p**2 #?
    else : #모두 다른 경우
        answer=min(arr)
        
    return answer


Q.글자 이어 붙여 문자열 만들기

def solution(my_string, index_list):
    answer = ''
    for x in index_list : 
        answer+=my_string[x]
    return answer
Q.9로 나눈 나머지
def solution(number):
    return int(number)%9


Q.문자열 여러 번 뒤집기

def solution(my_string, queries):
    for s,e in queries : 
        '''
        for i in range(e-s+1//2) : 
            #my_string[s+i], my_string[e-i] = my_string[e-i],my_string[s+i] #오류남
        '''  
        my_string = my_string[:s] + my_string[s:e+1][::-1] + my_string[e+1:]
        #my_string[start:end+1][::-1]는 파이썬에서 문자열을 일부분 선택한 후 그 부분을 뒤집는 연산을 수행하는 코드
    return my_string



DAY 9.문자열
Q.배열 만들기 5

def solution(intStrs, k, s, l):
    answer = []
    for x in (intStrs) :
        x=int(x[s:s+l])
        if x>k :
            answer.append(x)
    return answer


Q.부분 문자열 이어 붙여 문자열 만들기

def solution(my_strings, parts):
    answer = ''
    for i in range(len(my_strings)) :
        str=my_strings[i]
        s,e = parts[i]
        answer+=str[s:e+1]
    return answer


Q.문자열의 뒤의 n글자

def solution(my_string, n):
    return my_string[len(my_string)-n:]
    #return my_string[-n:]


Q.접미사 배열

def solution(my_string):
    answer = []
    size=len(my_string)
    for i in range (size):
        answer.append(my_string[i:])
    answer.sort()
    return answer


Q.접미사인지 확인하기

def solution(my_string, is_suffix):
    answer = 0
    for i in range(len(my_string)) :
        if(my_string[i:] == is_suffix) :
            answer=1
        if answer==1:
            break 
    else : 
        answer=0
        
    return answer
    #return int(my_string.endswith(is_suffix)) #endsWith()는 특정문자열로 어떤 string이 특정문자열로 끝나는지를 검사해서 그 값을 Boolean값으로 반환
    #return int(my_string[-len(is_suffix):] == is_suffix)


DAY 10.문자열
Q.문자열의 앞의 n글자

def solution(my_string, n):
    return my_string [:n]


Q.접두사인지 확인하기

def solution(my_string, is_prefix):
    #answer = 1 if my_string.startswith(is_prefix) else 0 
    answer = 1 if my_string[:len(is_prefix)] == is_prefix else 0
    return answer


Q.문자열 뒤집기

def solution(my_string, s, e):
    return my_string[:s]+my_string[s:e+1:][::-1]+my_string[e+1:]



Q.세로 읽기

def solution(my_string, m, c):
    return my_string[c-1::m]


Q.qr code

def solution(q, r, code):
    answer = ''
    for i in range(len(code)) :
        if i%q == r :
            answer+=code[i]
    return answer


DAY 11.리스트(배열)
Q.문자 개수 세기

def solution(my_string):
    answer = []
    #아스키코드 변환 ord():문자>숫자/chr():숫자>문자
    answer=[my_string.count(chr(i)) for i in range(ord('A'), ord('Z') + 1)] + [my_string.count(chr(i)) for i in range(ord('a'), ord('z') + 1)]
    return answer


Q.배열 만들기 1

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



Q.글자 지우기

def solution(my_string, indices):
    answer=''
    for i in range(len(my_string)) : 
        if i not in indices :
            answer +=my_string[i]
    return answer


Q.카운트 다운

def solution(start, end_num):
    answer=[]
    ret=start
    while ret >= end_num :
        answer.append(ret)
        ret-=1
    return answer
    #return list(range(start,end-1,-1))


Q.가까운 1 찾기

def solution(arr, idx):
    answer = 0
    for i in range(len(arr)):
        if i >= idx and arr[i] == 1 :
            answer=i
            break
    else :
        answer=-1 
    
    return answer


DAY 12.리스트(배열)
Q.리스트 자르기

def solution(n, slicer, num_list):
    answer = []
    a,b,c=slicer 
    if n==1 :
        num_list=num_list[0:b+1]
    elif n==2:
        num_list=num_list[a:]
    elif n==3:
        num_list=num_list[a:b+1]
    elif n==4:
        num_list=num_list[a:b+1:c]
    answer=num_list
    return answer



Q.첫 번째로 나오는 음수

def solution(num_list):
    answer = 0
    for x in num_list :
        if x<0 : 
            answer=num_list.index(x) #index(): x를 찾은 가장 첫 번째 인덱스
            break
    else : 
        answer=-1
    return answer


Q.배열 만들기 3

def solution(arr, intervals):
    answer = []
    for s,e in intervals :
        for i in arr[s:e+1] :
            answer.append(i)
    return answer
    #for a,b in intervals: answer+=arr[a:b+1]


Q.2의 영역

def solution(arr):
    answer = []
    s=0
    e=0
    for i in range(len(arr)):
        if arr[i] == 2 : 
            s=i
            break 
    for j in range(len(arr)-1,-1,-1):
        if arr[j] == 2:
            e=j
            break
    if arr.count(2)==0 :
        answer.append(-1)
    else :
        answer+=arr[s:e+1]
    return answer
    
    #if 2 not in arr:
    #    return [-1]
    #return arr[arr.index(2) : len(arr) - arr[::-1].index(2)]


Q.배열 조각하기

def solution(arr, query):
    answer = []
    for i in range(len(query)) :
        if i%2==0 :
            arr=arr[:query[i]+1]
        else :
            arr=arr[query[i]:]
    return arr



DAY 13.리스트(배열)
Q.n 번째 원소부터

def solution(num_list, n):
    return num_list[n-1:]


Q.순서 바꾸기

def solution(num_list, n):
    return num_list[n:]+num_list[:n]


Q.왼쪽 오른쪽

def solution(str_list):
    answer = []
    for i in str_list : 
        if i=="l" :
            answer=str_list[:str_list.index("l")]
            break
        elif i=="r":
            answer=str_list[str_list.index("r")+1:]
            break
    return answer


Q.n번째 원소까지

def solution(num_list, n):
    return num_list[:n]


Q.n개 간격의 원소들

def solution(num_list, n):
    return num_list[::n]



DAY 14.리스트(배열)
Q.홀수vs짝수

def solution(num_list):
    answer = 0
    sum1=0
    sum2=0
    for i in range(len(num_list)):
        if i%2==0:
            sum1+=num_list[i]
        else :
            sum2+=num_list[i]
    answer=sum1 if sum1>=sum2 else sum2 
    return answer
    #return max(sum(num_list[::2]), sum(num_list[1::2]))



Q.5명씩

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



Q.할 일 목록

def solution(todo_list, finished):
    answer = []
    for i in range(len(todo_list)) :
        if not finished[i] :
            answer.append(todo_list[i])
    return answer
    #return [work for idx, work in enumerate(todo_list) if not finished[idx]]



Q.n보다 커질 때까지 더하기

def solution(numbers, n):
    answer = 0
    i=0
    while answer<=n:
        answer+=numbers[i]
        i+=1
    return answer



Q.수열과 구간 쿼리1

def solution(arr, queries):
    answer = []
    '''
    #테스트 케이스 하나만 정답 .. 나머지 케이스 모두 틀림
    for i in range(len(arr)):
        if i<len(queries):
            s,e = queries[i]
            if s<=i<=e :
                for j in range (s,e+1) : 
                   arr[j] +=1
    '''
    
    for i,q in enumerate(queries) :
        s=q[0]
        e=q[1]
        #if s<=i<=e : 
        for k in range(s,e+1) :
            arr[k]+=1
    return arr



DAY 15.리스트(배열),문자열
Q.조건에 맞게 수열 변환하기 1

def solution(arr):
    answer = []
    for idx,x in enumerate(arr) : 
        if x>=50 and x%2==0 :
            arr[idx]=x//2
        elif x<50 and x%2!=0 :
            arr[idx]=x*2
    return arr


Q.조건에 맞게 수열 변환하기 2 

def solution(arr):
    '''
    #* ㅠ 
    answer = 0
    arr2=[]
    arr2.append(arr.copy()) #arr2.append(arr) 안됨. 
    for x in range(len(arr)) : 
        tmp=[]
        for i in range(len(arr)) : 
            
            x = arr[i]
            if x>=50 and x%2==0 :
                arr[i]=x//2
            elif x<50 and x%2!=0 :
                arr[i]=x*2+1
            tmp.append(arr[i])
        arr2.append(tmp)
        
    for i in range(len(arr2)) :
        if arr2[i] == arr2[i+1] : 
            answer = i
            break
    '''
    
    idx = 0
    pre = arr 
    while True : 
        tmp = []
        for x in pre :
            if x>=50 and x%2==0 :
                tmp.append(x//2)
            elif x<50 and x%2!=0 :
                tmp.append(x*2+1)
            else : 
                tmp.append(x)
        if pre == tmp : 
            break
        
        idx+=1
        pre=tmp
    answer = idx     
    return answer


Q.1로 만들기

def solution(num_list):
    answer = 0
    for x in num_list : 
        while x>1 :
            if x%2==0 :
                answer+=1
                x=x//2
            elif x%2!=0 :
                answer+=1
                x=(x-1)//2
    return answer


Q.길이에 따른 연산

def solution(num_list):
    answer = 0
    if len(num_list)>=11 :
        for i in num_list : 
            answer+=i
    elif len(num_list)<=10 :
        answer+=1
        for i in num_list : 
            answer*=i
    return answer
    #return sum(num_list) if len(num_list)>=11 else prod(num_list)


Q.원하는 문자열 찾기

def solution(myString,pat):
            
    answer = 0
    myString=myString.upper()
    pat=pat.upper()
    #if(myString.startswith(pat)) : answer=1 ##?? 안되는건가 ?
    
    '''
    #정확성: 90.9 ㅠ 
    for i in range(len(myString)-len(pat)) :
        if myString[i:i+len(pat)] == pat :
            answer = 1 
            break
    '''
    
    if pat in myString : 
        answer=1
        
    return answer
    #return int(pat.lower() in myString.lower())



DAY 16.문자열
Q.대문자로 바꾸기

def solution(myString):
    return myString.upper()


Q.소문자로 바꾸기

def solution(myString):
    return myString.lower()


Q.배열에서 문자열 대소문자 변환하기

def solution(strArr):
    for i in range(len(strArr)):
        if i%2==0:
            strArr[i]=strArr[i].lower()
        else : 
            strArr[i]=strArr[i].upper()
    return strArr


Q.A 강조하기

def solution(myString):
    answer = ''
    for x in myString : 
        if x=='a':
            answer+=x.upper()
        elif x!="A" and x.isupper() :
            answer+=x.lower()
        else :
            answer+=x
    return answer
    #return myString.lower().replace('a', 'A')


Q.특정한 문자를 대문자로 바꾸기

def solution(my_string, alp):
    answer = ''
    '''
    for x in my_string :
        if x==alp :
            answer+=x.upper()
        else :
            answer+=x
    '''
    answer = my_string.replace(alp,alp.upper())
    return answer


DAY 17.문자열
Q.특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

def solution(myString, pat):
    answer = ''
    ''' # 틀림 
    for i in range (len(myString)-len(pat),0,-1):
        if myString[i:i+len(pat)] == pat :
            answer = myString[:i+1] #ㅠ 틀림 .
            break
    '''
    
    #index(), find() <--> rindex(), rfind() : 뒤에서 부터
    #find(찾을 문자열), find(찾을 문자열, 시작 위치), find(찾을 문자열, 시작 위치, 종료 위치) 
    #만약 없을 경우 find()에서는 -1을 리턴하는 반면, index()에서는 ValueError가 발생
    
    answer = myString[:myString.rfind(pat)+len(pat)]
    return answer



Q.문자열이 몇 번 등장하는지

def solution(myString, pat):
    answer = 0
    for i in range(len(myString)-len(pat)+1) :
        if myString[i:i+len(pat)] == pat : 
            answer+=1
    return answer


Q.ad 제거하기

def solution(strArr):
    answer = []
    ''' 틀림 ㅠ 
    for x in strArr : 
        if x.find("ad")>0 :
            strArr.remove(x) 
    '''
    for x in strArr : 
        if x.find("ad")<0 :
            answer.append(x)

    return strArr
    #return [word for word in strArr if 'ad' not in word]



Q.공백으로 구분하기 1

def solution(my_string):
    answer=list(my_string.split())
    return answer
    #return my_string.split()


Q.공백으로 구분하기 2

def solution(my_string):
    return my_string.split()



DAY 18.문자열
Q.x 사이의 개수 

def solution(myString):
    answer = []
    for x in myString.split('x') :
        answer.append(len(x))
    return answer
    #return [len(w) for w in myString.split('x')]



Q.문자열 잘라서 정렬하기

def solution(myString):
    answer = []
    tmp=myString.split('x')
    for i in tmp :
        if i!="" :
            answer.append(i)
    answer.sort()
    return answer
    #return sorted(ch for ch in myString.split('x') if ch)
    '''
    myString.split('x'): 문자열 myString을 'x'를 구분자로 사용하여 분할한 후 각 부분을 리스트로 반환합니다. 예를 들어, "ABCxDEFxGHI"를 "x"로 분할하면 ['ABC', 'DEF', 'GHI']가 됩니다.
    for ch in myString.split('x') if ch: 리스트 컴프리헨션을 사용하여 분할된 문자열 중 빈 문자열("")을 필터링하여 제거합니다. 이 부분은 if ch 조건을 사용하여 빈 문자열이 아닌 경우에만 포함합니다.
    sorted(): 리스트를 정렬합니다. 위 코드에서는 문자열이 사전순으로 정렬됩니다.
    '''



Q.간단한 식 계산하기

def solution(binomial):
    answer = 0
    a,op,b = binomial.split()
    if op=='+' : 
        answer=int(a)+int(b)
    elif op=='-':
        answer=int(a)-int(b)
    elif op=='*':
        answer=int(a)*int(b)
    return answer
    #return eval(binomial)
    #expression (=식)을 문자열로 받아서, 실행하는 함수


Q.문자열 바꿔서 찾기

def solution(myString, pat):
    answer = 0
    tmp = ""
    for ch in myString :
        if ch=="B" : 
            tmp+="A" 
        else :
            tmp+="B"
    answer = 1 if tmp.find(pat)>=0 else 0 
    return answer


Q.rny_string

def solution(rny_string):
    answer = ''
    for i in range(len(rny_string)) :
        if rny_string[i]=='m' :
            answer+='rn'
        else : 
            answer+=rny_string[i]
    return answer
    #return rny_string.replace('m', 'rn')


DAY 19.문자열,리스트(배열)
Q.세 개의 구분자

def solution(myStr):
    answer = []
    x1=[]
    for x in myStr.split('a') : 
        tmp = list(ch for ch in x.split('b') if ch)
        x1+=tmp
    x2=[]
    for x in x1 : 
        tmp = list(ch for ch in x.split('c') if ch)
        x2+=tmp
        
    answer = x2 if len(x2)>0 else ["EMPTY"]
    return answer



Q.배열의 원소만큼 추가하기

def solution(arr):
    answer = []
    for i in arr : 
        for x in range (i) :
            answer.append(i)
    return answer



Q.반 배열에 추가, 삭제하기

def solution(arr, flag):
    answer = []
    for i in range(len(arr)) :
        if flag[i] :
            for j in range (arr[i]*2) :
                answer.append(arr[i])
        else : 
            for j in range (arr[i]) :
                answer.pop()
    return answer



Q.배열 만들기 6

def solution(arr):
    stk = []
    for i in range(len(arr)) : 
        x=arr[i]
        if len(stk)==0 : 
            stk.append(x)
        elif stk[len(stk)-1]==x :
            stk.pop()
        elif stk[len(stk)-1]!=x :
            stk.append(x)
    if len(stk)==0 : 
        stk.append(-1)
    return stk
    #elif stk[-1] == arr[i]:


Q.무작위로 K개의 수 뽑기

def solution(arr, k):
    answer = []
    idx=0
    while idx<len(arr) :
        if arr[idx] not in answer : 
            answer.append(arr[idx])
        if len(answer)==k : 
            break 
        idx+=1
    if len(answer)<k :
        while len(answer)<k:
            answer.append(-1)
    return answer


DAY 20.함수(메서드)
Q.배열의 길이를 2의 거듭제곱으로 만들기

def solution(arr): #ㅠ
    answer = []
    i=1
    while i<len(arr):
        i=i*2
    for j in range(i-len(arr)) :
        arr.append(0)
    return arr 
    '''
    a = 1
    b = len(arr)
    while a < b :
        a *= 2
    return arr + [0] * (a-b)
    '''


Q.배열 비교하기

def solution(arr1, arr2):
    answer = 0
    if len(arr1)==len(arr2) :
        sum1=0
        sum2=0
        for i in range (len(arr1)) : 
            sum1+=arr1[i]
            sum2+=arr2[i]
        if sum1==sum2 :
            answer = 0
        else : 
            answer = 1 if sum1>sum2 else -1
    else : 
        answer = 1 if len(arr1)>len(arr2) else -1
    return answer
    #sum(arr1), sum(arr2)


Q.문자열 묶기

def solution(strArr):
    arr=[0]*(len(strArr)+1)
    for x in strArr : 
        arr[len(x)]+=1
    return max(arr)
    '''
    a=[0]*31
    for x in strArr: a[len(x)]+=1
    return max(a)
    '''


Q.배열의 길이에 따라 다른 연산하기

def solution(arr, n):
    if len(arr)%2==0 : 
        for i in range (1,len(arr),2) :
            arr[i]+=n
    else : 
        for i in range(0,len(arr),2) : 
            arr[i]+=n
    return arr


    
Q.뒤에서 5등까지

def solution(num_list):
    answer = []
    for i in range(5):
        x=min(num_list)
        answer.append(x)
        num_list.remove(x)
    return answer
    #return sorted(num_list)[:5]


DAY 21.함수(메서드)
Q.뒤에서 5등 위로

def solution(num_list):
    answer = []
    #list.sort() 본 리스트를 정렬해서 반환
    #sorted(리스트) 는 본 리스트를 기반하여 정렬한 새로운 리스트를 반환
    return sorted(num_list)[5:]


Q.전국 대회 선발 고사

def solution(rank, attendance):
    answer = 0
    rank2=[]
    for i in range(len(rank)) : 
        if attendance[i]==True : 
            rank2.append(rank[i])
    a,b,c = sorted(rank2)[:3]
    answer = 10000*rank.index(a) + 100*rank.index(b) + rank.index(c)
    return answer


Q.정수 부분

def solution(flo):
    return int(flo)
    ##flo//1


Q.문자열 정수의 합

def solution(num_str):
    answer = 0
    for x in num_str : 
        answer +=int(x)
    return answer


Q.문자열을 정수로 변환하기

def solution(n_str):
    return int(n_str)



DAY 22.함수(메서드), 조건문 활용
Q.0 떼기

def solution(n_str):
    answer = ''
    while True : 
        if n_str[0]=='0' : 
            n_str=n_str[1:]
        else :
            break
    return n_str
    #return n_str.lstrip('0')
    #return str(int(n_str))
    '''
    'abcdefg'.strip('a') : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
    'abcdefg'.lstrip('a') : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
    'abcdefg'.rstrip('a') : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.
    인자가 없을 경우 공백 제거
    '''


Q.두 수의 합

    def solution(a, b):
    return str(int(a)+int(b))



Q.문자열로 변환

def solution(n):
    return str(n)


Q.배열의 원소 삭제하기

def solution(arr, delete_list):
    for x in delete_list : 
        if x in arr : 
            arr.remove(x)
    return arr


Q.부분 문자열인지 확인하기

def solution(my_string, target):
    answer = 0 if my_string.find(target)<0 else 1
    return answer



DAY 23.조건문 활용
Q.부분 문자열

def solution(str1, str2):
    return 0 if str2.find(str1)<0 else 1 
    #return int(str1 in str2)



Q.꼬리 문자열

def solution(str_list, ex):
    answer = ''
    for x in str_list : 
        if ex not in x :
            answer +=x 
    return answer



Q.정수 찾기

def solution(num_list, n):
    return 1 if n in num_list else 0 
    #return int(n in num_list)


Q.주사위 게임 1

def solution(a, b):
    answer = 0
    if a%2!=0 and b%2!=0 :
        answer = a**2 + b**2 
    elif a%2==0 and b%2==0 : 
        answer = abs(a-b) #abs():절댓값 함수
    else : 
        answer = 2*(a+b)
    return answer



Q.날짜 비교하기

def solution(date1, date2):
    answer = -1
    for i in range (3) :
        if date1[i]<date2[i] : 
            answer=1 
            break 
        elif date1[i]>date2[i]:
            answer=0
            break
    if answer==-1 : 
        answer=0
    return answer



DAY 24.조건문 활용, 반복문 활용, 이차원 리스트(배열)
Q.커피 심부름

def solution(order):
    answer = 0
    for x in order : 
        if x=="iceamericano" or x=="americanoice"or x=="hotamericano" or x=="americanohot" or x=="americano" or x=="anything":
            answer+=4500
        elif x=="icecafelatte" or x=="cafelatteice" or x=="hotcafelatte" or x=="cafelattehot" or x=="cafelatte" :
            answer+=5000
    return answer
    #if 'latte' in want:


Q.그림 확대

def solution(picture, k):
    answer = []
    for x in picture :
        tmp=''
        for i in x :
            tmp+=i*k
        for j in range(k) :
            answer.append(tmp)
    return answer



Q.조건에 맞게 수열 변환하기 3

def solution(arr, k):
    if k%2==0:
        for i,x in enumerate(arr) :
            arr[i]=arr[i]+k
    else :
        for i,x in enumerate(arr) :
            arr[i]=arr[i]*k
    return arr
    #return [i*k if k%2!=0 else i+k for i in arr]


Q.l로 만들기

def solution(myString):
    answer = ''
    #아스키코드 변환 함수
    #ord():문자>숫자, chr():숫자>문자
    for x in myString :
        if ord(x)<ord('l'):
        #if i < "l":
            answer+='l'
        else :
            answer +=x
    return answer


Q.특별한 이차원 배열 1

def solution(n):
    answer=[]
    for i in range (n) : 
        tmp=[]
        for j in range(n) :
            if i==j :
                tmp.append(1)
            else :
                tmp.append(0)
        answer.append(tmp)
    return answer
    '''
    answer=[[0]*n for i in range(n)]
    for i in range(n): answer[i][i]=1
    '''



DAY 25.이차원 리스트(배열)
Q.정수를 나선형으로 배치하기 

#**
def solution(n):
    answer=[[0]*n for _ in range(n)]
    #시계방향 : 우,하,좌,상
    dx=[0,1,0,-1]
    dy=[1,0,-1,0]
    
    x,y=0,0
    answer[x][y]=1
    k=2
    while k<=n*n :
        for i in range(4):
            while True :
                nx=x+dx[i]
                ny=y+dy[i]
                if nx>=n or ny>=n or nx<0 or ny<0 or answer[nx][ny]!=0:
                    break
                answer[nx][ny]=k
                x=nx
                y=ny
                k+=1
    return answer


Q.특별한 이차원 배열 2

def solution(arr):
    answer = 1
    for i in range(len(arr)) :
        for j in range(len(arr)) : 
            if arr[i][j] != arr[j][i] :
                answer = 0
    return answer



Q.정사각형으로 만들기

def solution(arr):
    #x=len(arr) #행의 수
    #y=len(arr[0]) #열의 수
    if len(arr) > len(arr[0]) : #행의 수가 더 많을 경우
        for i in range(len(arr)) :
            for j in range(len(arr)-(len(arr[i]))) :
                arr[i].append(0)
    elif len(arr) < len(arr[0]) : #열의 수가 더 많을 경우
        for i in range(len(arr[0])-len(arr)):
            arr.append([0]*len(arr[i]))
    return arr


Q.이차원 배열 다각선 순회하기

def solution(board, k):
    answer = 0
    for i in range(len(board)) : 
        for j in range(len(board[0])) :
            if i+j<=k :
                answer +=board[i][j]
    return answer

사용 문법 정리

-입출력
str = input()
a = int(input())
a, b = map(int, input().strip().split(' '))

-
길이 len(str)
min(counts)
max(counts)
sum(counts)

-print
print(a,'+',b,'=',a+b)
print(str1, str2, sep='')
print(a, end='')

-대소문자 변환
x.isupper()
x.islower()
x.lower()
x.upper()

-공백 제거 
strip()

-반복문 for문 
for i in range(len(str)) : 
    if str[i].isupper() : 

for x in str :
    print(x)

for i in range(0,len(names),5):
        answer.append(names[i])

while answer<=n:
        answer+=numbers[i]
        i+=1

for i,q in enumerate(queries) :
        s=q[0]
        e=q[1]

for idx,x in enumerate(arr) : 
        if x>=50 and x%2==0 :
            arr[idx]=x//2


-조건문 if문
if ineq=='<':
    answer=1
elif ineq=='>':
    answer=1
return answer 

if 2 not in arr: #arr에 2가 없다면
    return -1 

if not finished[i] :
    answer.append(todo_list[i])

if 'latte' in want:

-return 
answer = a+b if flag else a-b

- 변환
x=int(str(a)+str(b))
x=str(code[i])

-연산
짝수even    a%2==0 
홀수odd     a%2==1
배수 num%n==0 
공배수 number%n==0 and number%m==0  #number가 n의 배수이면서 m의 배수 

-숫자
나머지 n%i==0
몫(소숫값) n=n/2
몫(정수) n=n//2
거듭제곱 n**2
정수화 int(a) 
정수화 a=a//1 

- 최대/최솟값
minValue = 2147000000
m=float('inf')

-리스트[]
answer=[]
answer=list()
answer.append(1)
answer.pop()
answer.pop(4)
answer.remove(x) #하나만 제거함

-set : 중복되지 않는 집합(set) 
answer=set()
차집합 set(str(num)) - set(['0','5']) 

-짧게
return [i for i in range(start,end+1)]
return [i for i in range(k,n+1,k)]
return [i for i in range(1, n+1) if i % k == 0]
return list(range(start,end-1,-1))
return [work for idx, work in enumerate(todo_list) if not finished[idx]]
return sum(num_list) if len(num_list)>=11 else prod(num_list)
return [word for word in strArr if 'ad' not in word]
return sorted(ch for ch in myString.split('x') if ch)
return sorted(num_list)[:5]
return [i*k if k%2!=0 else i+k for i in arr]

-논리연산
#논리합 OR ∨ , 논리곱 AND ∧ (True 1, False 0)
a=(True if x1==True or x2==True else False)
b=(True if x3==True or x4==True else False)
#return (x1 | x2) & (x3 | x4)
#return (x1 or x2) and (x3 or x4)

-정렬
-sort()/sorted()
sort() : answer.sort(), list.sort(reverse=True)
    리스트 원본값을 직접 수정함
sorted() : ret=sorted(list), ret=sorted(list,reverse=True)
    리스트 원본 값은 그대로이고 정렬 값을 반환함

-함수
count() : counts=[arr.count(i) for i in arr] #각 숫자의 출현 횟수를 저장
copy() : arr2.append(arr.copy()) #arr2.append(arr) 안됨. 
abs() : 절댓값

-find( )/index() <--> rindex(), rfind() : 뒤에서 부터 
find() : x.find("ad")
    #find(찾을 문자열), find(찾을 문자열, 시작 위치), find(찾을 문자열, 시작 위치, 종료 위치) 
    찾는 문자가 없는 경우에 -1을 출력
    문자열만 사용이 가능
index() : num_list.index(x) x를 찾은 가장 첫 번째 인덱스 
    찾는 문자가 없는 경우에 ValueError 에러가 발생
    문자열, 리스트, 튜플 자료형에서 사용 가능하고 딕셔너리 자료형에는 사용 불가 
myString.rfind(pat)

-문자열 관련
endsWith(),startswith():  my_string.endswith('abc')
    endsWith() 는 특정문자열로 어떤 string이 특정문자열로 끝나는지를 검사해서 그 값을 Boolean값으로 반환 
replace() : replace('a', 'A') , my_string.replace(alp,alp.upper()) 
split() : myString.split(), myString.split(''), myString.split('x') 
strip() 
    인자가 없을 경우 공백 제거 
    'abcdefg'.strip('a') : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
    'abcdefg'.lstrip('a') : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
    'abcdefg'.rstrip('a') : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.

-아스키코드 변환
ord() : ord('A') 문자>숫자
chr() : chr(65) 숫자>문자

-슬라이싱
my_string[len(my_string)-n:]
my_string[-n:]
num_list[::n] #n의 간격 

- from math import prod 
prod() : num_list 원소값을 모두 곱한 값을 리턴
return sum(num_list) if len(num_list)>=11 else prod(num_list) 

-2차원 배열
answer=[[0]*n for i in range(n)]
answer=[[0]*n for _ in range(n)]
for s,e in intervals :
for a,b in intervals: answer+=arr[a:b+1]
return [work for idx, work in enumerate(todo_list) if not finished[idx]]
for i,q in enumerate(queries) :

-2차원 배열 방향 
answer=[[0]*n for _ in range(n)]
#ex 시계방향 : 우,하,좌,상
   dx=[0,1,0,-1]
   dy=[1,0,-1,0]

-변수 바꾸기 
a,b = b,a
arr[i],arr[j] = arr[j],arr[i] 

+ Recent posts