프로그래머스 LV2 22

PCCP 기출문제 : 2번 / 퍼즐 게임 챌린지 [자바]

🧫 문제 분석✔️ 출처[PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 level 2📖 문제 이진 탐색 문제다. 그런데 이진탐색을 했더니 시간초과나서 다른 방법을 찾아서 삽질을 하고 식을 제대로 세우고 이진탐색으로 풀었다. 문제에서 주어진 조건을 식으로 풀어보면 아래와 같다. limit >= (diff[i] - level) * (time_cur[i] + time_prev[i]) + time_cur[i] 이를 만족하는 level 최솟값을 찾으면 된다.  좀만 더 간단히하면문제에서 diff - level 번 만큼 이전 문제를 다시 풀고(time_prev) + 현재 문제를 다시 풀어야한다(time_cur) diff-level 번 틀린 후 다시 풀면 time_cur만큼 시간을 사용한다.  즉, limit - ..

programmers/Lv 2 2025.02.15

조이스틱 [자바]

🧫 문제 분석✔️ 출처조이스틱 level 2📖 문제 탐욕법인데 정말 어려웠다.   먼저 알파벳 변경은 매우 쉽다. 주어진 알파벳 - 'A' (앞으로 가는 경우) 와  'Z'  - 주어진 알파벳 + 1 (뒤로 가는 경우)최솟값을 answer에 다 더해주면 된다.   문제는 커서 이다. 시계 방향, 반시계 방향으로 인덱스 돌리는게 도무지 떠오르지 않아서 삽질을 엄청했다. 배열에서 두 인덱스 사이의 거리 최솟값시계방향, 반시계 방향의 최솟값을 찾으면 된다.// a b 인덱스 ,n은 배열의 크기// 반시계방향 시계방향Math.min((a - b + n) % n, (b - a + n) % n));  어떻게 해서든 풀어보자는 마인드로 문자 길이가 20인걸로 보아 백트래킹 써도 되겠다 싶..

programmers 2025.02.14

가장 큰 정사각형 찾기 [자바]

🧫 문제 분석✔️ 출처가장 큰 정사각형 찾기 level 2📖 문제 2번 시도후 푼 문제다. 1차 시도 정 사각형을 찾는게 문제인데 처음에는 1차원 배열에 각 열에 대한 개수를 세서최솟값을 갱신하면서 카운트를 하고최솟값과 카운트 값이 같다면 가장 큰 정사각형 후보로 넣는 식이였다.당연히 틀렸고, 시간초과났다.  2차 시도문득 생각해보니 DP에 대해 배웠을 때 값을 누적하고 원하는 부분의 값을 얻는 방법이 떠올랐다.dp[i][j] - dp[i-1][j] - dp[i][j] + dp[i-1][j-1] 여기에 정사각형 한 변의 길이를 더해주고 영역 값을 구한 뒤  정사각형 넓이 == 영역 값  ? 한 변 길이 + 1 , 정사각형 넓이 최신화  이런식으로 하면 되지 않을까 라는 생각에 해봤는데 성공했다. 정사..

programmers/Lv 2 2025.02.13

디펜스 게임 [자바]

🧫 문제 분석✔️ 출처디펜스 게임 level 2📖 문제 우선순위 큐를 사용한 탐욕법(그리드) 알고리즘 문제이다.  내가 생각한 방법1 ~ k번째까지는 무적권을 사용한다 가정하고 우선순위 큐에 넣는다.이때 최댓값을 저장한다.  2가지 경우 무적권 사용 라운드를 바꾼다. 현재 라운드의 적 수 >= 무적권을 사용한 라운드의 최대 적 수 현재 라운드의 적 수 > 무적권을 사용한 라운드의 최소 적 수 이 두가지를 만족하면서 최소 적수를 n에서 뺐을때 0미만이 안될때 무적권 사용 라운드를 바꾼다.그리고 최댓값을 갱신한다.   위 2가지 경우가 아니라면 남은 n 명이 현재 라운드 수보다 크거나 같으면 빼주어 현재 라운드를 막는다.  🔅 문제 풀이import java.util.*;class Solution { ..

programmers/Lv 2 2025.02.11

테이블 해시 함수 [자바]

🧫 문제 분석✔️ 출처테이블 해시 함수 level 2📖 문제 매우 간단한 구현문제 다만 4번 항목이 헷갈렸다.모든 S_i를 누적하여 bitwise XOR 한 값을 해시 값으로 반환S_i를 누적합한다음 XOR 하라는 건가? 싶은데 그건 또 아닌거같아서 1번 데이터와 2번 데이터를 XOR 연산 후그 데이터를 또 3번 데이터와 XOR 연산 .. 이런식이다.  🔅 문제 풀이import java.util.Arrays;class Solution { // 해시 함수 매개변수 col, row_begin, row_end // col 번째 컬럼 기준 오름차순 , 같다면 기본키(첫번째 컬럼) 기준 내림차순 // 정렬후 S_i를 i 번째 행의 튜플에 대해 각 컬럼 값을 i로 나눈 나머지들의 합으로 정의 ..

programmers/Lv 2 2025.02.11

행렬 테두리 회전하기 [자바]

🧫 문제 분석✔️ 출처행렬 테두리 회전하기 level 2📖 문제 현재 좌표에서 이동하는 문제다.1~row*columns 까지 이중 배열에 숫자를 각 넣어주고 그래프 탐색처럼, 이동 방향을 정하는 배열을 만든다. 이동 방향은 시계 방향 즉, 좌 하 우 상 순으로 움직인다. 이를 코드로 짜면 아래처럼 된다.  // 좌,하,우,상 int[] dy = {0, 1, 0, -1}; int[] dx = {1, 0, -1, 0};  방향을 정하고 주어진 queries의 좌표값 만큼 이동하면 된다. 주의할 점은 문제에서 queries 각 행은 [x1, y1, x2, y2] 로 주어지는데 x1행 y1열 이다. x2 - x1, y2 - y1 만큼 방향으로 이동하면서 이전 값을 넣어주고 기존 값을 따로 저..

programmers/Lv 2 2025.02.11

다리를 지나는 트럭 [자바]

🧫 문제 분석✔️ 출처다리를 지나는 트럭 level 2📖 문제 2번 재시도 끝에 풀은 문제다.  처음 시도에는 다리 위에 올라간 트럭이 경과한 시간을 잘 못 설계해서 계속 틀렸다.  두 번째 시도는 조건문 하나를 추가하지 않아서 틀렸었다. 4,5,6,9번  다리위에 있는 트럭을 제거해야하는 경우의 수는1. 다리에 트럭이 현재 올라갈 수 있는 트럭 최대 갯수만큼 있는 경우2. 새로운 트럭이 올라간다 했을 때 무게 하중을 넘어가는 경우3. 위 두 경우와는 별개로 다리의 맨 앞 트럭이 다리를 다 건너(시간이 지나) 빠져나가는 경우 이 세가지 경우에 대해서 트럭을 잘 빼준다면 문제없이 쉽게 풀 수 있을 것이다.  나는 3번을 안해서 계속 틀렸었다.. 🔅 문제 풀이import java.util.*;class..

programmers/Lv 2 2025.02.04

미로 탈출 [자바]

🧫 문제 분석✔️ 출처미로 탈출 level 2📖 문제 단순 BFS이며,레버를 당기고 난 후 출구로 나갈 수 있으며레버를 당기지 않아도 출구 지역은 지나다닐 수 있고모든 지점은 여러 번 지나갈 수 있다.  나는 출발점을 찾고 거기서 부터 BFS로 L를 탐색한다음현재 위치에서 다음 위치가 레버이면서 아직 레버를 안당겼다면여태까지 방문한 기록을 없애고, 큐를 초기화 시킨 다음 레버를 당기고(레버 위치를 큐에 담고), 레버 위치에 방문했다고 표시한다. 그리고 레버 위치에서부터 시작하게끔 현재 위치에서 탐색을 중지시킨다.(break)레버 위치에서부터 다시 BFS 탐색을 해서 E인 탈출구를 찾는다. 🔅 문제 풀이import java.util.*;class Solution { // 1. 레버로 이동 ..

programmers/DFS-BFS 2025.02.03

배달 [자바]

🧫 문제 분석✔️ 출처배달 level 2📖 문제  거리 값이 존재하는 그래프 문제이 문제를 통해 다익스트라, 플로이드 워샬 등거리 값이 존재하는 그래프의 탐색이 얼마나 부족한지 깨달았다. 해당 문제를 BFS, 플로이드 워샬, 다익스트라로 풀어보았다. 그리고 거리가 있는 그래프에 대한 간단한 정리를 할 예정이다.  🔅 문제 풀이 - BFSimport java.util.*;class Solution { // N개의 마을, K : 갈 수 있는 거리 // BFS 탐색으로 K - 각 마을까지의 비용 >= 0 인 곳을 방문 int[] visited; public int solution(int N, int[][] road, int K) { int[][] graph = n..

programmers/DFS-BFS 2025.02.02

숫자 카드 나누기 [자바]

🧫 문제 분석✔️ 출처숫자 카드 나누기 level 2📖 문제 영희, 철수 각각 하나의 카드를 선택해서 소인수 분해 후분해한 수들을 영희 카드와 철수카드를 나눠본다.  영희 카드 중 하나를 소인수분해 했을 경우영희 자신의 모든 카드 수는 소인수로 나눠지면서, 철수 것은 나눠지면 안된다.  반대의 경우도 마찬가지이다.  🔅 문제 풀이import java.util.*;class Solution { // 가장 작은 수 선택후 소인수 분해 // 분해된 수들로 해당 배열을 다 나눠본다. boolean으로 나눠지는지 확인 // 다 나눠지면 상대 카드들을 나눠본다. boolean으로 나눠지는지 확인 int max = 0; public int solution(int[..

programmers/Lv 2 2025.02.01