[내배캠] 데이터분석 6기/본캠프 기록

[본캠프 28일차] SQL 코드카타, 파이썬 코드카타, 기초 프로젝트 준비⑥

물맨두 2025. 3. 27. 13:47

 

 

오늘 한 일은,

  • SQL 공부
    • [코드카타] SQL 1문제 풀기 (102번)
  • 파이썬 공부
    • [코드카타] 알고리즘 1문제 풀기 (66번)
  • 기초 프로젝트 준비
    • "[본캠프 27일차] 부록"에 분석 시 사용한 코드 내용 추가로 업데이트하기
    • 발표 PPT 기반으로 발표 대본 작성하기

 


 

SQL 공부: [코드카타] SQL 문제 풀기 (102번)

102. (596) Classes More Than 5 Student

Write a solution to find all the classes that have at least five students.
Return the result table in any order.

SELECT s.class
FROM (
    SELECT class,
           COUNT(student) cnt
    FROM Courses
    GROUP BY class
    HAVING cnt >= 5
    ) s

오늘의 문제는 FROM절에 인라인 뷰로 학생 수가 5명 이상인 수업들만 조회하는 테이블을 만들고, 결과 테이블에서 class 컬럼만 조회되도록 작성했다.

 

오늘은 LeetCode에서 다른 사람들이 제출한 쿼리를 살펴봤다.

그런데 인라인 뷰를 쓸 필요가 없었다니. WHERE절 쓰듯이 GROUP BY절+HAVING절로 그냥 조건을 주면 되는 거였다. 

 


 

파이썬 공부: [코드카타] 알고리즘 문제 풀기 (66번)

66. 대충 만든 자판

(문제 설명이 너무 길다)

문제도 어렵다. 단순히 target[0]에는 keymap[0]을 기준으로 누르는 횟수를 세고, target[1]에는 keymap[1]을 사용하는 방식으로 가는 것이 아니라 해당 target 문자열을 작성할 때 최소 횟수인 keymap을 그때그때 바꿔야 하는 상황이 복잡하게 느껴졌다.

# 통과한 전체 코드
def solution(keymap, targets):
    answer = []
    key_dict = {}
    
    for key in keymap:
        for idx, k in enumerate(key):
            if k not in key_dict:
                key_dict[k] = idx+1
            elif k in key_dict:
                key_dict[k] = min(idx+1, key_dict[k])
                
    for target in targets:
        cnt = 0
        for t in target:
            if t not in key_dict.keys():
                answer.append(-1)
                break
            cnt += key_dict[t] 
        else:
            answer.append(cnt)
                
    return answer

 

01.

우선 keymap에 주어진 자판들로 입력할 수 있는 문자와 몇 번 눌러야 그 문자를 입력할 수 있는지를 갖고 있어야겠다는 생각에 for문을 사용해 딕셔너리에 해당 정보들을 저장하도록 했다. 이 정보를 저장한 리스트 key_info는 딕셔너리 컴프리헨션에 대한 문법을 찾아봐서 리스트 컴프리헨션으로 작성했다. (근데 작성하면서 느낀 점인데 벌써 for문을 벌써 두 번 썼...)

key_info = [{k:idx+1 for idx, k in enumerate(key)} for key in keymap]

그런데 key_info를 출력해보니 keymap의 첫 번째 key의 경우는 A에는 A:1이 아니라 A:3가 저장됐다. 즉 key에서 문자가 2번 이상 등장할 경우 최소 횟수를 저장하도록 하는 부분이 추가돼야 함을 발견했다. 근데 문제는 여기에 어떻게 추가해 if문으로 이미 저장한 k라면 그냥 지나가라고 하지...

key_dict = {}
    
for key in keymap:
    for idx, k in enumerate(key):
        if k not in key_dict:
            key_dict[k] = idx+1
        elif k in key_dict:
            key_dict[k] = min(idx+1, key_dict[k])

if문을 어떻게 추가해야 하는지 모르겠어서 그냥 다시 익숙한 문법으로 돌아왔다. 다시 작성하면서 생각해보니 각 키별로 정보를 갖고 있을 필요가 없어서 key_dict에 주어진 keymap으로 입력할 수 있는 문자와 그 문자를 입력하는 데의 최소 횟수 쌍으로 저장했다.

 

02.

이제 만들어놓은 key_dict을 활용해 targets 리스트로 주어진 문자열을 입력하려면 몇 번 자판을 눌러야 하는지를 구해야 한다.

for target in targets:
    cnt = 0
    for t in target:
        if t not in key_dict.keys():
            answer.append(-1)
            break
        cnt += key_dict[t]

    answer.append(cnt)

처음엔 위와 같이 작성해 실행했더니 주어진 keymap으로 targets의 문자를 입력할 수 없는 경우에 -1을 반환해야 하는데, 테스트 2를 보면 -1뿐만 아니라 0도 answer에 담아내면서 틀렸다.

 

for target in targets:
    cnt = 0
    for t in target:
        if t not in key_dict.keys():
            answer.append(-1)
            break
        cnt += key_dict[t] 
    else:
        answer.append(cnt)

이렇게 수정해주면서 코드가 통과됐다.

 


 

팀플: 기초 프로젝트 준비

(출처: 내 티스토리 "[본캠프 27일차] 부록: [chap 2] 기초 프로젝트 준비④" 中)

오늘은 티스토리에도 코드만 정리한 글을 기록해두고 데이터 분석에 사용한 내일 발표할 대본을 작성했다.