본문 바로가기

728x90

프로그래머스(Java)/Level 3

(14)
[프로그래머스] 불량 사용자 코드 힌트DFS(깊이 우선 탐색) 활용이 문제는 모든 가능한 경우의 수를 찾는 문제로, DFS가 적절한 해결 방법입니다.매칭이 성공한 경우 백트래킹(backtracking)을 통해 다음 가능한 조합을 계속 탐색합니다.와일드카드 문자(*) 처리banned_id에 포함된 * 문자는 모든 문자와 매칭되므로, 이 점을 유의하며 처리합니다.고유한 조합 저장조합이 동일한 아이디들을 포함하더라도 순서가 다르면 같은 조합으로 간주됩니다.따라서 Set>을 사용해 고유한 조합을 저장합니다.new HashSet(currentSet)을 통해 조합을 복사하여 uniqueSet에 추가합니다.new HashSet(set)을 사용해 새로운 Set 객체를 생성하여 추가하는 이유는, 기존 Set의 참조를 복사하는 것이 아니라 값 자체를..
[프로그래머스] 스티커 모으기(2) 코드 힌트문제 분석:스티커들이 원형으로 연결되어 있어서, 첫 번째 스티커를 떼면 마지막 스티커는 뗄 수 없습니다. 반대로 첫 번째 스티커를 떼지 않으면 마지막 스티커까지 떼는 것이 가능합니다.따라서 첫 번째 스티커를 떼는 경우와 떼지 않는 경우로 나누어 동적 계획법(DP)을 사용해 최댓값을 구하는 문제입니다.두 가지 케이스로 나눔:첫 번째 스티커를 떼는 경우:첫 번째 스티커를 떼었으므로 마지막 스티커는 뗄 수 없습니다.즉, 마지막 전 스티커까지 고려하여 최댓값을 구합니다.첫 번째 스티커를 떼지 않는 경우:첫 번째 스티커를 떼지 않았으므로 마지막 스티커까지 포함하여 최댓값을 구할 수 있습니다.동적 계획법(DP) 기본 아이디어:DP 배열은 각 스티커를 선택할 때 얻을 수 있는 최댓값을 저장하는 배열입니다.D..
[프로그래머스] 기지국 설치 코드 힌트문제 핵심:기지국은 특정 범위를 커버하며, 기지국이 커버하지 않는 빈 구역에 추가 기지국을 설치해야 합니다.새로운 기지국을 설치할 때는, 각 기지국이 커버할 수 있는 범위를 최대한 활용하여 최소 개수로 설치해야 합니다.기지국 범위 계산:기지국이 커버할 수 있는 범위는 좌우로 w만큼이고, 따라서 한 기지국이 커버하는 전체 범위는 2 * w + 1입니다.구역 처리 순서:각 기지국이 커버하지 않는 구역을 찾아 추가 기지국을 배치합니다.각 기지국이 커버하는 구역은 계산하여 확인된 위치를 그 구역의 오른쪽 끝으로 이동합니다.마지막 구역 처리:모든 기지국이 커버한 이후에도 남은 구역이 있을 경우, 그 구역에 추가 기지국을 설치합니다. 정답은 더보기 클릭더보기class Solution { public ..
[프로그래머스] 단속카메라 코드 힌트:카메라 설치 기준:차량이 고속도로를 나가는 시점에 카메라를 설치하는 것이 가장 효율적입니다.카메라를 설치한 이후에도 다른 차량이 해당 카메라에 걸리는지 확인합니다.차량의 경로가 카메라의 범위를 벗어나는 경우 새로운 카메라를 설치합니다.정렬:차량이 고속도로에서 나가는 시점에 맞춰 오름차순으로 정렬합니다.정렬된 상태에서 경로를 순차적으로 확인해 카메라 설치 여부를 결정합니다.로직 흐름:차량이 나가는 시점을 기준으로 정렬한 후, 가장 먼저 나가는 차량에 카메라를 설치합니다.그 이후 차량들의 경로가 카메라 범위 안에 포함되는지 확인한 후, 포함되지 않으면 새로운 카메라를 설치합니다.  정답은 더보기 클릭더보기import java.util.*;class Solution { public int so..
[프로그래머스] 최고의 집합 코드 힌트:불가능한 경우 처리:만약 n이 s보다 크다면, n개의 숫자로 s를 나누는 것이 불가능하기 때문에 결과 배열로 {-1}을 반환합니다.평균 분배:s를 n으로 나눈 몫을 모든 배열 요소에 기본 값으로 설정합니다.이렇게 하면 각 요소가 가능한 한 균등하게 값을 가지게 됩니다.나머지 분배:s가 n으로 정확히 나누어 떨어지지 않는 경우, 나머지를 배열의 뒤에서부터 하나씩 분배합니다.이렇게 하면 배열이 내림차순으로 정렬된 상태를 유지할 수 있습니다.  정답은 더보기 클릭더보기import java.util.*;class Solution { public int[] solution(int n, int s) { int[] result = new int[n]; // 길이가 n인 결과 배열 생성 ..
[프로그래머스] 숫자 게임 코드 힌트:정렬 후 비교:두 배열 A와 B를 오름차순으로 정렬한 후, 각 요소를 비교합니다.이렇게 하면 최소한의 연산으로 이길 수 있는 경우를 최대화할 수 있습니다.두 포인터 방식:이 코드는 두 포인터 방식(two-pointer technique)을 사용합니다.두 배열을 동시에 순회하면서 비교하여 A의 카드를 사용하여 B의 카드를 이길 수 있는지를 판단합니다.이 방식은 시간 복잡도를 줄이는 데 효과적입니다.반복문 구조:while 반복문은 B 배열의 끝에 도달할 때까지 진행되며, A 배열의 현재 카드가 B 배열의 현재 카드보다 작은 경우에만 result를 증가시킵니다.이로써 A의 카드가 B의 카드보다 많은 경우에도 처리할 수 있습니다. 정답은 더보기 클릭더보기import java.util.*;class S..
[프로그래머스] 베스트앨범 코드 힌트장르별 총 재생 횟수 계산:genres와 plays 배열을 사용하여 각 장르의 총 재생 횟수를 계산합니다.이 정보를 HashMap에 저장합니다.장르 정렬:장르별 총 재생 횟수를 기준으로 장르를 내림차순으로 정렬합니다.이 작업은 장르별로 재생 횟수가 많은 순서대로 곡을 선택하기 위해 필요합니다.장르별 곡 정렬:각 장르에 대해, 그 장르에 속하는 곡들을 재생 횟수로 내림차순으로 정렬합니다.만약 재생 횟수가 같다면, 인덱스가 작은 곡을 우선시합니다.결과 리스트 작성:각 장르에서 가장 많이 재생된 두 곡의 인덱스를 결과 리스트에 추가합니다.이때, 최대 두 곡만 선택합니다.결과 배열 생성:결과 리스트를 배열로 변환하여 반환합니다.  정답은 더보기 클릭더보기import java.util.*;class So..
[프로그래머스] 등굣길 코드 힌트웅덩이 처리:웅덩이(puddles)로 지정된 셀은 경로 계산에서 제외됩니다.이 셀들은 -1로 표시하여, 이후 경로 계산에서 무시하도록 처리합니다.초기화:첫 번째 행과 첫 번째 열의 값을 초기화합니다.만약 웅덩이로 인해 막혀있는 경우 해당 경로는 막히며, 그렇지 않은 경우 1로 설정합니다.이는 초기 경로 설정을 위한 작업입니다.동적 프로그래밍:나머지 셀들은 동적 프로그래밍을 이용하여 계산합니다.각 셀의 경로 수는 왼쪽과 위쪽에서 올 수 있는 경로의 수를 합산하여 계산합니다.이 과정에서 현재 셀이 웅덩이인지 확인하고, 웅덩이가 아닌 경우에만 경로 수를 누적합니다.결과 반환:최종적으로 도착 지점 (m-1, n-1)의 셀에 저장된 경로 수를 반환합니다.결과는 매우 큰 수를 다룰 수 있으므로, 1,000..

728x90