티스토리 뷰

SQL 코드카타

Q142. Weather Observation Station 10

1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-10/problem

2. 정답 코드:

SELECT DISTINCT CITY
FROM STATION
WHERE RIGHT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');

 

Q143. Weather Observation Station 11

1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-11/problem

2. 정답 코드:

SELECT DISTINCT CITY
FROM STATION
WHERE (LEFT(CITY, 1) NOT IN ('a','e','i','o','u')) OR (RIGHT(CITY, 1) NOT IN ('a','e','i','o','u'));

 

Q164. Weather Observation Station 19

1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-19/problem

2. 정답 코드:

SELECT ROUND(SQRT(POW(MAX(LAT_N)-MIN(LAT_N), 2)+POW(MAX(LONG_W)-MIN(LONG_W), 2)), 4)
FROM STATION;

-- a = MIN(LAT_N)
-- b = MAX(LAT_N)
-- c = MIN(LONG_W)
-- d = MAX(LONG_W)

 

3. 오류 상황: 문법 오류

4. 시도 방법: 기존에 작성했던 쿼리에서 잘못 작성된 문법 구문이 있는지 확인

5. 최종 문제 해결 방법: 제곱을 표시할 때, SQL에서는 **를 지원하지 않으므로, POW(대상, 2) 이렇게 변경하여 해결

2차원에서의 유클리드 거리 공식
A(x1, y1), B(x2, y2) 일때,
d = sqrt((x2-x1)^2 + (y2-y1)^2)

Python 코드카타 (https://github.com/heeso0908/codekata.git)

Q50. 가장 가까운 같은 글자 ★★★

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/142086

2. 정답 코드:

def solution(s):
    answer = []
    temp = {}
    
    for idx, char in enumerate(s):
        if char not in temp:
            answer.append(-1)
        else:
            answer.append(idx - temp[char])
        
        temp[char] = idx
        
    return answer

3. 오류 상황: 수도 코드 작성부터 막힘

4. 시도 방법: 어떻게 해결해야 하는지 힌트를 얻기 위해 생성형 AI 활용

5. 최종 문제 해결 방법: 아래와 같은 방식으로 해결

temp 라는 딕셔너리에 알파벳: 순서 구조로 넣어서 해당 알파벳이 처음 나왔으면 -1을, 두번 이상 나왔으면 가장 가까운 글자와의 인덱스 차이 값을 answer 리스트에 차례대로 넣어줘야 한다!
이 때, enumerate를 사용해서 s에서 idx와 char를 추출하고 이 값을 활용한다.

if 문을 사용하여 temp에 알파벳이 없다면 -1
있다면 현재 보고자 하는 알파벳의 인덱스 값(idx)에서 이전까지 temp에 저장되어 있던 인덱스 값(temp[char])을 빼준다!
for 문의 마지막에 temp[char] = idx 를 해주어 인덱스 값을 갱신해주는게 포인트!

1) 딕셔너리의 구조 (메모장 양식)

딕셔너리는 이름표(Key) : 실제 내용(Value)의 짝꿍

  • 이름표 (Key): char (예: 'a', 'b') → 우리가 찾고 싶은 글자
  • 실제 내용 (Value): idx (예: 0, 1) → 그 글자가 마지막으로 발견된 방 번호(인덱스)

2) 코드 흐름 다시 보기

한 줄씩 해석해 보자!

for idx, char in enumerate(s): # idx는 방 번호, char는 그 방에 사는 글자
    if char not in temp:       # 메모장(temp)에 이 글자(char) 이름표가 없으면?
        answer.append(-1)      # 처음 본 애니까 -1 기록
    else:                      # 메모장에 이미 이 글자(char) 이름표가 있으면?
        # (현재 방 번호 idx) - (메모장에 적힌 예전 방 번호 temp[char])
        answer.append(idx - temp[char])
    
    # [중요] 방금 본 글자의 위치(idx)를 메모장의 이름표(char) 칸에 최신화!
    temp[char] = idx

 

3) "banana"로 보는 실전 예시

  • 1단계 (idx=0, char='b'):
    • 메모장에 'b'가 없네? → -1 추가.
    • 메모장에 적기: temp['b'] = 0 (이제 'b'는 0번방에 있다고 기억해!)
  • 2단계 (idx=1, char='a'):
    • 메모장에 'a'가 없네? → -1 추가.
    • 메모장에 적기: temp['a'] = 1
  • 3단계 (idx=2, char='n'):
    • 메모장에 'n'가 없네? → -1 추가.
    • 메모장에 적기: temp['n'] = 2
  • 4단계 (idx=3, char='a'):
    • 메모장에 'a'가 있네! (1번방에 있었다고 적혀 있음)
    • 거리 계산: 현재(3) - 과거(1) = 2 → 2 추가.
    • 메모장 갱신: temp['a'] = 3 (이제 'a'는 3번방에 있는 게 가장 최신이야!)

💡 요점 정리

  • char: 딕셔너리에서 데이터를 찾아낼 때 쓰는 열쇠(Key)
  • idx: 딕셔너리에 저장해두는 데이터 값(Value)
  • temp[char]: "글자(char) 칸에 적힌 번호(idx)를 가져와!"라는 뜻

 

+ 딕셔너리와 enumerate 사용 시 참고!

1) 흐름을 시각적으로 비교해 보자

enumerate가 주는 바구니와 우리가 만든 딕셔너리 메모장을 비교해 보자.

단계 enumerate가 던져주는 순서 딕셔너리에 저장하는 방식
순서 (번호, 글자) {글자 : 번호}
이유 파이썬이 정한 표준 규칙 글자로 번호를 찾고 싶어서 우리가 바꿈
코드 idx, char temp[char] = idx

 

 

2) 왜 반대로 뒤집어서 저장했을까?

우리의 목적 때문에!

  • 만약 딕셔너리를 temp[idx] = char (번호: 글자) 순서로 저장했다면?
    • 나중에 "방금 나온 'a'가 예전에 몇 번 방에 있었지?"라고 물어보고 싶을 때, 열쇠가 '번호'라 'a'라는 글자로는 사물함을 열 수가 없다.
  • 그래서 일부러 temp[char] = idx (글자: 번호) 순서로 뒤집어 저장한 것!
    • 이렇게 해야 나중에 글자('a')를 열쇠로 써서 그 안에 적힌 번호(1)를 쓱 꺼낼 수 있으니까!

3) 일상생활 비유 (출석부 vs 이름표)

  • enumerate (출석부 순서): 선생님이 "1번 홍길동! 2번 김철수!" 하고 부르는 순서 (번호 → 이름)
  • temp 딕셔너리 (전화번호부): 우리가 나중에 '홍길동'을 찾아서 전화를 걸어야 하니까, 수첩에는 '홍길동 : 010-...' 순서로 적어두는 것과 같다. (이름 → 정보)

💡 정리하자면

enumerate는 우리에게 재료를 (번호, 글자) 순서로 배달해주지만, 우리는 그 재료를 요리해서 딕셔너리라는 냉장고에 {글자: 번호}라는 우리만의 방식으로 차곡차곡 쌓아두는 것이다. 그래야 나중에 '글자'만 가지고 '번호'를 꺼내 쓰기 편하니까!


라이브 세션) 머신러닝 실습 1일차: 

1) 선형 vs 비선형

선형일 때 H(x) = wx + b  사용

비선형은 다른 것


2) Paramertic Models vs Non-parametric Models

3) 실습

의학 데이터나 제조업 데이터 같은 경우 이상치(비정상, 불합격) 데이터가 많지 않기 때문에 stratify=y 로 설정해주는 것이 좋다


4) 밸리데이션을 한번만 하는건 아쉽다 → cross-validation 을 하는 이유! K-Fold

GridSearchCV 가 알아서 크로스-밸리데이션 해준다!


5) train 데이터로만 정보 얻기(ex. 중앙값, 최빈값) → test 데이터로 계산하는 순간 데이터 누수


6) 왜 매번 최적의 하이퍼파라미터를 찾아줘야 할까? 하나만 딱 정하면 안될까?

모든 머신러닝 모델은 Data dependent(데이터 의존적)

→ 단점: 데이터가 편향되어 있으면, 데이터한테 속을 수도 있다

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함