728x90

문제 설명

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건
  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.
입출력 예sreturn
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

나의 풀이

def solution(s):
    answer = s.split(" ")
    
    for i in range(len(answer)):
        answer[i] = answer[i][0].upper() + answer[i][1:].lower()
    return ' '.join(answer)

1. 문자열을 공백으로 분리하여 단어 배열을 만든다.

2. 각 단어를 탐색하며 단어의 맨 앞글자는 대문자로 바꾸고, 나머지는 소문자로 바꾼다.

3. 다시 공백을 기준으로 조인하여 리턴한다.

 

오류가 난다.. 

def solution(s):
    answer = s.split(" ")
    
    for i in range(len(answer)):
        answer[i] = answer[i][:1].upper() + answer[i][1:].lower()
    return ' '.join(answer)

answer[i][0].upper() 에서 answer[i][:1].upper() 으로 수정하니 오류없이 실행된다. 흠..

 

 

title() 내장함수를 사용해서 풀수도 있나보다. 하지만 현재 개편된 상태라서 실행이 안됨

title 주어진 문자열에서 알파벳 외의 문자(숫자, 특수기호, 띄어쓰기 등)로 나누어져 있는 영단어들의 첫 글자를 모두 대문자로 변환시킨다.

 

728x90
728x90

문제 설명

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

제한 조건
  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
입출력 예sreturn
"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 -1" "-1 -1"

나의 풀이

def solution(s):
    arr = list(map(int, s.split(' ')))         
    arr.sort()                                  
    return str(arr[0]) + " " + str(arr[-1])

# split()을 통해 공백 기준으로 나눠 리스트를 생성
# map()을 사용하여 값을 str -> int 로 변경
# map object를 list()를 통해 리스트로 변경

# int로 이루어진 배열을 sort

# 첫번째 값 : 최솟값, 마지막 값 : 최댓값

  • split()을 통해 문자열을 리스트로 변경하기
  • map()을 통해 for문을 사용하지 않고, str → int로 변경

다른사람 풀이

def solution(s):
    s = list(map(int, s.split()))
    return str(min(s)) + " " + str(max(s))
728x90
728x90

문제 설명

다음은 어느 의류 쇼핑몰에서 판매중인 상품들의 상품 정보를 담은 PRODUCT 테이블과 오프라인 상품 판매 정보를 담은 OFFLINE_SALE 테이블 입니다. PRODUCT 테이블은 아래와 같은 구조로 PRODUCT_ID, PRODUCT_CODE, PRICE는 각각 상품 ID, 상품코드, 판매가를 나타냅니다.

Column nameTypeNullable
PRODUCT_ID INTEGER FALSE
PRODUCT_CODE VARCHAR(8) FALSE
PRICE INTEGER FALSE

상품 별로 중복되지 않는 8자리 상품코드 값을 가지며, 앞 2자리는 카테고리 코드를 의미합니다.

OFFLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 오프라인 상품 판매 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

Column nameTypeNullable
OFFLINE_SALE_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

동일한 날짜, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.


문제

PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량) 합계를 출력하는 SQL문을 작성해주세요. 결과는 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬해주세요.


예시

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

PRODUCT_IDPRODUCT_CODEPRICE
1 A1000011 15000
2 A1000045 8000
3 C3000002 42000

OFFLINE_SALE 테이블이 다음과 같다면

OFFLINE_SALE_IDPRODUCT_IDSALES_AMOUNTSALES_DATE
1 1 2 2022-02-21
2 1 2 2022-03-02
3 3 3 2022-05-01
4 2 1 2022-05-24
5 1 2 2022-07-14
6 2 1 2022-09-22

각 상품 별 총 판매량과 판매가는 다음과 같습니다.

  • PRODUCT_CODE  A1000011인 상품은 총 판매량이 6개, 판매가가 15,000원
  • PRODUCT_CODE  A1000045인 상품은 총 판매량이 2개, 판매가가 8,000원
  • PRODUCT_CODE  C3000002인 상품은 총 판매량이 3개, 판매가가 42,000원

그러므로 각 상품 별 매출액을 계산하고 정렬하면 결과가 다음과 같이 나와야 합니다.

PRODUCT_CODESALES
C3000002 126000
A1000011 90000
A1000045 16000

나의 풀이

SELECT A.PRODUCT_CODE, (A.PRICE * SUM(B.SALES_AMOUNT)) AS SALES
FROM PRODUCT AS A
JOIN OFFLINE_SALE AS B ON A.PRODUCT_ID = B.PRODUCT_ID
GROUP BY A.PRODUCT_ID
ORDER BY SALES DESC, A.PRODUCT_CODE

PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량)합계 를 출력하는 SQL문을 작성하기

결과는 매출액을 기준으로 내림차순 정렬하고  매출액이 같다면 상품코드를 기준으로 오름차순 정렬하기

  • 1번째 줄: 상품코드 별 매출액(판매가 * 판매량)합계 를 가져오고 별칭을 지정해준다.
  • 2번째 줄: JOIN기준 테이블을 PRODUCT 테이블로 지정한다.
  • 3번째 줄: OFFLINE_SALE을 JOIN대상 테이블로 지정하고, 별칭을 지정해준다.
  • 4번째 줄: PRODUCT_ID로 JOIN을한다.
  • 6번째 줄: 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬
728x90
728x90

문제 설명

다음은 종합병원의 진료 예약정보를 담은 APPOINTMENT 테이블 입니다.
APPOINTMENT 테이블은 다음과 같으며 APNT_YMD, APNT_NO, PT_NO, MCDP_CD, MDDR_ID, APNT_CNCL_YN, APNT_CNCL_YMD는 각각 진료예약일시, 진료예약번호, 환자번호, 진료과코드, 의사ID, 예약취소여부, 예약취소날짜를 나타냅니다.

Column nameTypeNullable
APNT_YMD TIMESTAMP FALSE
APNT_NO NUMBER(5) FALSE
PT_NO VARCHAR(10) FALSE
MCDP_CD VARCHAR(6) FALSE
MDDR_ID VARCHAR(10) FALSE
APNT_CNCL_YN VARCHAR(1) TRUE
APNT_CNCL_YMD DATE TRUE

문제

APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요. 이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.


예시

APPOINTMENT 테이블이 다음과 같을 때

APNT_YMDAPNT_NOPT_NOMCDP_CDMDDR_IDAPNT_CNCL_YNAPNT_CNCL_YMD
2022-04-14 09:30:00.000000 47 PT22000064 GS DR20170123 N NULL
2022-04-15 10:30:00.000000 48 PT22000065 OB DR20100231 N NULL
2022-05-15 17:30:00.000000 49 PT22000086 OB DR20100231 N NULL
2022-05-18 10:30:00.000000 52 PT22000019 GS DR20100039 N NULL
2022-05-19 12:00:00.000000 53 PT22000020 FM DR20010112 N NULL
2022-05-22 08:30:00.000000 54 PT22000021 GS DR20100039 N NULL
2022-05-04 10:30:00.000000 56 PT22000023 FM DR20090112 N NULL
2022-05-14 15:30:00.000000 57 PT22000074 CS DR20200012 N NULL
2022-05-24 15:30:00.000000 58 PT22000085 CS DR20200012 N NULL
2022-05-28 10:00:00.000000 60 PT22000092 OS DR20100031 N NULL

SQL을 실행하면 다음과 같이 출력되어야 합니다.

진료과코드5월예약건수
OB 1
OS 1
CS 2
FM 2
GS 2

나의 풀이

SELECT MCDP_CD AS '진료과코드', COUNT(MCDP_CD) AS '5월예약건수'
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05-%'
GROUP BY MCDP_CD
ORDER BY 5월예약건수 ASC, 진료과코드 ASC
728x90
728x90

문제 설명

다음은 식당 리뷰 사이트의 회원 정보를 담은 MEMBER_PROFILE 테이블입니다. MEMBER_PROFILE 테이블은 다음과 같으며 MEMBER_ID, MEMBER_NAME, TLNO, GENDER, DATE_OF_BIRTH는 회원 ID, 회원 이름, 회원 연락처, 성별, 생년월일을 의미합니다.

Column nameTypeNullable
MEMBER_ID VARCHAR(100) FALSE
MEMBER_NAME VARCHAR(50) FALSE
TLNO VARCHAR(50) TRUE
GENDER VARCHAR(1) TRUE
DATE_OF_BIRTH DATE TRUE

문제

MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.


예시

MEMBER_PROFILE 테이블이 다음과 같을 때

MEMBER_IDMEMBER_NAMETLNOGENDERDATE_OF_BIRTH
jiho92@naver.com 이지호 01076432111 W 1992-02-12
jiyoon22@hotmail.com 김지윤 01032324117 W 1992-02-22
jihoon93@hanmail.net 김지훈 01023258688 M 1993-02-23
seoyeons@naver.com 박서연 01076482209 W 1993-03-16
yoonsy94@gmail.com 윤서연 NULL W 1994-03-19

SQL을 실행하면 다음과 같이 출력되어야 합니다.

MEMBER_IDMEMBER_NAMEGENDERDATE_OF_BIRTH
seoyeons@naver.com 박서연 W 1993-03-16

나의 풀이

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH)=3 AND GENDER='W' AND TLNO IS NOT NULL
ORDER BY MEMBER_ID
  • 3가지 조건을 충족해야한다.
    - 생일이 3월이다. MONTH(DATE_OF_BIRTH)=3
    - 성별이 여성이다. GENDER='W'
    - 전화번호가 NULL 아니다. TLNO IS NOT NULL
  • MEMBER_ID 오름차순 정렬
728x90
728x90

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAMETYPENULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.

예시

이때 결과는 아이디 순으로 조회해주세요. 예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A373219 Cat 2014-07-29 11:43:00 Normal Ella Spayed Female
A377750 Dog 2017-10-25 17:17:00 Normal Lucy Spayed Female
A353259 Dog 2016-05-08 12:57:00 Injured Bj Neutered Male
A354540 Cat 2014-12-11 11:48:00 Normal Tux Neutered Male
A354597 Cat 2014-05-02 12:16:00 Normal Ariel Spayed Female

SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_IDNAMESEX_UPON_INTAKE
A373219 Ella Spayed Female
A377750 Lucy Spayed Female

나의 풀이

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE 
FROM ANIMAL_INS
WHERE NAME IN("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty")

IN을 사용해서 특정 이름값만 조회가 가능하다

WHERE 컬럼명 IN('값', '값2') 이런 식으로 활용해주면 된다

 

해당 문제에는 해당되지 않지만

특정 값이 아닐 경우에만 출력한다면

NOT IN('값') 이런 식으로도 활용이 가능하다

728x90
728x90

문제 설명

다음은 어느 의류 쇼핑몰에서 판매중인 상품들의 정보를 담은 PRODUCT 테이블입니다. PRODUCT 테이블은 아래와 같은 구조로 되어있으며, PRODUCT_ID, PRODUCT_CODE, PRICE는 각각 상품 ID, 상품코드, 판매가를 나타냅니다.

Column nameTypeNullable
PRODUCT_ID INTEGER FALSE
PRODUCT_CODE VARCHAR(8) FALSE
PRICE INTEGER FALSE

상품 별로 중복되지 않는 8자리 상품코드 값을 가지며, 앞 2자리는 카테고리 코드를 의미합니다.


문제

PRODUCT 테이블에서 상품 카테고리 코드(PRODUCT_CODE 앞 2자리) 별 상품 개수를 출력하는 SQL문을 작성해주세요. 결과는 상품 카테고리 코드를 기준으로 오름차순 정렬해주세요.


예시

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

PRODUCT_IDPRODUCT_CODEPRICE
1 A1000011 10000
2 A1000045 9000
3 C3000002 22000
4 C3000006 15000
5 C3000010 30000
6 K1000023 17000

상품 카테고리 코드 별 상품은 아래와 같으므로,

  • A1: PRODUCT_ID가 1, 2 인 상품
  • C3: PRODUCT_ID가 3, 4, 5 인 상품
  • K1: PRODUCT_ID가 6 인 상품

다음과 같은 결과가 나와야 합니다.

CATEGORYPRODUCTS
A1 2
C3 3
K1 1

 


나의 풀이

SELECT LEFT(PRODUCT_CODE,2) AS "CATEGORY", COUNT(PRODUCT_CODE) AS "PRODUCTS"
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY

LEFT() 함수로 PRODUCT_CODE 앞 2자리를 가져왔고 이를 카테고리라고 지정.

그 다음 카테고리별 개수를 구하는 것이니깐 GROUP BY로 생성한 CATEGORY별로 집계 실행

 


문자열을 다루는 함수에는 아래와 같이 총 4개가 존재하는데, 함수의 이용 방법이 조금씩 다르다.

  • SUBSTR() 
  • MID()
  • LEFT()
  • RIGHT()

아래에서 문자열을 다루는 함수의 설명과 예를 들어볼게요!

 

1. SUBSTR() / MID()

- SUBSTR(문자, 시작 위치, 가져올 개수) 
- MID(문자, 시작 위치, 가져올 수)
가져올 수를 정의하지 않으면, 시작 위치 이후의 모든 값을 불러옵니다.

SELECT  SUBSTR( 'ABCDEFG', 2 , 3 ) 
출력 결과 : 'BCD'

SELECT  SUBSTR( 'ABCDEFG', 2) 
출력 결과 : 'BCDEFG'

SELECT  MID( 'ABCDEFG', 3, 4 )
출력 결과 : 'CDEF'

SELECT  MID( 'ABCDEFG', 3 )
출력 결과 : 'CDEFG'

2. LEFT()

- LEFT(문자, 왼쪽부터 가져올 갯수)

SELECT  LEFT( 'ABCDEFG', 3 ) 
출력 결과 : 'ABC'

3. RIGHT()

- RIGHT(문자, 오른쪽부터 가져올 갯수)

SELECT  RIGHT( 'ABCDEFG', 3 ) 
출력 결과 : 'EFG'
728x90
728x90

문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

NAMETYPENULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

HOURCOUNT
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2

나의 풀이

SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <20
GROUP BY HOUR 
ORDER BY HOUR;
  1. DATETIME 컬럼을 사용해 풀면 되는데 테이블을 출력해보면 DATETIME은 "2014-06-28 13:40:00" 이 형식으로 되어있다. DATETIME을 시간으로 바꾸기 위해서는 HOUR 함수를 사용하면 된다.COUNT 안 HOUR(DATETIME), DATETIME, * 모두 가능
  2. 09:00부터 19:59까지 출력하기 위해 WHERE 절을 적용한다.
  3. 시간대별 갯수를 출력하기 위해 그룹함수를 사용한다. (AS HOUR이 적용됨)
  4. 시간대순으로 정렬하기 위해 ORDER BY를 사용한다. (AS HOUR이 적용됨)
728x90

+ Recent posts