반응형

전체 글 181

[BOJ 2659] 십자카드 문제

문제십자카드 문제https://www.acmicpc.net/problem/2659  풀이설명입력된 카드의 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 구하는 문제입니다. 1111부터 시작해서 해당 카드의 시계수까지 카운트를 증가시키며 계산합니다. 예시 코드function solution() { const target = input().split(" ").join(""); const targetClockNum = getClockNum(target); let cnt = 0; for (let i = 1111; i

Coding Problem 2025.03.20

[BOJ 2578] 빙고

문제빙고https://www.acmicpc.net/problem/2578  풀이설명사회자가 몇 번째 수를 부른 후에 빙고를 외치게 되는지를 구하는 문제입니다. 일반적인 빙고 규칙을 가집니다.빙고 카운트가 3개가 되어야 "빙고"를 외칠 수 있습니다. 숫자가 불릴 때마다 전체 빙고 개수를 확인하는 대신, 다음과 같은 방법을 사용했습니다.각 숫자의 빙고판 상 위치를 저장합니다.각 행, 열, 대각선별로 채워진 칸 수를 추적합니다.불린 숫자의 위치에 해당하는 행, 열, 대각선만 업데이트합니다. 예시 코드function solution() { const TARGET_BINGO_COUNT = 3; const n = 5; const board = Array.from({ length: n }, () => input..

Coding Problem 2025.03.19

[BOJ 1937] 욕심쟁이 판다

문제욕심쟁이 판다https://www.acmicpc.net/problem/1937  풀이설명판다가 이동할 수 있는 칸의 수의 최댓값을 구하는 문제입니다. 규칙은 다음과  같습니다.판다의 초기 위치는 어떤 칸이든 될 수 있습니다.상, 하, 좌, 우로 인접한 칸 중 하나로 이동합니다.새로 이동하는 칸은 이전 칸보다 대나무가 많아야 합니다. 그래프 탐색과 DP를 이용해 해결할 수 있습니다. dp[x][y]는 (x, y)에서 시작했을 때, 이동할 수 있는 칸의 수의 최댓값입니다. 다음 칸의 위치를 (nx, ny)라고 할 때, 점화식은 다음과 같습니다.dp[x][y]는 다음 두 값 중 최댓값입니다.dp[x][y]dp[nx][ny] + 1 모든 칸에서 그래프 탐색을 진행하고, 각 칸에 대한 dp 값을 업데이트합니다..

Coding Problem/DP 2025.03.18

[BOJ 2548] 대표 자연수

문제대표 자연수https://www.acmicpc.net/problem/2548  풀이설명대표 자연수를 구하는 문제입니다. 두 개 이상일 경우 그 중 제일 작은 것을 출력합니다. 대표 자연수는 다음과 같은 성질을 가집니다.“대표 자연수는 주어진 모든 자연수들에 대하여 그 차이를 계산하여 그 차이들 전체의 합을 최소로 하는 자연수이다.” 이 성질은 중간값을 나타냅니다. 따라서 정렬을 한 후, 중간 인덱스의 값을 반환하면 됩니다. 예시 코드function solution() { const N = Number(input()); const nums = input() .split(" ") .map(Number) .sort((a, b) => a - b); const idx = Math.ceil..

Coding Problem 2025.03.17

[BOJ 10610] 30

문제30https://www.acmicpc.net/problem/10610  풀이설명주어진 수로 30의 배수를 만들 수 있다면 그 중 가장 큰 수를 구하는 문제입니다. 30의 배수가 되기 위해서는 10과 3으로 나눌 수 있어야 합니다.따라서 다음 두 조건을 만족해야 합니다.10으로 나눌 수 있으려면, 0을 하나 이상 포함해야 합니다.3으로 나눌 수 있으려면, 각 자릿수의 합이 3의 배수여야 합니다.두 조건을 모두 만족한다면, 내림차순으로 정렬한 후 반환하면 됩니다. 예시 코드function solution() { const number = input().split("").map(Number); const sum = number.reduce((a, b) => a + b, 0); if (!number...

Coding Problem 2025.03.16

[BOJ 3151] 합이 0

문제합이 0https://www.acmicpc.net/problem/3151  풀이설명조건에 맞춰 고를 수 있는 팀의 수를 구하는 문제입니다. 조건은 다음과 같습니다.한 팀은 세 명으로 이루어집니다.팀원들의 점수의 합이 0이 되어야 합니다. 이 문제는 투 포인터 알고리즘을 이용해 해결할 수 있습니다. 과정은 다음과 같습니다.학생들을 실력 순으로 정렬합니다.첫 번째 학생(i)을 고정합니다.두 번째 학생 left(i+1)과 세 번째 학생 right(N-1)을 지정합니다.세 학생의 코딩 실력 합을 계산 후, 합에 따라서 포인터를 이동하고, 결과를 처리합니다. 시간복잡도는 O(n^2)이 됩니다. 예시 코드function solution() { const TARGET = 0; const n = Number(i..

Coding Problem 2025.03.15

[BOJ 2251] 물통

문제물통https://www.acmicpc.net/problem/2251  풀이설명규칙에 따라 물을 옮겼을 때, C에 담겨있을 수 있는 물의 양을 모두 구하는 문제입니다. 규칙은 다음과 같습니다.처음에 앞의 두 물통(A, B)은 비어있고, 세 번째 물통(C)은 가득 차 있습니다.어떤 물통에 들어있는 물을 다른 물통에 부을 수 있습니다.이때, 한 물통이 비거나, 다른 한 물통이 가득찰 때까지 물을 부을 수 있습니다.첫 번째 물통이 비어 있을 때, 세 번째 물통에 담겨있을 수 있는 물의 양을 구합니다. 모든 경우의 수를 체크하면 되므로, 그래프 탐색을 통해 해결할 수 있습니다. 예시 코드function solution() { const [A, B, C] = input().split(" ").map(Numb..

Coding Problem 2025.03.14

[BOJ 1300] K번째 수

문제K번째 수https://www.acmicpc.net/problem/1300  풀이설명A를 일차원 배열 B에 넣고 오름차순 정렬했을 때, B[k]를 구하는 문제입니다. A[i][j] = i * j 입니다. (i, j >= 1) 직접 배열을 만들고 정렬을 하게 되면 메모리와 시간 측면에서 문제가 생깁니다.이 문제의 경우, 이분탐색을 이용해 해결할 수 있습니다. 핵심은 다음과 같습니다.x보다 작거나 같은 수의 개수가 k개라면, k번째 수는 x입니다. 각 행을 순회하면서 어떤 수 x보다 작거나 같은 수의 개수를 전부 더한 후, 그 값이 k라면 반환합니다. 예시 코드function solution() { const n = Number(input()); const k = Number(input()); le..

Coding Problem 2025.03.13

[BOJ 1339] 단어 수학

문제단어 수학https://www.acmicpc.net/problem/1339  풀이설명변환이 끝났을 때, 단어의 합의 최댓값을 구하는 문제입니다. 규칙은 다음과 같습니다.각 알파벳 대문자를 0부터 9까지의 숫자 중 하나로 바꿉니다.같은 알파벳은 같은 숫자로 바꿔야 합니다.두 개 이상의 알파벳이 같은 숫자로 바뀌어지면 안 됩니다. 방법은 다음과 같습니다.각 문자별로 자릿수 가중치를 구합니다.가장 가중치가 큰 문자부터 큰 숫자를 배정합니다. 예시 코드function solution() { const n = Number(input()); const words = Array.from({ length: n }, () => input()); const alphabetMap = new Map(); for (..

[BOJ 17086] 아기 상어 2

문제아기 상어 2https://www.acmicpc.net/problem/17086  풀이설명안전 거리의 최댓값을 구하는 문제입니다. BFS를 이용해 해결할 수 있습니다. 각 빈 칸에서 bfs를 실행해 가장 가까운 상어까지의 거리를 구합니다.이렇게 구한 값 중 최댓값을 반환하면 됩니다. 예시 코드function solution() { const [n, m] = input().split(" ").map(Number); const board = Array.from({ length: n }, () => input().split(" ").map(Number)); const dx = [0, -1, -1, -1, 0, 1, 1, 1]; const dy = [1, 1, 0, -1, -1, -1, 0, 1]; ..

Coding Problem 2025.03.11