본문 바로가기
TIL

본 캠프 11일차 TIL

by Data 학습자 2024. 7. 4.

TIL: Python 학습 내용 https://datalearn.tistory.com/51

오늘 풀어본 문제:

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 주어진 문자열 s가 숫자의 일부 자릿수를 영단어로 바꾼 것이므로, 이를 원래 숫자로 변환하는 함수 solution을 작성하는 문제입니다.

 

문제 예시:

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

제한사항:

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

문제 풀이 순서:

  1. 영단어와 숫자를 매핑하는 딕셔너리를 생성합니다.
  2. 문자열 s에서 영단어를 숫자로 변환합니다.
  3. 최종 변환된 문자열을 정수로 반환합니다.

구체적 구현:

def solution(s):
    num_dict = {
        'zero'  : '0',
        'one'   : '1',
        'two'   : '2',
        'three' : '3',
        'four'  : '4',
        'five'  : '5',
        'six'   : '6',
        'seven' : '7',
        'eight' : '8',
        'nine'  : '9'
    }
    quiz = s
    
    for word, num in num_dict.items():
        quiz = quiz.replace(word, num)
        
    answer = int(quiz)
    return answer
 

상세 설명:

  1. 초기 설정:
    • 숫자와 영단어를 매핑하는 딕셔너리 num_dict를 생성합니다.
    • quiz 변수에 입력 문자열 s를 할당합니다.
  2. 문자 변환:
    • num_dict의 각 항목을 순회하며, 영단어를 대응되는 숫자로 변환합니다.
    • quiz.replace(word, num)를 통해 영단어를 숫자로 변환합니다.
  3. 결과 반환:
    • 최종 변환된 문자열 quiz를 정수로 변환하여 answer에 저장합니다.
    • 변환된 정수 answer를 반환합니다.

오늘 배운 점:

  • 딕셔너리에 대해 이론만 공부를 해오다 처음으로 실습하여 풀어보았습니다.
  • replace() 메서드를 통해 복잡할 수 있는 문자열 변환 작업을 간단하게 풀어내었습니다.

TIL: SQL 학습 내용 https://datalearn.tistory.com/52

오늘 풀어본 문제:

다음은 어느 자동차 대여 회사에서 대여 중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블과 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성하는 문제입니다. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해야 합니다.

 

문제 예시:

  • CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 '세단' 종류의 자동차 중 10월에 대여를 시작한 자동차 ID 리스트를 출력해야 합니다.
  • 결과는 자동차 ID를 기준으로 내림차순 정렬합니다.

구체적 구현:

SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR C
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H 
ON C.CAR_ID = H.CAR_ID
WHERE C.CAR_TYPE = '세단' 
  AND DATE_FORMAT(H.START_DATE, '%m') = '10'
ORDER BY C.CAR_ID DESC;
 

상세 설명:

  1. 테이블 조인:
    • CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블을 CAR_ID를 기준으로 INNER JOIN합니다.
  2. 조건 설정:
    • CAR_TYPE이 '세단'인 자동차만 선택합니다.
    • START_DATE의 월 부분이 10월인 대여 기록만 선택합니다 (DATE_FORMAT(H.START_DATE, '%m') = '10').
  3. 중복 제거 및 정렬:
    • SELECT DISTINCT를 사용하여 중복된 CAR_ID를 제거합니다.
    • ORDER BY C.CAR_ID DESC를 통해 CAR_ID를 기준으로 내림차순 정렬합니다.
  • 번외) 
SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR C inner join CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
WHERE CAR_TYPE = '세단' AND DATE_FORMAT(START_DATE,'%m') <= 10 AND DATE_FORMAT(END_DATE,'%m') >= 10
ORDER BY CAR_ID DESC
    • 구현 중 실수 했던 사례) 문제 지문을 잘못 해석하여 렌트를 한 날 중 10월을 "포함" 하고 있는 차의 ID를 찾으려고 하였음
    • 10월에 렌탈을 진행한 차량의 ID를 구한 이유가 무엇일 지 생각해 보았고 10월에 렌탈한 고객을 대상으로 특정한 이벤트를 진행하기 위해서 자료 조사를 실행한 것 같다는 생각이 들었다.

 

오늘 배운 점:

  • 문제 지문을 잘 읽고 해석을 해야한다.

 

'TIL' 카테고리의 다른 글

본 캠프 13일차 TIL  (0) 2024.07.08
본 캠프 12일차 TIL  (0) 2024.07.05
본 캠프 10일차 TIL  (0) 2024.07.03
본 캠프 9일차 TIL  (0) 2024.07.02
본 캠프 8일차 TIL  (0) 2024.07.01