전체 글

I’m currently learning Android, ComputerScience, Algorithm and etc....
자격증

SQLD 개념 정리

1과목제1장. 데이터 모델링의 이해1-1. 데이터 모델링 개요데이터 모델링이란?현실 세계의 데이터를 약속된 표기법으로 표현하는 과정특징 3가지: 추상화(Abstraction), 단순화(Simplification), 명확화(Clarity)데이터 모델링의 3가지 관점데이터 관점: 무엇(What)을 저장할 것인가프로세스 관점: 업무의 흐름(How)상관 관점: 데이터와 프로세스의 관계데이터 모델링의 유의사항유연성: 변화에 대응 가능해야 함유일성: 데이터가 유일하게 식별되어야 함일관성: 데이터 간 상호 일관성 보장데이터 모델링의 3단계단계설명특징개념적 모델링업무 중심의 포괄적 수준 모델링추상화 수준 가장 높음, ERD 생성, 엔터티·관계 위주논리적 모델링특정 데이터베이스 모델에 맞게 구체화정규화 수행, Key·속..

BaekJoon

[BaekJoon] 16974번 레벨 햄버거 (Python) 문제 풀이 [Gold 5]

문제https://www.acmicpc.net/problem/16974 어떻게 풀 것인가?재귀 + 분할 정복 문제입니다.먼저 레벨별 햄버거의 구조를 이해해야 합니다. 레벨-0은 패티(P) 하나이고, 레벨-L은 B + (L-1버거) + P + (L-1버거) + B 구조입니다. 예를 들어 레벨-1은 BPPPB, 레벨-2는 BBPPPBPBPPPBB이 됩니다.각 레벨의 총 크기와 패티 수는 점화식으로 미리 구해둡니다. size[L] = 2 * size[L-1] + 3이고 patty[L] = 2 * patty[L-1] + 1입니다. N이 최대 50이라 크기가 엄청나게 커지므로 직접 문자열을 만들 수는 없고, 재귀로 접근해야 합니다.핵심은 레벨-L 버거를 5개 구간으로 나눠서 X가 어디에 위치하는지 판단하는 것입니..

BaekJoon

[BaekJoon] 2346번 풍선 터뜨리기 (Python) 문제 풀이 [Silver 3]

문제https://www.acmicpc.net/problem/2346 어떻게 풀 것인가?덱(Deque) 자료구조를 활용하는 문제입니다.풍선이 원형으로 배치되어 있고, 터뜨린 풍선의 종이값만큼 이동해야 하므로 덱의 rotate를 활용하면 원형 이동을 간단하게 구현할 수 있습니다.덱에 (풍선 번호, 종이값)을 넣어두고, 매번 popleft()로 현재 풍선을 터뜨립니다. 그 다음 종이값에 따라 회전시키는데, 양수면 오른쪽으로 이동해야 하므로 rotate(-(val-1)), 음수면 왼쪽으로 이동해야 하므로 rotate(-val)을 해줍니다. popleft()로 이미 한 칸 이동한 상태이기 때문에 양수일 때 1을 빼주는 것이 포인트입니다. 코드import sysfrom collections import deque..

BaekJoon

[BaekJoon] 1092번 배 (Python) 문제 풀이 [Gold 5]

문제https://www.acmicpc.net/problem/1092 어떻게 풀 것인가?그리디 + 정렬 문제입니다.핵심 아이디어는 가장 무거운 짐을 가장 능력이 좋은 크레인에 배정하는 것입니다. 매 라운드(1분)마다 각 크레인이 들 수 있는 박스 중 가장 무거운 것을 선택하면 전체 시간을 최소화할 수 있습니다. 크레인은 내림차순, 박스는 오름차순으로 정렬해둡니다. 그러면 각 크레인마다 bisect_right로 자신이 들 수 있는 가장 무거운 박스의 인덱스를 빠르게 찾을 수 있습니다. 해당 박스를 리스트에서 제거하고, 모든 박스가 사라질 때까지 반복하면서 라운드 수를 세면 됩니다.가장 큰 크레인의 무게 제한보다 무거운 박스가 있으면 옮길 수 없으므로 -1을 출력합니다. 코드import sysfrom bis..

Programmers

[Programmers] Lv2. 큰 수 만들기 Python 문제 풀이

문제프로그래머스 - 큰 수 만들기 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 어떻게 풀었는가전형적인 스택 기반 그리디 문제다.핵심 아이디어가장 큰 수를 만들려면, 앞자리에 가능한 한 큰 숫자가 와야 한다. 이를 위해 스택을 사용한다. 새로운 숫자를 넣기 전에 스택의 top이 현재 숫자보다 작다면 pop해서 제거하는 방식이다.구현 흐름숫자를 앞에서부터 하나씩 순회한다.스택의 top이 현재 숫자보다 작고, 아직 제거 횟수(k)가 남아있다면 pop한다. 이 과정을 조건이 만족하는 동안 반복한다.현재 숫자를 스택에 push한다.순회가 끝난 뒤에도 k가 남아있다면(예: "99999"처럼 내림차순인 경우), 뒤에서 k..

Programmers

[Programmers] Lv2. 다리를 지나는 트럭 Python 문제 풀이

문제프로그래머스 - 다리를 지나는 트럭 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 어떻게 풀었는가다리를 고정 길이의 큐로 모델링하는 것이 핵심이다.아이디어다리 위의 상태를 bridge_length 크기의 deque로 표현하고, 초기값을 모두 0으로 채운다. 매 초마다 deque의 앞에서 하나를 빼고(다리를 빠져나감), 뒤에 새 트럭을 넣거나 0을 넣는(빈 칸이 전진) 방식으로 시뮬레이션한다.구현 흐름매 초마다 bridge의 맨 앞 값을 popleft하고, 그 무게만큼 현재 다리 위 총 무게(cur_weight)에서 뺀다.대기 중인 다음 트럭의 무게를 더했을 때 weight 이하라면 트럭을 다리에 올린다. 아..

Programmers

[Programmers] Lv2. 카테고리 별 상품 개수 구하기 MYSQL 문제 풀이

문제https://school.programmers.co.kr/learn/courses/30/lessons/131529 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 어떻게 풀었는가상품코드(PRODUCT_CODE)는 8자리 문자열이고, 앞 2자리가 카테고리 코드를 의미한다. 따라서 LEFT 함수로 앞 2자리만 추출하면 카테고리를 구할 수 있다.추출한 카테고리를 GROUP BY로 묶고 COUNT로 상품 수를 세면 된다. SUBSTRING(PRODUCT_CODE, 1, 2)를 써도 동일한 결과를 얻을 수 있지만, LEFT가 더 간결하다. 코드SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY,..

Programmers

[Programmers] Lv2. 가격대 별 상품 개수 구하기 MYSQL 문제 풀이

문제https://school.programmers.co.kr/learn/courses/30/lessons/131530 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 어떻게 풀었는가핵심은 가격을 만원 단위 구간으로 묶는 것이다. 이를 위해 FLOOR 함수를 활용했다.FLOOR(PRICE / 10000)을 하면 가격을 10000으로 나눈 뒤 소수점을 버리므로, 0~9999원은 0, 10000~19999원은 1, 20000~29999원은 2가 된다. 여기에 다시 10000을 곱하면 각 구간의 최소금액(0, 10000, 20000, …)이 나온다.이렇게 만든 가격대를 GROUP BY로 묶고 COUNT(*)로 상품 수..

Programmers

[Programmers] Lv2. 쿼드압축 후 개수 세기 Python 문제 풀이

문제https://school.programmers.co.kr/learn/courses/30/lessons/68936 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 어떻게 풀었는가쿼드 트리 압축은 전형적인 분할 정복(Divide and Conquer) 문제다.핵심 아이디어영역 안의 모든 값이 같으면 하나로 압축하고, 아니면 4등분해서 각각 다시 확인한다. 이 과정을 재귀적으로 반복하면 된다.구현 흐름현재 영역의 첫 번째 값(arr[x][y])을 기준으로 잡는다.영역 전체를 순회하면서 기준과 다른 값이 하나라도 발견되면, 즉시 4등분하여 재귀 호출한다. 이때 더 이상 탐색을 계속할 필요가 없으므로 바로 retur..

Programmers

[Programmers] Lv2. 우박수열 정적분 Python 문제 풀이

문제https://school.programmers.co.kr/learn/courses/30/lessons/134239 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 어떻게 풀었는가문제를 세 단계로 나눠서 접근했다.1단계: 우박수열 생성콜라츠 추측 규칙대로 초항 k에서 시작해 1이 될 때까지 수열을 만든다. 짝수면 2로 나누고, 홀수면 3을 곱하고 1을 더하면 된다. 예를 들어 k = 5라면 [5, 16, 8, 4, 2, 1]이 된다.2단계: 누적합으로 면적 전처리꺾은선 그래프 아래 면적을 구하는 건 결국 인접한 두 점 사이의 사다리꼴 넓이를 구하는 것과 같다. x 구간의 너비가 항상 1이므로 x = i ~ i..

Programmers

[Programmers] Lv2. 숫자 카드 나누기 Python 문제 풀이

문제https://school.programmers.co.kr/learn/courses/30/lessons/135807?language=python3 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 어떻게 풀 것인가?예시 : arrayA = [14, 35, 119], arrayB = [18, 30, 102] 1단계: "모든 수를 나눌 수 있는 a"는 결국 GCD다.문제 조건: a가 배열의 모든 수를 나눠야 한다 → a는 모든 수의 공약수 공약수 중 가장 큰 것 = GCD이고, GCD의 약수들도 전부 공약수이므로 GCD만 확인하면 충분하다. GCD가 조건을 만족 못하면 그 약수들도 못 만족하기 때문이다. 사실 약수..

Android/Study

[Android] compose-git-grass 오픈소스 라이브러리 개발 및 배포 후기

들어가며GitHub 프로필에 들어가면 보이는 초록색 잔디밭, 개발자라면 한 번쯤 "이 잔디 그래프를 내 앱에도 넣을 수 있으면 좋겠다"고 생각해본 적 있을 것이다. 습관 트래커, 공부 기록, 운동 로그 등 매일의 활동을 기록하는 앱에서 이런 시각화는 강력한 동기 부여가 된다.그런데 막상 Jetpack Compose에서 이걸 구현하려고 찾아보면, 마땅한 라이브러리가 없었다. 있더라도 Material3에 의존하거나, 특정 앱의 모델에 강하게 결합되어 있거나, 커스터마이징이 제한적이었다.그래서 직접 만들었다. compose-git-grass — Map만 넘기면 GitHub 스타일의 잔디 그래프를 그려주는 Jetpack Compose 라이브러리다. 왜 만들었나기존 방법들의 한계GitHub 잔디 그래프를 Comp..

Tenacity_Dev
인성의 개발 공부 노트