
⚠️ 주의!
프로그래머스에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.
프로그래머스에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.
현재 하고 있는 기초 트레이닝 외에도 천천히 레벨을 올려가면서 하고 싶어 넣어본다.
아주 간단한 문제는 넘어간다.
135808. 과일 장수
과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.
한 상자에 사과를 m개씩 담아 포장합니다.상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.
과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)
예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.
(최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8
사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.
제한사항
3 ≤ k ≤ 93 ≤ m ≤ 107 ≤ score의 길이 ≤ 1,000,0001 ≤ score[i] ≤ k이익이 발생하지 않는 경우에는 0을 return 해주세요.
문제 해설
Arrays.sort하여 위에서부터 만들어나가면 된다. 이제 이 m의 단위로 끊으면 제일 앞에 있는 값이 minScore이기 때문에 이를 m과 곱하여 주면 된다.
정답
import java.util.Arrays;
class Solution {
public int solution(int k, int m, int[] score) {
int answer = 0;
Arrays.sort(score);
for(int i = score.length - m; i >= 0; i -= m){
int minScore = score[i];
answer += minScore * m;
}
return answer;
}
}
131128. 숫자 짝꿍
두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.
예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.
제한사항
3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.X, Y는 0으로 시작하지 않습니다.X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.
정답률 57%로 낮은 축에 속한다.
문제 해설
연산의 시간 단축을 위해 StringBuilder를 사용하는 것이 좋다. String을 그대로 사용하면 큰 숫자에서 오류가 난다.
X와 Y를 char형태로 하며, 0부터 9까지의 개수를 count한다. 그리고 그 중 min값을 골라 그만큼을 순회하면서 StringBuilder에 append시킨다. 높은 거부터였기 때문에 i는 9로 시작하는 게 좋다.
정답
class Solution {
public String solution(String X, String Y) {
String answer = "";
int[] countX = new int[10];
int[] countY = new int[10];
int pair = 0;
StringBuilder sb = new StringBuilder();
for(char c : X.toCharArray()) {
countX[c - '0']++;
}
for(char c : Y.toCharArray()) {
countY[c - '0']++;
}
for(int i = 9; i >= 0; i--){
pair = (int)Math.min(countX[i], countY[i]);
for(int j = 1; j <= pair; j++){
sb.append(i);
}
}
if (sb.length() == 0) {
return "-1";
}
answer = sb.toString();
if (answer.charAt(0) == '0') {
return "0";
}
return answer;
}
}
모범정답과 유사하다.
178871. 달리기 경주
얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다. 선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.
정답률 49%의 어려운 문제다.
문제 해설
HashMap의 사용을 하는 것이 좋다. key를 player 이름으로 두고, value를 등수로 두는 쪽을 추천한다(이쪽이 player를 찾기 쉬워진다.) 그리고 map의 value값을 서로 바꾸고, players도 바꿔둬야 이후에 참고하기가 편해진다.
그리고 keySet으로 순환하면서 answer를 추가하여 반환하면 되지만, 그냥 players를 반환해도 된다는 걸 쓰면서 깨달았다.
정답
import java.util.HashMap;
import java.util.Map;
class Solution {
public String[] solution(String[] players, String[] callings) {
String[] answer = {};
answer = new String[players.length];
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i = 0; i < players.length; i++) {
map.put(players[i],i);
}
for(int i = 0; i < callings.length; i++) {
int idx = map.get(callings[i]);
map.put(callings[i], idx - 1);
map.put(players[idx - 1], idx);
String before = players[idx];
players[idx] = players[idx - 1];
players[idx - 1] = before;
}
for(String key : map.keySet()) {
answer[map.get(key)] = key;
}
return answer;
}
}
모범정답과 유사하다.
import java.util.HashMap;
import java.util.Map;
class Solution {
public String[] solution(String[] players, String[] callings) {
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i = 0; i < players.length; i++) {
map.put(players[i],i);
}
for(int i = 0; i < callings.length; i++) {
int idx = map.get(callings[i]);
map.put(callings[i], idx - 1);
map.put(players[idx - 1], idx);
String before = players[idx];
players[idx] = players[idx - 1];
players[idx - 1] = before;
}
return players;
}
}
다만 이쪽이 더 낫다.
'코테런 > Programmers' 카테고리의 다른 글
| [코딩 테스트 RUN] PROGRAMMERS LV 2 : 다음 큰 숫자 (0) | 2026.03.25 |
|---|---|
| [코딩 테스트 RUN] PROGRAMMERS LV 1 : 시저 암호 (0) | 2026.03.03 |
