🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 개요
창고의 각 칸에 들어있는 물건 이름과 개수가 배열로 주어진다.
같은 이름의 물건이 여러 칸에 나누어져 있을 수 있으므로, 같은 물건끼리 하나로 합쳐 개수를 누적해야 한다.
정리된 창고에서 개수가 가장 많은 물건의 이름을 반환하는 문제이다.
📌 접근 방법
중복된 물건을 하나로 합치기 위해 새로운 배열을 사용했다.
clean_storage에는 중복이 제거된 물건 이름을 저장하고, clean_num에는 해당 물건의 누적 개수를 저장한다.
기존 storage 배열을 순회하면서 현재 물건이 이미 clean_storage에 있는지 확인한다.
이미 있다면 해당 위치의 개수에 더하고, 없다면 새로운 물건으로 추가한다.
모든 물건을 정리한 뒤, 누적 개수가 가장 큰 물건의 이름을 찾아 반환한다.
📌 핵심 아이디어
1. 정리된 물건 배열 만들기
같은 물건끼리 합친 결과를 저장하기 위한 배열이다.
최악의 경우 모든 물건 이름이 다를 수 있으므로 기존 배열과 같은 길이로 생성한다.
String[] clean_storage = new String[storage.length];
int[] clean_num = new int[num.length];
2. 이미 등록된 물건인지 확인하기
clean_idx는 현재 물건이 정리된 배열에 이미 있는지 나타내는 변수이다.
초기값을 -1로 두고, 같은 이름의 물건을 찾으면 해당 인덱스를 저장한다.
문자열 비교이므로 equals()를 사용해야 한다.
int clean_idx = -1;
for (int j = 0; j < num_item; j++) {
if (storage[i].equals(clean_storage[j])) {
clean_idx = j;
break;
}
}
3. 처음 나온 물건이면 새로 추가하기
같은 물건을 찾지 못했다면 처음 나온 물건이므로 clean_storage와 clean_num에 새로 저장한다.
num_item은 현재까지 정리된 물건의 개수를 의미한다.
if (clean_idx == -1) {
clean_storage[num_item] = storage[i];
clean_num[num_item] = num[i];
num_item += 1;
}
4. 이미 있는 물건이면 개수 누적하기
이미 등록된 물건이라면 새로 추가하지 않고 기존 개수에 현재 개수를 더한다.
else {
clean_num[clean_idx] += num[i];
}
가장 개수가 많은 물건 찾기
int num_max = -1;
String answer = "";
for (int i = 0; i < num_item; i++) {
if (clean_num[i] > num_max) {
num_max = clean_num[i];
answer = clean_storage[i];
}
}
정리된 물건들 중 가장 개수가 큰 값을 찾고, 해당 물건 이름을 answer에 저장한다.
📌 전체 코드
package level0;
public class No35 {
public static void main(String[] args) {
String[] storage = {"pencil", "pencil", "pencil", "book"};
int[] num = {2, 4, 3, 1};
int num_item = 0;
String[] clean_storage = new String[storage.length];
int[] clean_num = new int[num.length];
for (int i = 0; i < storage.length; i++) {
int clean_idx = -1;
for (int j = 0; j < num_item; j++) {
if (storage[i].equals(clean_storage[j])) {
clean_idx = j;
break;
}
}
if (clean_idx == -1) {
clean_storage[num_item] = storage[i];
clean_num[num_item] = num[i];
num_item += 1;
} else {
clean_num[clean_idx] += num[i];
}
}
int num_max = -1;
String answer = "";
for (int i = 0; i < num_item; i++) {
if (clean_num[i] > num_max) {
num_max = clean_num[i];
answer = clean_storage[i];
}
}
System.out.println(answer);
}
}
📄 정리
- 같은 이름의 물건은 하나로 합쳐 개수를 누적한다.
- 중복 여부는 clean_storage 배열을 직접 탐색해서 확인한다.
- 문자열 비교는 equals()를 사용해야 한다.
- 실제 저장된 물건 개수는 num_item으로 관리한다.
- 마지막에 누적 개수가 가장 큰 물건의 이름을 찾으면 된다.
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 정수를 나선형으로 배치하기 JAVA 풀이 (구현, 시뮬레이션) (0) | 2026.06.26 |
|---|---|
| 프로그래머스 신호등 정전 JAVA 풀이 (시뮬레이션, 최소공배수) (0) | 2026.06.25 |
| 프로그래머스 숫자의 표현 JAVA 풀이 (투 포인터, 슬라이딩 윈도우) (0) | 2026.06.23 |
| 프로그래머스 다음 큰 숫자 JAVA 풀이 (비트 연산, Integer.bitCount) (0) | 2026.06.23 |
| 프로그래머스 피보나치 수 JAVA 풀이 (DP, 공간 최적화) (0) | 2026.06.22 |