개인공부/알고리즘 34

[ 탐색 ] 백준 1261번 알고스팟, 다익스트라

문제 링크 1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미 www.acmicpc.net 💡문제 분석 요약 탐색 알고리즘 문제로 최소 개수를 구해야 하는 문제였기 때문에, BFS를 활용하여 문제를 풀이했다. 문제에서 조건을 제한하고 있기 때문에 조건을 따라 문제를 풀이하면 된다. 이동할 수 있는 방 == 이동할 수 있는 방향 미로 밖으로 이동할 수 없음 1 = N: # 범위를 벗어나면 아래의 코드를 실행하지 않는다. continue if dist[nx][ny] == -1: # 아직 해당 방을 방문하지 않았다면 # 만약..

[ 탐색 ] 백준 13549 숨박꼭질 3

문제 링크 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net 💡문제 분석 요약 탐색 알고리즘 중 하나인 BFS를 활용하여 문제를 풀이하면 쉽다. DFS를 떠올릴 수 있으나, 이 문제에서 DFS은 적절한 방법이 될 수 없다. 효율성이 떨어지기 때문이다. - 최단 경로 찾기의 비효율성: 현재의 문제는 가장 빠른 시간을 찾아야한다. 하지만 DFS는 깊이 우선 탐색의 특성으로, 최적이 아닌 경로를 더 오랫동안 탐색하게 될 수 있어 적합하지 않다. 💡알고리즘 설계 BFS 알고리즘을 만..

[ 수학 ] 백준 2609 최대공약수와 최소공배수, Kotlin, 유클리드 알고리즘

문제 링크 2609번: 최대공약수와 최소공배수 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다. www.acmicpc.net 💡문제 분석 요약 두 자연수의 최대 공약수(GCD)와 최소 공배수(LCM)을 구해야한다. 최대 공약수는 두수를 나머지 없이 나누는 가장 큰수를 의미한다. 최소 공배수는 두 수로 균등하게 나누어지는 가장 작은 수를 의미한다. 💡알고리즘 설계 GCD: a와 b의 GCD를 찾기위해 *유클리드 알고리즘을 사용한다. LCM: GCD를 찾으면, 공식(LCM = (a * b) / a와 b의 GCD)을 활용하여 계산한다. 💡코드 import java.util.* fun gcd(a: Int, b: Int): Int { return i..

[ 수학 ] 백준 17427 약수의 합 2 kotlin

문제 링크 17427번: 약수의 합 2 두 자연수 A와 B가 있을 때, A = BC를 만족하는 자연수 C를 A의 약수라고 한다. 예를 들어, 2의 약수는 1, 2가 있고, 24의 약수는 1, 2, 3, 4, 6, 8, 12, 24가 있다. 자연수 A의 약수의 합은 A의 모든 약수를 더 www.acmicpc.net 💡문제 분석 요약 자연수 A의 약수의 합은 f(A)이다. x보다 작거나 같은 모든 자연수 y의 f(y)값을 더한 값은 g(x)이다. 자연수 N이 주어졌을 때, g(N)을 구해야한다. 1부터 N까지 각 숫자에 대하여 그 숫자의 모든 약수들의 합을 구해야 한다. n 의 상한(0 < n

[ DP ] 백준 15988번 1, 2, 3 더하기 3, Kotlin

문제 링크 15988번: 1, 2, 3 더하기 3 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 💡문제 분석 요약 n 이 1, 2, 3의 합으로 표현될 수 있는 방법의 수를 찾는 것이다. 문제 n 을 구성하려면 명시적으로 두 개 이상의 숫자가 필요하다. n 의 상한(0 < n 3에 대하여 dp[i] = dp[i-1] + dp[i-2] + dp[i-3]가 된다. (dp[1] = 1, dp[2] = 2, dp[3] = 4.) 💡코드 const val MOD = 1_000_000_009 fun main() { val T = readLine()!!.toInt() val dp = LongArray(1_000..

[ 그리디 ] 백준 1783 병든 나이트

백준 알고리즘 문제 원본 1783번: 병든 나이트첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다.www.acmicpc.net 방문할 수 있는 칸의 최대 개수를 구하는 문제는 조건에 따라 다양한 접근 방식이 필요하다. 이번 문제해결의 핵심은 체스판의 크기와 나이트의 이동 규칙을 분석하는 것이었다.문제 이해 병든 나이트는 4가지 방법으로만 이동할 수 있다.2칸 위로, 1칸 오른쪽1칸 위로, 2칸 오른쪽1칸 아래로, 2칸 오른쪽2칸 아래로, 1칸 오른쪽이동 횟수가 4번 이상일 경우, 4가지 이동 방법을 모두 사용해야 한다. 이러한 제약 아래에서 나이트가 체스판에서 방문할 수 있는 최대 칸 수를 찾아야 한다.해결 전략문제 해결을 위해 ..

프로그래머스 - 그룹별 조건에 맞는 식당 목록 출력하기 (SQL)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나는 문제 풀이의 핵심은 범위를 제한하는 것이라고 생각했다. 가장 많은 리뷰를 작성한 유저 를 핵심으로 보고 쿼리를 작성했다. SELECT mp.MEMBER_NAME, rr.REVIEW_TEXT, DATE_FORMAT(rr.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE FROM ( SELECT MEMBER_ID FROM REST_REVIEW GROUP BY MEMBER_ID ORDER BY COUNT(*) DESC LIMIT 1 ) most_reviewed_member JOIN RES..

프로그래머스 - 입양 시각 구하기(2) SQL

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나는 이 문제는 입양시간이 존재하지 않을 경우, 0으로 집계하는 것이 핵심이 될 것이라고 생각했다. 그러나 아직 부족한 실력때문에 혼자서 해결하지 못하고, GPT의 도움을 받았다. WITH RECURSIVE AllHours AS ( SELECT 0 AS HOUR UNION ALL SELECT HOUR + 1 AS HOUR FROM AllHours WHERE HOUR < 23 ) SELECT AllHours.HOUR, COUNT(ANIMAL_OUTS.DATETIME) AS COUNT FROM AllHours L..

프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수 구하기

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나는 이번 문제의 해결을 위해서는 어떻게 구매한 회원수를 집계를 할 것인가가 핵심이라고 생각했다. 그리고 실제로 나는 해당 부분에서 어려움을 겪었다. // 내가 작성한 쿼리 SELECT DATE_FORMAT(OS.SALES_DATE, '%Y') AS YEAR ,DATE_FORMAT(OS.SALES_DATE, '%m') AS MONTH ,UI.GENDER ,COUNT(UI.USER_ID) AS USERS // 문제가 된 부분 FROM ONLINE_SALE AS OS INNER JOIN USER_INFO AS U..

프로그래머스 - 직사각형 넓이 구하기 (Kotlin)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 단순히 가로길이와 세로길이만 구한다면 쉽게 풀이할 수 있었다. 그리고 각 길이는 주어진 꼭짓점을 활용하여 구할 수 있었다. class Solution { fun solution(dots: Array): Int { val x1 = dots[0][0] val y1 = dots[0][1] val x2 = dots[1][0] val y2 = dots[1][1] val x3 = dots[2][0] val y3 = dots[2][1] val xLength = maxOf(Math.abs(x2 - x1), Mat..