
내가 생각했을때 문제에서 원하는부분
첫 번째 줄에는 모은 알파벳 띠부띠부씰 개수 N 이 주어진다. (1 ≤ N ≤ 1000)
두 번째 줄에는 알파벳 대문자로 이루어진 N개의 알파벳 띠부띠부씰이 나열된다.
배송받을 수 있는 최대 골드칩 봉지 수를 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 받기 및 내가 가진 띠부띠부씰 개수 세기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 키보드로부터 입력을 효율적으로 읽어들이기 위해 BufferedReader를 생성한다.
int N = Integer.parseInt(br.readLine());: 첫 번째 줄에서 띠부띠부씰의 총 개수 N을 읽어 정수형으로 변환하여 N 변수에 저장한다.
String stickers = br.readLine();: 두 번째 줄에서 N개의 알파벳 띠부띠부씰을 하나의 문자열 stickers로 읽어들인다.
Map<Character, Integer> myStickers = new HashMap<>();: myStickers라는 HashMap을 선언해준다.
이 맵은 char (알파벳 문자)를 키로, Integer (해당 알파벳의 개수)를 값으로 저장하여, 어떤 띠부띠부씰을 몇 개 가지고 있는지 관리한다.
for (char c : stickers.toCharArray()) { ... }: 읽어들인 stickers 문자열을 문자 배열로 변환한 후, 각 문자(c)를 하나씩 반복 처리한다.
myStickers.put(c, myStickers.getOrDefault(c, 0) + 1);: 이 줄이 핵심입니다. myStickers 맵에 현재 문자 c의 개수를 1 증가시킨다.
myStickers.getOrDefault(c, 0): 맵에 이미 c라는 키가 있다면 그 키에 해당하는 현재 값을 가져오고, 없다면 기본값인 0을 가져온다.
여기에 + 1을 하여 현재 문자의 개수를 하나 늘린 후, 다시 put(c, ...)을 통해 맵에 저장한다.
이 과정을 거치면 myStickers 맵에는 가지고 있는 모든 띠부띠부씰의 알파벳별 개수가 정확히 저장된다.
"BRONZESILVER" 단어를 만드는데 필요한 띠부띠부씰 정의
Map<Character, Integer> required = new HashMap<>();: required라는 또 다른 HashMap을 선언한다.
이 맵은 "BRONZESILVER"라는 단어를 딱 한 번 만드는데 필요한 각 알파벳과 그 개수를 정의한다.
required.put('B', 1);, required.put('R', 2); 등: "BRONZESILVER" 단어를 분해하여 각 알파벳이 몇 개씩 필요한지 직접 명시했다.
예를 들어 'R'은 "BRONZE"와 "SILVER"에 각각 한 번씩 등장하므로 총 2개가 필요하다고 설정되어 있다.
이 맵은 "BRONZESILVER" 단어의 '청사진' 역할을 한다.
최대 골드칩 봉지 수 계산 및 결과 출력
int maxGoldChips = Integer.MAX_VALUE;: maxGoldChips 변수는 최종적으로 만들 수 있는 골드칩 봉지의 개수를 저장할 변수이다.
초기값을 Java에서 표현할 수 있는 가장 큰 정수(Integer.MAX_VALUE)로 설정한 것은, 어떤 값이 들어와도 그 값과 비교하여 더 작은 값으로 갱신해나가기 위함이다.
최종적으로는 여러 알파벳 중에서 가장 부족한 알파벳 때문에 만들 수 있는 묶음 수가 제한될 것이므로, '최소값'을 찾아야 한다.
for (Map.Entry<Character, Integer> entry : required.entrySet()) { ... }: required 맵에 있는 모든 알파벳-개수 쌍(entry)을 하나씩 순회한다.
이 반복문을 통해 "BRONZESILVER"를 만드는 데 필요한 각 알파벳('B', 'R', 'O', 'N', 'Z', 'E', 'S', 'I', 'L', 'V')을 하나하나 따져본다.
char charNeeded = entry.getKey();: 현재 필요한 알파벳 문자(예: 'B')를 가져온다.
int countNeeded = entry.getValue();: 현재 알파벳이 "BRONZESILVER" 한 묶음에 필요한 개수(예: 'B'는 1개, 'R'은 2개)를 가져온다.
int myCount = myStickers.getOrDefault(charNeeded, 0);: myStickers 맵에서 해당 charNeeded 알파벳을 몇 개 가지고 있는지 가져온다.
* 만약 띠부띠부씰 중 charNeeded에 해당하는 알파벳이 없다면 0을 가져온다.
int currentPossibleChips = myCount / countNeeded;: 지금 다루고 있는 charNeeded 알파벳 하나만으로 "BRONZESILVER" 묶음을 몇 개 만들 수 있는지를 계산한다.
예를 들어, 'R'이 5개 있고, "BRONZESILVER" 한 묶음에 'R'이 2개 필요하다면 5 / 2 = 2가 되어 2묶음을 만들 수 있다고 계산된다.
정수 나눗셈이기 때문에 나머지는 버려진다.
maxGoldChips = Math.min(maxGoldChips, currentPossibleChips);: 지금까지 계산한 maxGoldChips 값과 방금 계산한 currentPossibleChips 값 중에서 더 작은 값을 maxGoldChips에 다시 저장한다.
"BRONZESILVER" 단어를 만들기 위해서는 모든 필요한 알파벳이 충분해야 하므로, 가장 부족한 알파벳이 전체 묶음 수를 결정하게 된다.
예를 들어, 'B'로는 5개를 만들 수 있지만, 'R'로는 2개밖에 만들 수 없다면, 최종적으로는 'R' 때문에 2묶음까지만 만들 수 있게 되는 원리이다.
System.out.println(maxGoldChips);: 반복문이 모두 끝나면 maxGoldChips에는 "BRONZESILVER" 단어를 만들 수 있는 최대 묶음, 즉 골드칩의 최대 봉지 수가 저장되어 있다.
이 값을 출력한다.
br.close();: BufferedReader 자원을 해제한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
// 백준 29713번 문제
public class Main1254 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 총 띠부띠부씰 개수 N을 읽습니다.
String stickers = br.readLine(); // N개의 띠부띠부씰 알파벳 문자열을 읽습니다.
// 1. 가지고 있는 각 알파벳 띠부띠부씰의 개수를 저장할 Map을 생성합니다.
Map<Character, Integer> myStickers = new HashMap<>();
for (char c : stickers.toCharArray()) {
myStickers.put(c, myStickers.getOrDefault(c, 0) + 1);
}
// 2. "BRONZESILVER"를 만드는데 필요한 각 알파벳의 개수를 정의합니다.
// 이 부분을 Map으로 만들어서 처리하는 것이 더 확장성 있고 편리합니다.
Map<Character, Integer> required = new HashMap<>();
required.put('B', 1);
required.put('R', 2); // BRONZE, SILVER
required.put('O', 1);
required.put('N', 1);
required.put('Z', 1);
required.put('E', 2); // BRONZE, SILVER
required.put('S', 1);
required.put('I', 1);
required.put('L', 1);
required.put('V', 1);
int maxGoldChips = Integer.MAX_VALUE; // 만들 수 있는 골드칩 봉지 수를 저장할 변수, 초기값은 무한대로 설정
// 3. "BRONZESILVER"를 구성하는 각 알파벳에 대해 만들 수 있는 최대 묶음 수를 계산합니다.
for (Map.Entry<Character, Integer> entry : required.entrySet()) {
char charNeeded = entry.getKey(); // 필요한 알파벳 (예: 'B', 'R' 등)
int countNeeded = entry.getValue(); // 그 알파벳이 한 묶음에 필요한 개수 (예: 'B'는 1개, 'R'은 2개)
// 내가 가지고 있는 해당 알파벳의 개수
int myCount = myStickers.getOrDefault(charNeeded, 0);
// 해당 알파벳만으로 만들 수 있는 묶음 수 계산
// (내가 가진 개수 / 필요한 개수)
// 만약 내가 가진 개수가 0개여서 countNeeded로 나눌 수 없거나,
// 애초에 없는 알파벳이면 0이 됩니다.
int currentPossibleChips = myCount / countNeeded;
// 모든 알파벳 중에서 가장 적게 만들 수 있는 수를 찾아야 합니다.
// 그래야 모든 조건을 충족하여 "BRONZESILVER"를 만들 수 있습니다.
maxGoldChips = Math.min(maxGoldChips, currentPossibleChips);
}
System.out.println(maxGoldChips); // 최종 결과 출력
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.