
내가 생각했을때 문제에서 원하는부분
첫 번째 줄에는 임스가 춘배에게 제공한 문자열의 길이 N이 주어진다. (1 ≤ N ≤ 100)
두 번째 줄에는 임스가 춘배에게 제공한 문자열이 주어진다.
임스가 춘배에게 제공한 문자열로 무지개를 만들 수 있는지 출력한다.
내가 이 문제를 보고 생각해본 부분
main 메서드 초기화:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: BufferedReader 객체를 생성해서 표준 입력(키보드 입력)을 받을 준비를 한다.
int N = Integer.parseInt(br.readLine());: 문제에서 문자열의 길이 N을 첫 줄에 주지만, 이 문제에서는 문자열의 실제 길이를 직접 사용하는 대신, 문자열 자체를 파싱해서 처리할 것이기 때문에 그냥 읽어 들이기만 한다.
String str = br.readLine();: 임스가 춘배에게 제공한 실제 문자열을 읽어 str 변수에 저장한다.
HashSet으로 등장 문자 기록:
Set<Character> foundLowerRainbowChars = new HashSet<>();: 소문자 무지개('r', 'o', 'y', 'g', 'b', 'i', 'v') 중에서 어떤 문자들이 발견되었는지 저장할 HashSet이다.
Set<Character> foundUpperRainbowChars = new HashSet<>();: 대문자 무지개('R', 'O', 'Y', 'G', 'B', 'I', 'V') 중에서 어떤 문자들이 발견되었는지 저장할 HashSet이다.
문자열 순회 및 HashSet 문자를 추가하고 기록한다:
for(char ch : str.toCharArray()): str 문자열을 하나의 문자 배열(toCharArray())로 만들어서, 각 문자를 ch 변수에 하나씩 가져와 반복 처리한다.
switch(ch): 현재 문자 ch가 무지개 문자에 해당하는지 확인한다.
case 'r': foundLowerRainbowChars.add('r'); break;: 만약 ch가 'r'이라면, foundLowerRainbowChars 세트에 'r'을 추가한다.
HashSet의 특성상 'r'이 여러 번 등장하더라도 한 번만 저장되므로, 중복을 신경 쓸 필요가 없어져 코드가 간결해진다.
마찬가지로 다른 소문자 무지개 문자와 대문자 무지개 문자에 대해서도 같은 방식으로 처리한다.
무지개 색이 아닌 문자는 default 케이스로 빠져나가 무시된다.
무지개 완성 조건 확인:
boolean canMakeLowerRainbow = (foundLowerRainbowChars.size() == 7);: foundLowerRainbowChars 세트에 저장된 문자의 개수가 7개라면, 소문자 무지개를 만들 수 있다는 뜻이므로 canMakeLowerRainbow를 true로 설정한다.
boolean canMakeUpperRainbow = (foundUpperRainbowChars.size() == 7);: 동일하게 foundUpperRainbowChars 세트의 크기가 7인지 확인하여 대문자 무지개 완성 여부를 판단한다.
결과 출력:
if(canMakeLowerRainbow && canMakeUpperRainbow): 두 boolean 변수가 모두 true이면 "YeS"를 출력한다.
else if(canMakeLowerRainbow): 대문자 무지개는 못 만들지만 소문자 무지개는 만들 수 있으면 "yes"를 출력한다.
else if(canMakeUpperRainbow): 소문자 무지개는 못 만들지만 대문자 무지개는 만들 수 있으면 "YES"를 출력한다.
else: 위의 어떤 조건에도 해당하지 않으면, 즉 어떤 무지개도 만들 수 없다면 "NO!"를 출력한다.
br.close();: 사용이 끝난 BufferedReader 리소스를 닫아준다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
// 백준 30403번 문제
public class Main1237 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // N 값은 이 문제에서 직접적으로 활용되지 않지만, 입력 형식에 맞춰 읽습니다.
String str = br.readLine();
// 소문자 무지개 문자가 등장했는지 체크하는 Set
Set<Character> foundLowerRainbowChars = new HashSet<>();
// 대문자 무지개 문자가 등장했는지 체크하는 Set
Set<Character> foundUpperRainbowChars = new HashSet<>();
// 입력 문자열을 순회하며 각 문자를 확인합니다.
for (char ch : str.toCharArray()) {
switch (ch) {
// 소문자 무지개 문자가 나타나면 해당 Set에 추가합니다.
case 'r': foundLowerRainbowChars.add('r'); break;
case 'o': foundLowerRainbowChars.add('o'); break;
case 'y': foundLowerRainbowChars.add('y'); break;
case 'g': foundLowerRainbowChars.add('g'); break;
case 'b': foundLowerRainbowChars.add('b'); break;
case 'i': foundLowerRainbowChars.add('i'); break;
case 'v': foundLowerRainbowChars.add('v'); break;
// 대문자 무지개 문자가 나타나면 해당 Set에 추가합니다.
case 'R': foundUpperRainbowChars.add('R'); break;
case 'O': foundUpperRainbowChars.add('O'); break;
case 'Y': foundUpperRainbowChars.add('Y'); break;
case 'G': foundUpperRainbowChars.add('G'); break;
case 'B': foundUpperRainbowChars.add('B'); break;
case 'I': foundUpperRainbowChars.add('I'); break;
case 'V': foundUpperRainbowChars.add('V'); break;
// 무지개 색에 해당하지 않는 문자는 무시합니다.
}
}
// 소문자 무지개 7글자가 모두 찾아졌는지 확인합니다.
boolean canMakeLowerRainbow = (foundLowerRainbowChars.size() == 7);
// 대문자 무지개 7글자가 모두 찾아졌는지 확인합니다.
boolean canMakeUpperRainbow = (foundUpperRainbowChars.size() == 7);
// 결과 조건에 따라 출력합니다.
if (canMakeLowerRainbow && canMakeUpperRainbow) {
System.out.println("YeS");
} else if (canMakeLowerRainbow) {
System.out.println("yes");
} else if (canMakeUpperRainbow) {
System.out.println("YES");
} else {
System.out.println("NO!");
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.