[HackerRank] Gemstones

아르당·2024년 1월 17일
0

HackerRank

목록 보기
68/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

다양한 미네랄이 내장되어있는 각각의 암석 컬렉션이 있다. 각 미네랄의 종류는 ascii[a-z] 범위의 소문자로 나타내고 있다. 암석 안에 한 종류의 미네랄이 여러 번 나타날 수 있다. 미네랄은 컬렉션에 각 암석에 최소 한 번 이상 나타난다면 보석이라고 부른다.
각 암석에 내장된 미네랄 리스트가 주어지고, 컬렉션에 보석 종류의 수를 보여줘라.

Example

arr = ['abc', 'abc', 'bc']

미네랄 b와 c는 각 암석에 나타나고, 2개의 보석이 있다.

Function Description

gemstones 함수를 완성해라.
gemstones 함수는 아래와 같은 매개변수를 가지고 있다.

  • String arr[n]: 문자열 배열

Returns

  • int: 찾은 보석의 수

Constraints

  • 1 <= n <= 100
  • 1 <= |arr[i]| <= 100
  • 각 arr[i]의 구성은 오직 라틴어의 소문자('a'-'z')로 되어 있다.

Solved

해당 문자를 리스트의 모든 문자열에 포함되어 있는지 비교하는 문제이다. 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();

All Code

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();
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글