728x90

문제 설명

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

제한사항

  • 3 ≤ number의 길이 ≤ 13
  • 1,000 ≤ number의 각 원소 ≤ 1,000
  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.

입출력 예

numberresult

[-2, 3, 0, 2, -5] 2
[-3, -2, -1, 0, 1, 2, 3] 5
[-1, 1, -1, 1] 0

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.

입출력 예 #3

  • 삼총사가 될 수 있는 방법이 없습니다.

 

나의 풀이

from itertools import combinations

def solution(number):
    arr = list(combinations(number,3))
    
    return sum([sum(a) == 0 for a in arr])

다른 사람의 풀이

import itertools

def solution(number):
    answer = 0
    number_com = itertools.combinations(number,3)
    answer = sum([1 if sum(num)==0 else 0 for num in number_com])
    
    return answer
def solution (number) :
    from itertools import combinations
    cnt = 0
    for i in combinations(number,3):
        if sum(i) == 0 :
            cnt += 1
    return cnt

이 문제는 접근 조차 힘들었다. 일단.. 파이썬은 모듈이 참 많다고 느꼈다. 

 

Combination

: 어떤 쌍(pair)를 return 하고 싶을때 combination을 활용하면 쉽게 구할 수 있다.

import itertools
#usage
itertools.combinations('배열' , '배열 안에서 몇개의 쌍 추출할것인지') 
728x90
728x90

문제 설명

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

Column nameTypeNullable
HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

문제

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.


예시

예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

HISTORY_IDCAR_IDSTART_DATEEND_DATE
1 4 2022-09-27 2022-11-27
2 3 2022-10-03 2022-11-04
3 2 2022-09-05 2022-09-05
4 1 2022-09-01 2022-09-30
5 3 2022-09-16 2022-10-15

2022년 9월의 대여 기록 중 '장기 대여' 에 해당하는 기록은 대여 기록 ID가 1, 4인 기록이고, '단기 대여' 에 해당하는 기록은 대여 기록 ID가 3, 5 인 기록이므로 대여 기록 ID를 기준으로 내림차순 정렬하면 다음과 같이 나와야 합니다.

HISTORY_IDCAR_IDSTART_DATEEND_DATERENT_TYPE
5 3 2022-09-16 2022-10-13 단기 대여
4 1 2022-09-01 2022-09-30 장기 대여
3 2 2022-09-05 2022-09-05 단기 대여
1 4 2022-09-27 2022-10-26 장기 대여

주의사항

START_DATE와 END_DATE의 경우 예시의 데이트 포맷과 동일해야 정답처리 됩니다.

# 풀이

SELECT  HISTORY_ID, CAR_ID,
        DATE_FORMAT(START_DATE,"%Y%-%m-%d") as START_DATE, 
        DATE_FORMAT(END_DATE,"%Y-%m-%d") as END_DATE,
     if(DATEDIFF(END_DATE, START_DATE) >= 29, '장기 대여', '단기 대여') RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE,"%Y-%m") LIKE '2022-09' 
ORDER BY HISTORY_ID DESC;

# 풀이 설명

- CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서, START_DATE 를 "%Y%-%m-%d" or "YYYY-MM-DD" 형식으로 바꿔서 2022년 9월 데이터를 가져온다

- 그리고 DATEDIFF() 함수를 통해서 일수를 비교해주고  END_DATE 에서  START_DATE  를 뺀 값이 29보다 크거나 같으면 "장기 대여", 그렇지 않으면 "단기 대여"로 필요한 값들을 가져온다. 컬럼명은 새로 추가로 RENT_TYPE로 한다.

- date에 시간이 적혀있으니, DATE_FORMAT이란 함수로 날짜를 조정 해준다. 특히 저 날짜를 대문자로 적을시 형식도 바뀌니 주의한다.

- WHERE에서 9월인 날짜를 찾고 DESC를 통해서 내림차순 해줬다

 

 

# 다른 방식의 풀이

SELECT  history_id, car_id,
        DATE_FORMAT(start_date,"%Y%-%m-%d") as START_DATE, 
        DATE_FORMAT(end_date,"%Y-%m-%d") as END_DATE,
     CASE WHEN DATEDIFF(END_DATE, START_DATE) < 29 then '단기 대여' 
            ELSE '장기 대여' 
            END AS  RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
where date_format(start_date,"%Y-%m") LIKE '2022-09' 
ORDER BY HISTORY_ID DESC;

풀이는 위에와 다를게 없다 하지만 CASE THEN ELSE 부분이 다르다.!

>>

1. 2022년 9월에 속하는 대여기록만 추출
2. 대여 기간일을 빼기
3. 새로운 컬럼을 추가하기
4. 뺀 대여기간이 30일 이상일경우 '장기대여' 아닐경우 '단기대여'
5. 결과는 내림차순

 

 

오랜만에 나온 뜨끈뜨근 SQL 문제이다..!

728x90
728x90

문제 설명

다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.

Column nameTypeNullable
CAR_ID INTEGER FALSE
CAR_TYPE VARCHAR(255) FALSE
DAILY_FEE INTEGER FALSE
OPTIONS VARCHAR(255) FALSE

자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(예: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.


문제

CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.


예시

예를 들어 CAR_RENTAL_COMPANY_CAR 테이블이 다음과 같다면

CAR_IDCAR_TYPEDAILY_FEEOPTIONS
1 세단 16000 가죽시트,열선시트,후방카메라
2 SUV 14000 스마트키,네비게이션,열선시트
3 SUV 22000 주차감지센서,후방카메라,가죽시트

'SUV' 에 해당하는 자동차들의 평균 일일 대여 요금은 18,000 원 이므로, 다음과 같은 결과가 나와야 합니다.

AVERAGE_FEE
18000

 

풀이

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

# 문제 풀이 설

이번 문제의 요구사항을 정리해 보면,

"SUV" 차량의 평균 일일 대여 요금을 구하면 되는 문제이다.

 

따라서 'CAR_TYPE' 컬럼에서 "SUV" 차량을 필터링하고

집계 함수중 평균을 구하는 AVG() 함수와 반올림을 하는 ROUND() 함수를 이용하여 조회하면 됩니다!

728x90
728x90

문제 설명

다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(BOOK) 테이블입니다.

BOOK 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

Column nameTypeNullableDescription
BOOK_ID INTEGER FALSE 도서 ID
CATEGORY VARCHAR(N) FALSE 카테고리 (경제, 인문, 소설, 생활, 기술)
AUTHOR_ID INTEGER FALSE 저자 ID
PRICE INTEGER FALSE 판매가 (원)
PUBLISHED_DATE DATE FALSE 출판일

문제

BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.


예시

예를 들어 BOOK 테이블이 다음과 같다면

BOOK_IDCATEGORYAUTHOR_IDPRICEPUBLISHED_DATE
1 인문 1 10000 2020-01-01
2 경제 2 9000 2021-02-05
3 인문 2 11000 2021-04-11
4 인문 3 10000 2021-03-15
5 생활 1 12000 2021-01-10

조건에 속하는 도서는 도서 ID 가 3, 4인 도서이므로 다음과 같습니다.

BOOK_IDPUBLISHED_DATE
3 2021-04-11
4 2021-03-15

그리고 출판일 오름차순으로 정렬하여야 하므로 다음과 같은 결과가 나와야 합니다.

BOOK_IDPUBLISHED_DATE
4 2021-03-15
3 2021-04-11

풀이

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE CATEGORY = '인문' AND YEAR(PUBLISHED_DATE) = 2021
ORDER BY PUBLISHED_DATE;
728x90
728x90

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

제한 조건
  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.
입출력 예snresult
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

나의 풀이

def solution(s, n):
    lower_list = "abcdefghijklmnopqrstuvwxyz"
    upper_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    result = []

    for i in s:
        if i is " ":
            result.append(" ")
        elif i.islower() is True:
            new_ = lower_list.find(i) + n
            result.append(lower_list[new_ % 26])
        else:
            new_ = upper_list.find(i) + n
            result.append(upper_list[new_ % 26])
    return "".join(result)

내장함수의 존재도 몰랐고 그냥 노가다 풀이이다..

아스키코드를 사용하면 더 편하게 구해질 것 같다.

 

다른 사람의 풀이

def solution(s, n):
    s = list(s)
    
    for i in range(len(s)):
        if s[i].isupper():
            s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
        elif s[i].islower():
            s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))

    return "".join(s)
  • 각 문자열을 하나씩 쪼개서 아스키코드로 변환해야하기 때문에 list(s)로 치환해서 담았다. 
  • 만약 s[i]번째 문자가 대문자/소문자라면(isupper/islower) s[i]의 값은 (s[i]의 ASCII값 - 'A'/'a'의 ASCII값(97/65))+n을 해주어 몇 번째에 있는 알파벳인지 찾아준다. (알파벳은 총 25글자)
  • ord(s[i])-ord('A') (또는 ord('a')) 26으로 나눈 나머지 값에 'A'/'a' ASCII 값 = 97/65을 더해주면 n만큼 민 값이 나오게 된다. 
  • %26을 해주는 이유 ? z 또는 Z의 범위를 넘어가지 않도록 하기 위해
  • 즉, 맨 처음 값인 ord('A')와 ord('a')에서 n만큼 증가한 값이 무엇인지 찾는 것이다. 
  • 공백은 밀어도 공백이기 때문에 무시한다.
  • ""을 기준으로 join하여 return

 

✅ Python ASCII 

  • ord(문자) : 문자에 해당하는 ASCII 정수값 반환 
  • chr(정수) : 정수에 해당하는 ASCII 문자 반환
  • string.ascii_lowercase : 소문자에 해당하는 ASCII 값 
  • string.ascii_uppercase : 대문자에 해당하는 ASCII 값

 

✅ ASCII Chart 

문제 다가가기

(1) 아스키코드 값을 n만큼 더하여 문자로 치환한다.

(2) 단, 공백은 그대로 표현된다.

(3) 만약 문자가 Z이고, 10을 더한다면 J 가 나와야한다. 

 

>> 문자열의 아스키코드에서 A/a의 아스키 값을 뺀 후 n을 더해서 문자열이 몇번째 알파벳인지 파악해야한다. 이 값은 26으로 나눴다. 왜 26으로 나눠야하는지 몰랐는데 위에서 참고한 링크를 보니 Z/z의 범위를 넘어가지 않게 하기 위함이라고 한다. (진짜.. 어떻게 저런 생각까지 하는걸까..?)

26을 나눈 값에 다시 A/a의 아스키 값을 더해주면 n만큼 뒤로 밀린 값이 나오게 된다.

공백일 땐 for문이 진행되도록 continue를 해줬다.


코드 설명

우선 이 문제를 풀기 전 반드시 알아두어야하는 파이썬의 내장함수가 있다.

 - ord(문자) : 해당 문자의 ASCII 정수값 반환 

- chr(정수) : 해당 정수의 ASCII 문자 반환

- string.ascii_lowercase : 소문자 ASCII 값 

- string.ascii_uppercase : 대문자 ASCII 값

 

파이썬에서 아스키코드로 변환하는 방법을 찾아보다가 이 4가지 방법을 알게 되었다. 무작정 하드코딩하는 것 보다 이런 방법을 알고 있으면 훨씬 쉽고 간단하게 코드를 짤 수 있는 것 같다.. 아직 많이 모르고 있다는 걸 이번 문제를 풀면서 또 느꼈다!

 

나는 ord(), chr() 함수에 대해 설명하고자 한다.

 

(1) 문자열 탐색 및 공백 처리

def solution(s, n):
    answer = ''
    for i in s:
        if i == " ":
            answer += " "

문자열 s를 보고 문자 하나씩 탐색해나간다.

만약, i(문자)가 공백문자열이라면, 결과에 공백 문자열을 더해준다. 

 

(2) 아스키코드 처리

def solution(s, n):
    answer = ''
    for i in s:
        if i == " ":
            answer += " "
            
	else:
            k = chr(ord(i) + n)
            if k.isupper() != i.isupper() or not k.isalpha():
                k = chr(ord(k) - 26)
            answer += k
    return answer

- 만약 문자가 공백이 아닐 경우 (else문으로 들어온다.)

- 임시 변수 k에 i의 아스키 코드값을 구한 후 n을 더해주고 이를 다시 문자로 변환한다.

    -> k = 임시 변수

    -> ord(k) + n : k의 아스키 코드 값에 n을 더해줌.

    -> chr(ord(k) + n) : 다시 문자로 바꾸어줌.

 

- 임시변수 k에는 두가지 상황이 있을 수 있다. -> else 문 내에 if 문으로 처리

    (1) k가 특수문자인 경우 (대소문자의 범위에서 벗어남)

    (2) 기존 문자는 대문자이지만, n을 더한 k가 소문자가 된 경우

        -> 아스키코드 표에서 문자 = Z, n =10인 경우를 생각하면 된다.

    (처리방법)

        - 만약 현재 문자 i는 대문자인데, k가 소문자인 경우, 또는 k가 알파벳이 아닌 경우

            -> k에서 26(알파벳의 개수)만큼 빼서 해결할 수 있다.

                -> i = Z, n = 10일 때를 생각해보자.    

                -> i에 n을 더하면 k는 d가 된다. 이때  k.isalpha는 참이지만, 앞 조건이 거짓이 된다.

                -> k에서 26을 빼 주면 J가 된다.

                -> Z에서 10을 더하면  J가 된다!!!

728x90
728x90

문제 설명

다음은 아이스크림 가게의 상반기 주문 정보를 담은 FIRST_HALF 테이블과 아이스크림 성분에 대한 정보를 담은 ICECREAM_INFO 테이블입니다. FIRST_HALF 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER 는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다. FIRST_HALF 테이블의 기본 키는 FLAVOR입니다.

NAMETYPENULLABLE
SHIPMENT_ID INT(N) FALSE
FLAVOR VARCHAR(N) FALSE
TOTAL_ORDER INT(N) FALSE

ICECREAM_INFO 테이블 구조는 다음과 같으며, FLAVOR, INGREDITENT_TYPE 은 각각 아이스크림 맛, 아이스크림의 성분 타입을 나타냅니다. INGREDIENT_TYPE에는 아이스크림의 주 성분이 설탕이면 sugar_based라고 입력되고, 아이스크림의 주 성분이 과일이면 fruit_based라고 입력됩니다. ICECREAM_INFO의 기본 키는 FLAVOR입니다. ICECREAM_INFO테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다.

NAMETYPENULLABLE
FLAVOR VARCHAR(N) FALSE
INGREDIENT_TYPE VARCHAR(N) FALSE

문제

상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.


예시

예를 들어 FIRST_HALF 테이블이 다음과 같고

SHIPMENT_IDFLAVORTOTAL_ORDER
101 chocolate 3200
102 vanilla 2800
103 mint_chocolate 1700
104 caramel 2600
105 white_chocolate 3100
106 peach 2450
107 watermelon 2150
108 mango 2900
109 strawberry 3100
110 melon 3150
111 orange 2900
112 pineapple 2900

ICECREAM_INFO 테이블이 다음과 같다면

FLAVORINGREDIENT_TYPE
chocolate sugar_based
vanilla sugar_based
mint_chocolate sugar_based
caramel sugar_based
white_chocolate sugar_based
peach fruit_based
watermelon fruit_based
mango fruit_based
strawberry fruit_based
melon fruit_based
orange fruit_based
pineapple fruit_based

상반기 아이스크림 총주문량이 3,000보다 높은 아이스크림 맛은 chocolate, strawberry, melon, white_chocolate입니다. 이 중에 아이스크림의 주 성분이 과일인 아이스크림 맛은 strawberry와 melon이고 총주문량이 큰 순서대로 아이스크림 맛을 조회하면 melon, strawberry 순으로 조회되어야 합니다. 따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.

FLAVOR
melon
strawberry

 

 

풀이

SELECT FIRST_HALF.FLAVOR 
FROM FIRST_HALF JOIN ICECREAM_INFO 
ON FIRST_HALF.FLAVOR = ICECREAM_INFO.FLAVOR
WHERE TOTAL_ORDER > 3000 AND INGREDIENT_TYPE = "fruit_based"
ORDER BY TOTAL_ORDER DESC
SELECT a.FLAVOR 
FROM FIRST_HALF AS a 
LEFT JOIN ICECREAM_INFO AS b 
ON a.FLAVOR = b.FLAVOR
WHERE a.TOTAL_ORDER > 3000 AND b.INGREDIENT_TYPE LIKE 'fruit_based'
ORDER BY a.TOTAL_ORDER DESC;

-- FLAVOR는 공통 컬럼, 테이블 명 작성 필수

 

정리

JOIN
데이터베이스 내의 '여러 테이블'에서 가져온 레코드를 조합하여 '하나의 테이블'이나 '결과 집합'으로 표현해 주는, Relation Database 에서 가장 많이 쓰이는 녀석이다.

(INNER) JOIN
여기서 사용된 조인은 가장 기본적인 조인이다.

  • 조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력
  • 표준 SQL과는 달리 MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용된다.
SELECT u.userid, name 
FROM usertbl as u INNER JOIN buytbl as b 
ON u.userid=b.userid 
WHERE u.userid="111" -- join을 완료하고 그다음 조건을 따진다.

함축 구문도 존재한다. (콤마)

SELECT u.userid, name 
FROM usertbl u, buytbl b 
ON u.userid=b.userid 
WHERE u.userid="111" -- join을 완료하고 그다음 조건을 따진다.

 

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-JOIN-%EC%A1%B0%EC%9D%B8-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EA%B8%B0%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC

728x90
728x90

문제 설명

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한사항
  • d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
  • d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
  • budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

입출력 예dbudgetresult
[1,3,2,5,4] 9 3
[2,2,3,3] 10 4
입출력 예 설명

입출력 예 #1
각 부서에서 [1원, 3원, 2원, 5원, 4원]만큼의 금액을 신청했습니다. 만약에, 1원, 2원, 4원을 신청한 부서의 물품을 구매해주면 예산 9원에서 7원이 소비되어 2원이 남습니다. 항상 정확히 신청한 금액만큼 지원해 줘야 하므로 남은 2원으로 나머지 부서를 지원해 주지 않습니다. 위 방법 외에 3개 부서를 지원해 줄 방법들은 다음과 같습니다.

  • 1원, 2원, 3원을 신청한 부서의 물품을 구매해주려면 6원이 필요합니다.
  • 1원, 2원, 5원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.
  • 1원, 3원, 4원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.
  • 1원, 3원, 5원을 신청한 부서의 물품을 구매해주려면 9원이 필요합니다.

3개 부서보다 더 많은 부서의 물품을 구매해 줄 수는 없으므로 최대 3개 부서의 물품을 구매해 줄 수 있습니다.

입출력 예 #2
모든 부서의 물품을 구매해주면 10원이 됩니다. 따라서 최대 4개 부서의 물품을 구매해 줄 수 있습니다.

 

나의 풀이

def solution(d, budget):
    answer = 0    
    d.sort()
    now=0
    for x in d:
        if (now+x)<=budget:
            now+=x
            answer+=1
        else:
            break
    return answer

 

 

다른 사람의 풀이

def solution(d, budget):
    d.sort()
    while budget < sum(d):
        d.pop()
    return len(d)
728x90
728x90

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 사항
  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
입출력 예sreturn
"try hello world" "TrY HeLlO WoRlD"
입출력 예 설명

"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.

<풀이>

def solution(s):
    
    ss = s.split(" ")
    
    answer = ''
    
    for i in range(len(ss)):
        for j in range(len(ss[i])):
            if j % 2 == 0: 
                answer += ss[i][j].upper()
            else:
                answer += ss[i][j].lower()
        
        if i != len(ss) - 1:
            answer += ' '
    
    return answer
def solution(s):
    s_split = s.split(" ")  # 받은 문자열을 단어별(스페이스 기준)으로 split해서 list에 넣어주기
    
    for k in range(len(s_split)):  # 단어 리스트에 있는 단어들 반복할 때 그 단어 길이 만큼 반복문
        s_list = list(s_split[k]) # 문자열을 새로 만들어야 하니 s_list라는 리스트에 입력

        for i in range(len(s_list)):  # 단어 리스트에 있는 단어들 반복할 때 그 단어 길이 만큼 반복문
            if i % 2 == 0:
                s_list[i] = s_list[i].upper() # 단어가 홀수면 대문자로 바꿔서 리스트에 붙여주기
            elif i % 2 == 1:
                s_list[i] = s_list[i].lower() # 단어가 짝수면 소문자로 바꿔서 리스트에 붙여주기
        s_split[k] = "".join(s_list)
        
    answer = " ".join(s_split)  # 새로 채워진 list s_split에 있는 요소들 붙여서 return (스페이스 중간에 넣어주기)

    
    return answer

1. 공백(" ")을 기준으로 문자열을 나누기

2. 문자열을 받아서 인덱스가 짝수면 대문자로, 홀수면 소문자로 문자열 지정 => 2로 나눈 나머지가 0이면 짝수로 대문자, 아니면 홀수로 소문자

2-1) 대문자로 만들기 위해 .upper() 함수 사용

2-2) 소문자로 만들기 위해 .lower() 함수 사용

3. 한 문자열의 판단이 끝나면 공백을 추가

4. 결과의 마지막 공백은 제거후 리턴

[TrY, HeLlO, WoRlD]가 된다. 여기서 (" ").join으로 문자열을 합쳐서 반환하자.

728x90

+ Recent posts