본문 바로가기

Algorithm/Practice

(81)
Programmers - 메뉴 리뉴얼 with JAVA 문제 여러명의 손님들이 각자 주문했던 음식 리스트가 있다. 이를 활용해 최소 2명의 손님이 주문한 2개이상의 음식세트를 만들려고 한다. 이 때, 음식세트의 주문수가 최대인것들을 정렬해서 출력하라. 로직 1. 각 주문마다 course에 맞는 조합 맵 구하기 : map , 조합마다 글자 길이에 맞는 최대값 갱신 : maxCount 2. 조합의 길이마다 최대값이 2보다 같거나 크면서 맵의 값(주문 된 횟수)이 최대값인 경우 결과에 반영 : answer 3. answer 정렬 예를 들어, [1, 2, 3, 4, 5]가 있다고 가정할 때 (각 번호는 음식 번호를 의미) 음식의 종류 3개로 만들 수 있는 조합은 [1, 2, 3] [1, 2, 4] [1, 2, 5] [1, 3, 4] 이런식으로 나갈 것이다. 이러한 ..
Programmers - 2개 이하로 다른 비트 with JAVA (V) 문제 십진수가 주어지고 해당 수보다 큰 수 중에서 2진수로 변환했을 때, 해당 수와 해당 수보다 큰 수의 비트 차이가 2개 이하인 수들 중 가장 작은 수를 구하라. 로직 이 문제는 3가지를 고려해주면 된다. 1. 해당 수가 4로 나눴을 때 3이 아닌가? -> 이런 경우는 1을 더해주면 문제 조건에 맞는 수를 찾을 수 있다. 2. 모두 1인가? -> 예를 들어, 11111 이 있다고 가정하자. -> 해당 수에 1을 더하면 100000이 될 것이다. -> 이 때, 가장 앞자리 10은 고정하고 나머지를 맞추는게 가장 최소이면서 2개 이하 차이나는 수이다. 101111 -> 로직 : 0을 포함하는지 확인 - 10을 앞자리로 설정 - 나머지는 길이에 맞추어 1로 채움 3. 모두 1은 아닌가? -> 예를 들어, 1..
Programmers - 뒤에 있는 큰 수 찾기 with JAVA (V) 문제 예를 들어, [1, 2, 3, 4, 5] 가 있을 때, 해당 수보다 뒤에있으면서 가장 가깝고 해당 수보다 큰 수를 구하고 없으면 -1을 넣은 결과를 출력하라. 로직 1. 결과를 모두 -1로 초기화한다. 2. 스택에 해당 인덱스 값을 순차적으로 넣는다. 3. 스택 마지막부터 확인하면서(후입 선출) 현재 값보다 꺼낸 인덱스에 해당하는 값이 작다면 스택에서 해당 수를 빼고 결과를 현재 값으로 설정함을 반복한다. (만약, 전의 값이 크다면 종료) 4. 위의 과정을 반복한다. 대략 시간 복잡도는 O(N)에 가능하다. 예시 : [9, 1, 5, 3, 6, 2] Stack - Value - result [0] - [9] - [-1, -1, -1, -1, -1, -1] [0, 1] - [9, 1] - [-1, -..
Programmers - 숫자 짝궁 with JAVA 문제 문자열 X,Y가 주어졌을 때, X와 Y 중 겹치는 숫자를 활용해 만들 수 있는 최대값을 구하라 로직 1. 문자열은 각 자리가 0~9로 이루어져있다. 우선적으로, X 내부의 9의 개수, 8의 개수 등을 구하여 배열로 저장한다. (연산 수 : 300만, 누적 : 300만) 2. Y를 체크하는데 만약 위에서 구한 배열에 해당 숫자가 0이라면 다음 숫자를 체크하고 0이 아니라면 1을 빼주고 결과 배열에 저장한다. (연산 수 : 300만, 누적 : 600만) 3. 결과 배열을 9부터 0까지 확인하며 StringBuilder에 추가한다. (연산 수 : 300만, 누적 : 900만) 고찰 - StringBuilder대신 + 연산자로 3번의 과정을 거쳐서 시간에서 넘쳤다. - 기본적으로 String의 + 연산자는..
Programmers - 게임 맵 최단 거리 with JAVA (V) 전형적인 DFS/BFS 문제이긴 하나 조건 설정에 따라 효율성이 달라진다. 그 부분을 기록해보고자 한다. 사용 : BFS 효율성 증가 : 방문처리, 목표지 방문시 종료 처리 로직 및 코드 import java.util.*; class Solution { public int solution(int[][] maps) { int n = maps.length; int m = maps[0].length; int[] dx = {-1, 0, 1, 0}; int[] dy = {0, -1, 0, 1}; for(int i=0; i= m){ continue; } if(maps[next_x][next_y] == -1){ continue; } if(maps[next_x][next_y] < next_cost){ continue;..
Programmers - 기사단원의 무기 with JAVA 문제 1번부터 N번까지 번호를 가진 기사들이 존재하고 각 번호의 약수의 개수만큼의 파워를 가진 무기를 소유가능하다. 하지만 limit보다 약수의 개수가 크다면 해당 기사는 power 크기의 무게만 가질 수 있을 때, 각 기사들의 무기 파워의 합은? 로직 1. 각 번호들의 약수의 개수를 구한다. (약수의 개수를 구하는 가장 효율적인 알고리즘은 해당 수의 제곱근까지만 체크하는 방법이다.) 2. limit보다 크면 power, 작으면 count를 answer에 더한다. 코드 import java.util.*; class Solution { public int solution(int number, int limit, int power) { int answer = 1; for(int i=2; i
Programmers - 야근 지수 with JAVA 문제 일할 수 있는 양 N, 일마다 남은 양 리스트가 주어질 때 (ex [2, 3, 4]) N만큼 일하고 남은 일리스트의 값들의 제곱의 합의 최소를 구하라. 로직 이 문제는 우선순위 큐로 해결하면 쉽다. 하지만 이 아이디어가 떠오르질 않았어서 기록을 해두고자 한다. 1. 모든 남은 일의 양을 우선순위 큐에 넣는다(최대값 우선순위 큐) 2. 하나씩 값을 꺼내서 1을 빼고 다시 큐에 넣고 할 수 있는 일의 양 N에서도 1을 뺀다. 2-1. 만약 꺼낸 값(최대 값)이 0이라면 모든 일을 다 처리한 것이므로 종료한다. 2-2. 만약 N이 0이라면 더이상 일을 할 수 없으므로 종료한다. 코드 import java.util.*; class Solution { public long solution(int n, int..
Programmers - k진수에서 소수 개수 구하기 with JAVA 문제 N(1 소수 체크시 Long처리를 해야한다. (N의 최대는 100만이고 K의 최소는 3이다. 따라서 3진법으로 100만을 나타낸다면 숫자가 굉장히 커지고 int로 담아낼 수 없다.) -> 소수 체크는 해당 값의 제곱근 + 1까지 구하고 이때까지 해당 수를 나머지 없이 나눌 수 없다면 소수이다. -> 1은 소수가 아니다. 항상, 런타임 오류가 발생하면 웬만하면 범위 초가인 듯 하다. 코드 import java.util.*; class Solution { public int solution(int n, int k) { int answer = 0; StringBuilder check = new StringBuilder(); while(true){ check.insert(0, String.valueOf(n..