오늘 한 일은,
- 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)
이렇게 수정해주면서 코드가 통과됐다.
팀플: 기초 프로젝트 준비
오늘은 티스토리에도 코드만 정리한 글을 기록해두고 데이터 분석에 사용한 내일 발표할 대본을 작성했다.
'[내배캠] 데이터분석 6기 > 본캠프 기록' 카테고리의 다른 글
[본캠프 30일차] chap 3의 시작, SQL 공부, 파이썬 공부 (0) | 2025.03.31 |
---|---|
[본캠프 29일차] 기초 프로젝트 발표 (0) | 2025.03.28 |
[본캠프 27일차] SQL 코드카타, 파이썬 코드카타, 기초 프로젝트 준비⑤ (0) | 2025.03.26 |
[본캠프 26일차] 기초 프로젝트 준비➃, SQL 코드카타, 파이썬 코드카타 (0) | 2025.03.25 |
[본캠프 25일차] SQL 코드카타, 파이썬 코드카타, 기초 프로젝트 준비③ (0) | 2025.03.24 |