본문 바로가기

728x90

프로그래머스(Java)

(192)
[프로그래머스] 방문 길이 코드 힌트지도 내에서 길을 추적:캐릭터가 이동할 때, 기존에 걸어본 길인지 여부를 추적하여 처음 지나간 길만 카운트합니다.11x11 크기의 2차원 배열로 맵을 표현하고, 각 좌표에서 4방향(상, 하, 좌, 우)에 대해 길의 방문 여부를 기록합니다.좌표는 원래 -5에서 5까지의 범위를 가지지만, 배열의 인덱스로 사용하기 위해 5를 더해줍니다.양방향 길 처리:예를 들어, (0,1)에서 (1,1)로 이동한 길과 (1,1)에서 (0,1)로 되돌아오는 길은 같은 길로 간주합니다.이를 위해 이동할 때 현재 위치에서 가는 길과 도착한 위치에서의 반대 방향 길을 모두 방문 처리합니다.경계 처리:캐릭터가 맵의 경계를 넘지 않도록 확인합니다. 만약 맵을 벗어난다면 이동을 무시합니다.이동 및 길 방문 처리:캐릭터가 이동할 ..
[프로그래머스] 롤케이크 자르기 코드 힌트문제 이해하기:이 문제의 핵심은 롤케이크를 자를 때, 두 부분에 있는 토핑 종류의 수가 동일한 경우를 찾는 것입니다.롤케이크의 크기나 각 부분의 토핑 개수는 중요하지 않고, 오직 각 부분에 포함된 고유한 토핑 종류의 수가 중요합니다.예를 들어, [1, 1, 1, 1]이 주어졌을 때, 다음과 같은 세 가지 경우가 가능합니다:[1] [1, 1, 1][1, 1] [1, 1][1, 1, 1] [1]자료구조 선택하기:저는 이 문제를 효율적으로 풀기 위해, HashMap을 사용하여 각 부분에 포함된 토핑의 종류와 개수를 추적했습니다.HashMap의 key에는 토핑의 종류, value에는 해당 종류의 토핑 개수를 저장합니다.처음에는 HashSet을 사용하여 각 부분의 고유한 토핑을 추적하려고 했지만, 2중 ..
[프로그래머스] 야근 지수 코드 힌트작업의 균등한 감소:문제에서 목표는 배열의 각 요소를 제곱하여 그 합을 최소화하는 것입니다. 이를 위해 가장 큰 요소를 중심으로 작업량을 줄여야 합니다.예를 들어 [4, 3, 3]에서 n = 4일 때, 가능한 한 균등하게 작업량을 줄여 [2, 2, 2]와 같이 만드는 것이 중요합니다. 이렇게 해야 제곱값의 합이 최소화됩니다.배열 정렬:작업량을 줄이기 위해서는 배열을 정렬하여 현재 최댓값을 쉽게 찾을 수 있어야 합니다. Arrays.sort()를 사용하면 배열이 오름차순으로 정렬되며, 최댓값이 항상 배열의 마지막에 위치합니다.하지만 매번 Arrays.sort()를 호출하면 시간 복잡도가 O(n log n)이 되어 효율성 문제가 발생할 수 있습니다. 따라서 전체 배열을 매번 정렬하는 대신, 최댓값이..
[프로그래머스] 모음사전 코드 힌트DFS로 풀기 (모든 단어 생성 후 indexOf로 찾기)모든 단어 생성:재귀 함수를 사용해 가능한 모든 단어를 생성하고 리스트에 저장합니다.문자열의 길이가 5를 넘으면 재귀 호출을 중단합니다.길이가 5 이하인 경우, 리스트에 현재 문자열을 추가합니다.각 재귀 호출에서는 "AEIOU"의 각 문자를 문자열에 추가하며, 이 과정을 반복합니다.단어 위치 찾기:모든 단어가 리스트에 저장된 후, 주어진 단어의 위치(index)를 찾습니다.리스트에서의 위치가 곧 해당 단어가 사전에서 몇 번째로 등장하는지 의미합니다.list.indexOf(word)를 사용해 위치를 찾아 반환합니다.문자열을 변환하며 일치하는지 확인하기문자 변환:주어진 단어의 각 문자를 숫자로 변환하여 비교를 단순화합니다."A"는 "1", "..
[프로그래머스] [3차] 압축 코드 힌트사전 초기화:처음에는 단일 문자(알파벳 A부터 Z까지)로 초기화된 사전을 사용합니다. 이 사전은 문자열을 인코딩하는 데 사용됩니다.문자열 탐색:주어진 문자열을 탐색하면서 가능한 한 많은 문자들을 포함한 단어를 사전에서 찾습니다. 현재 문자부터 시작하여 다음 문자를 추가하면서 사전에 있는지 확인합니다.단어 추가 및 인덱스 기록:찾은 단어가 사전에 존재하지 않으면, 현재 단어의 인덱스를 결과 리스트에 추가합니다. 그 후, 다음 문자를 추가하여 새로운 단어를 사전에 추가합니다.문자열 인코딩:현재 탐색 위치가 문자열의 끝에 도달할 때까지 위의 과정을 반복하여 모든 단어를 인코딩합니다.결과 배열 변환:최종적으로 저장된 인덱스들을 배열로 변환하여 반환합니다. 사전 초기화 코드String[] initialW..
[프로그래머스] 다항식 더하기 코드 힌트문자열 분리:입력된 다항식을 공백(" ")을 기준으로 분리하여 각 항을 확인합니다. 이 과정에서 split(" ") 메소드를 사용합니다.항의 구분:각 항이 'x'를 포함하는지 여부를 확인합니다. 'x'가 포함된 항은 변수 항으로 취급하고, 나머지 항은 상수로 처리합니다.계수 처리:'x' 항이 단독으로 있는 경우 계수를 1로 설정합니다. 'x'와 숫자가 함께 있는 경우 해당 숫자를 계수에 추가합니다.결과 문자열 구성:변수 항과 상수 항의 값을 조합하여 최종 문자열을 만듭니다. 변수 항이 없거나 상수 항이 없는 경우 이를 적절히 처리합니다.특별한 경우 처리:모든 항이 0인 경우 "0"을 반환하고, 상수 항이 없거나 변수 항만 있는 경우 적절히 결과 문자열을 조정합니다.  정답은 더보기 클릭더보기cl..
[프로그래머스] 특이한 정렬 코드 힌트거리 계산:각 원소와 기준값 n의 거리(절대값 차이)를 계산합니다. 이 거리 정보를 기반으로 원소를 정렬할 것입니다.최소 거리 찾기:두 개의 반복문을 사용하여 현재 원소의 거리와 최소 거리를 비교하고, 가장 가까운 원소를 찾습니다. 같은 거리를 가진 원소 중에서는 값이 큰 원소를 우선시합니다.중복 방지:이미 선택된 원소를 다시 처리하지 않도록 거리 배열의 값을 -1로 설정하여 중복을 방지합니다.정렬 및 반환:최종적으로 거리 기준으로 정렬된 원소들을 결과 배열에 저장하여 반환합니다.  정답은 더보기 클릭더보기class Solution { public int[] solution(int[] numlist, int n) { // 결과를 저장할 배열 생성 int[] resu..
[프로그래머스] 유한소수 판별하기 코드 힌트기약 분수 만들기:먼저 주어진 두 수를 사용해 기약 분수로 만듭니다. 이 과정에서 분모를 최대공약수로 나누어 간소화합니다. 유한소수인지 판별하는 데 집중하기 때문에, 분모만 간소화하는 것이 핵심입니다.최대공약수 구하기:두 숫자의 최대공약수를 구해 기약 분수를 만드는 과정입니다. 최대공약수는 두 숫자를 계속해서 나누어 0이 될 때까지 재귀적으로 구할 수 있습니다. 이 과정에서 분모가 간단해집니다.유한소수 판별:분모를 소인수분해하여 2와 5 이외의 다른 소인수가 있는지 확인합니다.숫자를 반복적으로 나누어 2나 5 이외의 소인수가 존재하면 유한소수가 아니므로 false를 반환합니다.그렇지 않다면 true를 반환하여 유한소수임을 확인합니다.정답은 더보기 클릭더보기class Solution { pu..

728x90