728x90

스택/큐

 

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항
  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예sanswer
"()()" true
"(())()" true
")()(" false
"(()(" false
입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

 

나의 풀이

def solution(s):
    stack = []
    for i in s:
        if i == '(':
            stack.append(i)
        else:
            if stack == []: # 오른쪽 괄호로 시작할경우
                return False
            else:
                stack.pop()
    if stack != []: # 다 끝났는데 왼쪽 괄호가 스택에 남아있을경우
        return False
    return True
728x90
728x90

문제 설명

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다.
배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)

예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면

  • A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
  • A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
  • A에서 세번째 숫자인 2, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)

즉, 이 경우가 최소가 되므로 29를 return 합니다.

배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.

제한사항
  • 배열 A, B의 크기 : 1,000 이하의 자연수
  • 배열 A, B의 원소의 크기 : 1,000 이하의 자연수
입출력 예ABanswer
[1, 4, 2] [5, 4, 4] 29
[1,2] [3,4] 10
입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
A에서 첫번째 숫자인 1, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 4) 다음, A에서 두번째 숫자인 2, B에서 첫번째 숫자인 3을 뽑아 곱하여 더합니다. (누적된 값 : 4 + 6 = 10)
이 경우가 최소이므로 10을 return 합니다.

 

 

나의 풀이

def solution(A,B):
    answer = 0
    A.sort(reverse = True)
    B.sort()
    for i in range(len(A)):
        answer += A[i] * B[i]
    return answer

 

728x90
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

1. 덧셈 ( + )

문자열도 덧셈가능. 

>>> 2+3

5

>>> "hi"+"hello"

'hihello'

 

2. 뺄셈 ( - )

문자열은 뺄셈 불가. 

>>> 2-3

-1

>>> "hi"-"hello"

Traceback (most recent call last):

 

  File "<ipython-input-6-42d8c0eec2fe>", line 1, in <module>

    "hi"-"hello"

 

TypeError: unsupported operand type(s) for -: 'str' and 'str'

 

3. 곱셈 ( * )

 

- 문자열도 정수와 곱셈 가능. 실수와는 곱셈 불가. 

>>> 3*4

12

>>> "hi"*3

'hihihi'

>>> "hi"*3.0

Traceback (most recent call last):

 

  File "<ipython-input-11-80e9c3f36b0c>", line 1, in <module>

    "hi"*3.0

 

TypeError: can't multiply sequence by non-int of type 'float'

 

4. 나눗셈 ( / )

>>> 3/5

0.6

 

5. 거듭제곱 ( ** )

>>> 3**3

27

>>> 2**5

32

 

6. 몫 ( // )

>>> 10//3

3

>>> 5//2

2

 

7. 나머지 ( % )

>>> 10%3

1

>>> 5%3

2

 

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

+ Recent posts