728x90

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건
  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예stringsnreturn
["sun", "bed", "car"] 1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]
입출력 예 설명

입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.

입출력 예 2
"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.

 

풀이

def solution(strings, n):
    return sorted(strings, key = lambda x:(x[n],x))
def solution(strings, n):
    return sorted(sorted(strings), key=lambda x: x[n])
def solution(strings, n):
    return sorted(sorted(strings), key=lambda strings: strings[n])

lambda에 튜플을 넣어줌으로써 sort의 우선순위를 정할 수 있다.

lambda함수를 이용해서 x에서 n번째 값을 기준으로 정렬한다.

세개의 풀이는 모두 같다! 그냥 정렬을 한번 더 해주는지, 람다의 인자값을 뭘로 하는지가 달라진다.

정리

  1. sort, sorted에 key인자를 넣어줌으로써 정렬 기준을 정할 수 있다.
  2. key 기준으로 정렬을 할 경우 오직 key 기준으로만 정렬을 한다.
  3. key이외의 나머지 요소에 대해선 정렬되지 않음.
  4. lambda를 이용한 key 설정에서 튜플을 넣어줌으로써 정렬의 우선순위를 지정할 수 있다.
  5. 이때 함수는 lambda를 사용할 수 있다.
  6. key값을 기준으로 정렬되고 기본값은 오름차순이다.
  7. 먼저 x[n]에 대하여 정렬하고 x에 대하여도 정렬해야하니 (x[n],x)라고 적어준다.
  8. 만약 내림차순으로 할 경우 -부호를 사용하면 역순으로 출력할수 있다.
  9. {lambda 인자: (정렬 기준1, 정렬 기준2)} 형식 사용한다.
  10. 원소 자체인 strings을 입력하면 사전 순서대로 정렬을 한다는 의미이다.
  11. 때문에 strings[n]로 정렬 후 이 문자가 같을 땐 strings 즉, 사전 순서대로 정렬한다는 의미이다.
728x90
728x90

문제 설명

비밀지도

네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

  1. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
  2. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
  3. "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
  4. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.

네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.

입력 형식

입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.

  • 1 ≦ n ≦ 16
  • arr1, arr2는 길이 n인 정수 배열로 주어진다.
  • 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.

출력 형식

원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.

입출력 예제

매개변수값
n 5
arr1 [9, 20, 28, 18, 11]
arr2 [30, 1, 21, 17, 28]
출력 ["#####","# # #", "### #", "# ##", "#####"]
매개변수값
n 6
arr1 [46, 33, 33 ,22, 31, 50]
arr2 [27 ,56, 19, 14, 14, 10]
출력 ["######", "### #", "## ##", " #### ", " #####", "### # "]

 


나의 풀이

def solution(n, arr1, arr2):
    answer = []
    arr1_bin = []
    arr2_bin = []
    for i in range(n):
        arr1_bin.append(bin(arr1[i])[2:])
        arr2_bin.append(bin(arr2[i])[2:])
        arr1_bin[i] = ('0' * (n-len(arr1_bin[i]))) + arr1_bin[i]
        arr2_bin[i] = ('0' * (n-len(arr2_bin[i]))) + arr2_bin[i]
    
        tmp = ''
        for p in range(n):
            if arr1_bin[i][p] == '1' or arr2_bin[i][p] == '1':
                tmp += '#'
            elif arr1_bin[i][p] == '0' and arr2_bin[i][p] == '0':
                tmp += ' '
        answer.append(tmp)
        
    return answer

arr1과 arr2가 2진수가 아닌 10진수로 표현되었기 때문에 먼저 이를 2진수로 변환해준다.

2진수로 변환하는 건 내장함수인 bin 함수를 사용하였다. bin 함수는 10진수를 2진수로 변환해주는 함수이다.

주어진 매개변수를 2진수로 변환하면서 앞에 binary를 의미하는 '0b'가 붙는다.
따라서 이진수만 뽑아내기 위해서는 앞의 '0b'를 제외하기 위해 인덱싱하여 사용했다. >> [2: ]

이 뒤에서 조금 고민이 생겼는데, 보물지도 형태라면 00010과 같이 앞자리에도 0이 포함되도록 데이터를 조작해야 했다.

주의해야 할 점이 있다면 모든 이진수가 str형태로 되어있다는 점이다.
따라서 arr1_bin과 arr2_bin 둘 중 하나에 '1'이 포함된다면 '#'을, 그렇지 않으면 공백으로 처리하여 보물지도 배열을 완성하였다.

 

다른 사람의 풀이

def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        a12 = str(bin(i|j)[2:])
        a12=a12.rjust(n,'0')
        a12=a12.replace('1','#')
        a12=a12.replace('0',' ')
        answer.append(a12)
    return answer
    
-------------------------------------------------------------------------------

def solution(n, arr1, arr2):
    answer = []
    
    for i in range(n):
        tmp = bin(arr1[i] | arr2[i])
        # tmp결과 ex) '0b1101'
        tmp = tmp[2:].zfill(n)
        # tmp결과 ex) '01101'
        tmp = tmp.replace('1','#').replace('0',' ')
        # tmp결과 ex) ' ## #'
        answer.append(tmp)
    
    return answer

다른 사람들의 풀이를 보면 비슷하다는 것을 알 수 있을 것이다. 

 

다른 사람 풀이

(1) or 비트 연산을 하고, 2진법 숫자로 바꿔준다. (or연산은 | , xor연산은 ^, and연산은 & 라고 한다.)

(2) 2진법( ex) '0b1101')의 앞에 2개를 제거하고, zfill을 사용해서 앞에 0이 올 수 있도록 한다. (n=5 일떄, 11111은 문제 없으나 글자 수가 n이 안되는 1111은 앞에 0으로 채워줘야 한다. zfill(n)을 하면 n만큼 부족한 부분을 앞에 0으로 채워준다.)

(3) 1을 #으로, 0을 공백으로 치환한다.

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

HTML을 편리하게 생성하는 뷰 기능은 다음과 같다.

1. JSP

• 속도 느림, 기능 부족

 

2. 프리마커(Freemarker), Velocity(벨로시티)

• 속도 문제 해결, 다양한 기능

 

3. 타임리프(Thymeleaf)

• 내추럴 템플릿: HTML의 모양을 유지하면서 뷰 템플릿 적용 가능

• 스프링 MVC와 강력한 기능 통합

• 최선의 선택, 단 성능은 프리마커, 벨로시티가 더 빠름

 

그 중 jsp와 타임리프에 대해 설명하고자 한다.

 

일단 java 기반의 서버 프레임워크를 공부하다보면 jsp 라는 것을 쓰게 된다.

 

jsp는 일반적인 자바 프레임워크 MVC 구조에서 'V' , 즉 뷰 역할을 담당한다.

 

그리고 jsp의 상위버전? 이라 하는 Thymeleaf라는것도 있다. 타임리프는 요즘 스프링에서 밀고있는 스프링 프레임워크의 뷰라고 보면 될것같다. 

 

Thymeleaf 이외에도 Apache Freemarker, Mustache, Groovy Templates 등 여러 템플릿 엔진이 있지만 요즘은 Thymeleaf를 많이 쓰는 것 같다. ( JSP는 옛날 회사에서는 아직도 많이 쓴다)

 

자 아무튼 오늘은 Thymeleaf와  jsp 차이점을 알아보고, 그리고 간단하게 Thymeleaf를 사용하는 방법을 알아보도록하자!!

 

먼저 jsp 의 경우에는 아시다시피 서블릿 이라는 형태로 변환되어 실행이 된다. 서블릿이 자바소스 이다 보니 JSP내에서도 자바코드를 사용할 수 있게된다. (요즘에는 보통 JSP 내부에 비지니스 로직이 포함된 자바코드를 넣는 것은 지양한다)

 

반면 Thymeleaf는 html, xml, js, css 등을 처리할 수 있는 웹 및 독립형 환경에서 사용이 가능한 java 템플릿 엔진이다. Thymeleaf는 html 파일을 가져와서 파싱하고 그걸 분석하여 정해진 위치에 데이터를 뿌려준다.

 

Thymeleaf 의 장점은 코드자체가 앞서 말한것처럼 html 같은 웹형태이기에 was없이도 그냥 브라우저에서 직접 띄어볼 수 가 있다. thymeleaf 가 jsp 처럼 전용 문법을 사용하지 않고 그냥 html 엘리먼트에 속성으로 값을 넣어주기 때문이다.

(브라우저는 html의 모르는 속성으 무시해버리니깐 브라우저에서 그냥 띄어볼수 있는거다)

 

물론 Thymeleaf 가 만능은 아니다.. ( 그나마 3.x 버전대는 굉장히 괜찮아진듯하다.)

JSP 에 비해 속도가 좀 떨어지는 것 같고, 구조적인 부분에서 꽤나 한계가 있는 것을 느꼈다. 

 

그래도 SpringBoot와는 굉장히 궁합이 잘맞는듯하니 스프링부트를 하시는 분들은 한번쯤 써보는 것은 참 좋을듯하다.

 

그럼 이제 실제로 스프링 부트환경에서 구현한번 해보자.

 

일단 스프링부트 프로젝트에서 Thymeleaf를 사용하려면  build.gradle 파일안에

dependencies {
   ...
   implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
   ...
}

Thymeleaf에 대한 의존관계를 설정해줘야한다. 

 

자, 그리고 오늘 간단하게 실습해볼 건

이렇게 Controller 하나랑 html 파일 하나 만들어주면된다.

 

먼저 Controller 부터 보자.

 

아주 간단한 코드다.

 

여기서는 하나만 알고 넘어가자 .model 객체에 속성을 채워서 던져주면 던져주는 뷰 페이지에서 그데이터를 쓸수 있다는 것이다.

 

다음은 html 페이지이다. 여기 보면 

 

Hi!, banker 라는 게 있는데 이건 그냥 브라우저에서 열어보면 나올 문구이다.

 

자 이번에는 서버사이드에서 돌려보자.

 

만들어진 프로젝트를 실행해보면

이번엔 모델로 넘어온 데이터인 Babo가 출력되는걸 볼 수 있따.

 

(참고로 그냥 html은 static 디렉토리에 넣어서 작업해주면된다.)

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

✅ Python ASCII 

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

 

✅ ASCII Chart 


 코드 설명

파이썬의 내장함수가 있다.

 - 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

+ Recent posts