코테공부/문제풀이(9)
-
[프로그래머스] 보석 쇼핑
문제진열된 보석들 중 모든 종류의 보석을 적어도 하나 이상 포함하는 가장 짧은 구간을 찾아야 한다.조건은 다음과 같다:보석의 진열 순서가 담긴 문자열 배열 gems가 주어진다.진열된 보석들을 연속적으로 선택한 구간 중, 모든 보석 종류를 한 번 이상 포함하는 가장 짧은 구간의 시작과 끝 인덱스를 반환한다.정답이 여러 개인 경우, 시작 인덱스가 가장 작은 구간을 반환한다.풀이 방법풀이 시간 : 1시간풀이 방법 : 투포인터 + 해시맵 (슬라이딩 윈도우) 반환 타입을 보자마자 이건 투포인터구나! 라는 생각을 했다.그리고 문제에 나와있는대로 모든 종류를 포함해야 한다는 조건때문에 Set과 HashMap을 이용해 중복에 대한 처리를 진행하거나, 갯수에 대한 처리를 진행할 수 있을 것 같다는 생각을 하고 들어갔다...
2025.06.04 -
[프로그래머스] 다리를 지나가는 트럭
문제트럭 여러 대가 순서대로 다리를 지나가야 한다. 단, 다리는 bridge_length 만큼의 길이를 가지며, 동시에 올라갈 수 있는 트럭의 무게 합은 weight를 넘지 않아야 한다. 트럭은 1초에 1만큼 이동, 다리에 올라간 순서대로 움직인다. 모든 트럭이 다리를 건너는 데 걸리는 최소 시간을 구해야한다.풀이방법풀이 시간 : 30분풀이 방법 : 시뮬레이션 + 큐(Queue) 처음에는 단순히 다리 길이나 무게 제한만 고려해서 트럭을 올릴 수 있는지 판단하면 된다고 생각했다.하지만 다리 위에서 트럭이 동시에 이동하고, 무게 제한도 유지하며 매 초마다 트럭이 한칸씩 이동한다는 점에서 단순 조건문으로는 해결할 수 없었따. 예를 들어,더보기bridge_length = 2 weight = 10 truc..
2025.06.03 -
[프로그래머스] 미로 탈출
문제미로의 출구를 찾아 최단 경로로 탈출하는데, 중간에 레버를 당기고 탈출해야하는 문제이다.풀이방법풀이 시간 : 20분풀이 방법 : BFS BFS를 이용해 최단 경로를 만들어주면 되는데 레버를 당기는게 이 문제의 핵심이다.쉽게는 그냥 시작점 -> 레버 + 레버 + 탈출구의 경로를 찾아 더해주면 된다.코드import java.io.*;import java.util.*;class Solution { static final int[] dx = {1, -1, 0, 0}; static final int[] dy = {0, 0, -1, 1}; static int n, m; static char[][] map; public int solution(String[] maps) { ..
2025.05.26 -
[프로그래머스] 소수찾기
문제주어진 numbers들을 재조합해 소수의 갯수를 찾는 문제이다. 풀이방법풀이 시간 : 20분풀이 방법 : 완전탐색 크게보면 2가지로 나눌 수 있다. 주어진 numbers들을 이용해 새로운 조합 만들기만들어진 조합수들이 소수인지 확인하기1. 조합 만들기 - 백트래킹에서는 현재까지 만든 숫자 문자열(current)과 방문 여부 배열(visited)을 이용해 1자리부터 n자리까지 모든 숫자 조합을 생성했다. 이 과정에서 같은 숫자가 여러 번 조합될 수 있으므로, 중복을 방지하기 위해 Set을 사용해 생성된 숫자를 저장했다. 2. 소수 찾기- 이제 이렇게 만들어진 숫자들이 소수인지 확인해줘야 하는데, 여기서 중요한건 소수 판별의 효율성이다. 단순하게 2부터 number - 1 까지 나누는 방식은 너무 비효율..
2025.05.07 -
[프로그래머스] 순위
문제일부만 확인 가능한 경기 결과를 보고 순위를 매길 수 있는 선수의 수를 반환하면 된다.풀이방법풀이 시간 : 20분풀이 방법 : 플로이드-워셜 플로이드-워셜 알고리즘을 사용해 문제를 풀이하면 된다.https://90000e.tistory.com/10 [알고리즘] 플로이드-워셜 알고리즘플로이드-워셜(Floyd-warshall) 알고리즘 쉽게 이해하기그래프 문제 중, 모든 정점 쌍의 최단 경로를 구하는 문제를 만나면 어떻게 해야할까?바로 이럴 때 사용되는 알고리즘이 플로이드-워셜 알고90000e.tistory.com 플로이드-워셜 알고리즘을 이용해 이기는 사람과 지는 사람의 모든 경우를 확인한다.만약 1이 3한테 지고 4가 1한테 진다면, 4도 3에게 지는게 된다.이런식으로 모든 경우를 확인한 후 자신을 ..
2025.04.30 -
[프로그래머스] 방의 개수
문제문제는 굉장히 간단하다. 문제와 같이 8방향으로 움직여 아래와 같이 방이 만들어지는 갯수를 반환하면 된다. 풀이방법- 풀이 시간 : 30분 일단 arraws의 크기가 최대 10만개다. 양옆/위아래로 10만개씩 그려주려면 200,000 * 200,000의 배열이 필요하다.이정도 배열이면 boolean형태여도 메모리가 37GB 정도가 된다.. 메모리 초과가 무조건 난다.그래서 생각하게 된 방법이 Set을 이용해 방문한 노드를 저장해준다면 map을 그릴 필요도 없고 굉장히 편리해지는거 아닌가? 라는 생각을 했다. 그렇게 이미 방문한 노드를 한번 더 방문하게 된다면 + 1 해주는 방식으로 진행했다. 이미 방문한 노드를 방문해야 방이 생긴다고 생각했다. 그렇게 짠 코드로 돌려봤지만 역시나 실패였고 내가 생각하..
2025.04.29