분류 전체보기 69

[코딩 테스트, 더 이상 미룰 수 없다] 코테 오답노트(1)

1. DFS/BFS 문제: 거리두기 확인하기실수 1. 함수 호출 인자 개수 불일치잘못 쓴 코드:dfs((i, j, place, 1))함수 정의:def dfs(x, y, place, depth):dfs는 인자 4개를 받는데, 튜플 1개를 넘긴 형태였다.수정:dfs(i, j, place, 1)또는 더 깔끔하게는 depth를 0부터 시작한다.dfs(i, j, place, 0)실수 2. 재귀 결과를 부모 함수에서 받지 않음잘못 쓴 코드:dfs(nx, ny, place, depth + 1)이렇게 하면 안쪽 DFS에서 False를 반환해도 바깥 DFS가 그 값을 모른다.수정:if dfs(nx, ny, place, depth + 1) == False: return FalseDFS에서 위반을 발견했으면 그 결과를..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스 lv4 저자 카테고리별 매출 집계하기 - GROUP BY는 '묶는 기준'을 만든다.

오늘은 group by 데이, 기본적인건 괜찮았지만 groupy by 에 두 기준을 넣어야 하면 조금 헷갈렸었다. 이 문제는 시험 전 groupby 문제를 대비하기 위한 문제이다.문제는저자별, 카테고리별 매출 합계를 구하라.였다.처음에는 단순히 저자별로 묶으면 되는 줄 알았다.GROUP BY AUTHOR_ID그런데 결과가 원하는 형태가 나오지 않았다.왜일까?GROUP BY 이전의 데이터JOIN과 WHERE가 끝나면 데이터는 이런 형태가 된다.저자카테고리가격판매량매출김작가소설10000550000김작가소설10000330000김작가경제20000240000이작가소설15000460000여기서 GROUP BY가 어떤 역할을 하는지를 이해하는 것이 핵심이었다.GROUP BY 하나GROUP BY AUTHOR_ID이 뜻..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스lv3 베스트앨범 - 시험 전 복습용: Dictionary + Lambda 정렬 활용 문제

이 문제는 해시(Dictionary)와 정렬(lambda) 을 함께 사용하는 대표 문제다. 그리고 내가 자주하는 실수를 모아놨다.장르별 총 재생 수를 구하고장르별 노래 목록을 따로 저장한 뒤장르는 총 재생 수 기준으로 정렬하고각 장르 안에서는 노래를 재생 수 기준으로 정렬해야 한다.즉, Dictionary로 그룹화하고, lambda로 정렬 기준을 설계하는 문제다.문제를 보고 떠올려야 하는 패턴장르별로 묶어야 한다↓Dictionary / defaultdict장르별 총합이 필요하다↓defaultdict(int)장르 안의 노래 목록이 필요하다↓defaultdict(list)정렬 기준이 여러 개다↓sorted() + lambda필요한 자료구조1. 장르별 총 재생 수stream_genre = defaultdict..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스 Lv1 실패율 - Python의 매력, Dictionary와 정렬의 자유도

이번 문제는 구현 자체보다 Python의 Dictionary와 정렬(sorted)을 함께 사용하는 방법을 익히는 문제였다.처음에는 각 스테이지의 인원을stages.count(stage)로 하나씩 세면서 실패율을 계산했다.total = len(stages)for stage in range(1, N + 1): count = stages.count(stage) fail_dict[stage] = count / total total -= count전체 인원에서 현재 스테이지 인원을 빼면서 다음 스테이지의 도전자 수를 계산하는 흐름은 자연스럽게 떠올릴 수 있었다.다만 count()는 호출할 때마다 리스트를 처음부터 끝까지 탐색하기 때문에 비효율적이라는 점을 알게 되었다.이 문제는 "각 숫자가 몇 번..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스 lv1 키패드 누르기 - B/DFS와 좌표 계산 분리해서 유형좁히기

나는 보통 문제에 좌표가 언급된다면 BFS나 구현을 우선적으로 떠올린다. 처음 떠올린 풀이처음에는BFS↓거리 계산↓더 가까운 손 선택이라고 생각했다.하지만 BFS가 필요한 조건이 하나도 없었다.BFS는 언제 사용할까?BFS는 보통미로그래프최단 거리장애물이 있는 이동처럼 탐색을 통해 길을 찾아야 하는 문제에서 사용한다.예를 들어출발↓이동 가능한 칸 탐색↓최단 거리 계산이런 구조라면 BFS를 떠올리는 것이 맞다.그런데 키패드는?키패드는 이미 위치가 모두 정해져 있다.1 2 34 5 67 8 9* 0 #즉,길을 찾을 필요도 없고장애물도 없으며탐색도 필요 없다.필요한 것은 각 숫자의 좌표뿐이었다.좌표로 바꾸기그래서 먼저 각 숫자의 좌표를 Dictionary로 저장했다.position = { 1:(0,0),..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스lv1.신규 아이디 추천 -Python 문자열 정복하기

python문자열 다루기를 정리 할 수 있는 문제이다. 시험 보기 전에 한 번 보고 가면 더 좋을 문제다. 2. lower()모든 문자를 소문자로 변환s = "AbC"s = s.lower()print(s)abc반대로 대문자는s.upper()3. isalnum()문자가영어숫자인지 확인한다."a".isalnum()True"1".isalnum()True"!".isalnum()False이번 문제에서는if ch.isalnum() or ch in "-_.":처럼 허용 문자만 남길 때 사용했다.4. isalpha()영어인지 확인"a".isalpha()True"3".isalpha()False5. isdigit()숫자인지 확인"3".isdigit()True"a".isdigit()False6. replace()문자열 치..

[코딩 테스트, 더 이상 미룰 수 없다] SQL[1]

2. 평균은 AVG()를 사용한다.평균은 직접 계산할 수도 있다.SUM(...) / COUNT(...)하지만 SQL에는 평균을 계산하는 함수가 이미 존재한다.AVG(...)가독성도 좋고 실수도 줄일 수 있다. SQL 실행 순서FROM→ WHERE→ GROUP BY→ HAVING→ SELECT→ ORDER BY따라서일반 행 조건 → WHERE집계 결과 조건 → HAVING으로 구분한다.HAVING AVG(...) >= 7 3. 날짜 차이는 DATEDIFF()DATE_FORMAT()은 날짜를 문자열 형태로 출력하는 함수이다.DATE_FORMAT(CREATED_DATE,'%Y-%m-%d')날짜 계산을 하는 함수가 아니다.날짜 차이를 계산할 때는DATEDIFF(END_DATE, START_DATE)를 사용한다..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스lv1 - 달리기 경주(Python으로 양방향 매핑 문제)

이번 달리기 경주 문제를 풀면서 가장 크게 배운 것은 양방향 매핑(Bidirectional Mapping) 이라는 구현 패턴이다.처음에는 선수의 이름과 순위를 Dictionary 하나로만 관리하려고 했다.rate[player] = index이렇게 하면kai -> 3처럼 이름 → 순위는 바로 찾을 수 있다.하지만 추월이 발생하면 문제가 생긴다.예를 들어0 mumu1 soe2 poe3 kai에서 kai가 추월하면먼저 kai의 순위는 쉽게 찾을 수 있다.rank = rate["kai"]하지만 그 앞에 있는 사람이 누구인지는 어떻게 찾을까?Dictionary만으로는3 → kai와 같은 순위 → 이름을 찾을 수 없다.결국 앞 사람을 찾기 위해 리스트를 다시 탐색해야 하고, 시간도 오래 걸린다.양방향 매핑이 문제에..

[코딩 테스트, 더 이상 미룰 수 없다] 프로그래머스 Lv1 - 신고 결과 받기

Python 자료구조를 어떻게 활용하면 코드를 더 간결하게 만들 수 있는지를 배우는 문제였다.1. 중복 제거는 set()처음에는 신고 내역을 그대로 순회했지만, 같은 사람이 같은 사람을 여러 번 신고할 수 있다는 조건이 있었다.이 조건은 직접 중복을 검사하기보다 처음부터for pair in set(report):처럼 set()으로 변환해 중복을 제거하는 것이 훨씬 간단했다.앞으로도 중복 제거가 필요한 입력이라면 가장 먼저 set()을 떠올리는 습관을 가져가려고 한다.2. defaultdict(list)기존에는 Dictionary에 값을 넣기 전에if key not in dict: dict[key] = []처럼 리스트를 먼저 생성해야 했다.이번에는from collections import defaul..

[코테대비] 프로그래머스 Lv1 - 개인정보 수집 유효기간 (첫 풀이)

이번 문제는 날짜를 어떻게 다룰 것인지가 핵심이었다.처음에는 날짜를 문자열로 비교하려고 했고, 이후에는 연도, 월, 일을 각각 나누어 비교하는 방식으로 접근했다.처음 접근먼저 약관 정보를 Dictionary로 변환했다.term_dict = {}for term in terms: kind, month = term.split() term_dict[kind] = int(month)이렇게 만들어두면term_dict["A"]처럼 바로 유효기간을 가져올 수 있다.개인정보 하나씩 처리개인정보는2021.05.02 A형태이므로 먼저 날짜와 약관을 분리했다.date, term = privacie.split()그리고 날짜를 다시 연, 월, 일로 나누었다.year, month, day = date.split(".")..