문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
다양한 미네랄이 내장되어있는 각각의 암석 컬렉션이 있다. 각 미네랄의 종류는 ascii[a-z] 범위의 소문자로 나타내고 있다. 암석 안에 한 종류의 미네랄이 여러 번 나타날 수 있다. 미네랄은 컬렉션에 각 암석에 최소 한 번 이상 나타난다면 보석이라고 부른다.
각 암석에 내장된 미네랄 리스트가 주어지고, 컬렉션에 보석 종류의 수를 보여줘라.
arr = ['abc', 'abc', 'bc']
미네랄 b와 c는 각 암석에 나타나고, 2개의 보석이 있다.
gemstones 함수를 완성해라.
gemstones 함수는 아래와 같은 매개변수를 가지고 있다.
해당 문자를 리스트의 모든 문자열에 포함되어 있는지 비교하는 문제이다. Set을 사용해서 중복을 찾아내는데 수고를 덜었다.
모든 암석에 포함된 미네랄을 담을 mineral을 생성하는데 이때 Set을 이용해 생성한다. 그리고 arr의 첫 번째 문자열은 따로 할당해둔다.
Set<String> mineral = new HashSet<>();
String first = arr.get(0);
이제 반복문을 통해 각 문자를 전부 비교한다. 이때 flag 변수를 boolean 타입으로 선언하고 각 문자열에 확인했을때 없으면 false를 할당한다. 모든 리스트의 문자열을 확인했다면 flag가 true일때 해당 문자를 mineral에 추가한다.
for(int i = 0; i < first.length(); i++){
boolean flag = true;
for(int j = 1; j < arr.size(); j++){
if(arr.get(j).indexOf(first.charAt(i)) == -1){
flag = false;
}
}
if(flag){
mineral.add(String.valueOf(first.charAt(i)));
}
}
마지마으로 보석의 수를 반환해야하기 때문에 mineral의 size를 반환한다.
return mineral.size();
public static int gemstones(List<String> arr) {
Set<String> mineral = new HashSet<>();
String first = arr.get(0);
for(int i = 0; i < first.length(); i++){
boolean flag = true;
for(int j = 1; j < arr.size(); j++){
if(arr.get(j).indexOf(first.charAt(i)) == -1){
flag = false;
}
}
if(flag){
mineral.add(String.valueOf(first.charAt(i)));
}
}
return mineral.size();
}