원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
한 번 사용한 카드는 다시 사용할 수 없습니다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return하는 solution 함수를 완성해주세요.
힌트가 되는 지문만 가져왔다. 두 카드 뭉치에서 뽑은 카드가 goal의 맨 앞에 있는 카드와 일치하지 않으면 "No", 끝까지 일치하면 "Yes"를 리턴하는 문제이다.
이 문제를 보고 처음에는 Stack을 생각해서 풀이하려 했는데, 굳이 역순으로 값을 넣는 것 보다 그대로 넣고 앞에서 하나씩 빼는게 좋다고 생각하여 Queue를 사용하여 풀이하였다.
import java.util.*;
import java.util.stream.Collectors;
import java.util.LinkedList;
class Solution {
public String solution(String[] cards1, String[] cards2, String[] goal){
String answer = "";
int index = 0; // goal을 또 Stack 객체로 만들기 싫어서 순회하는 iterator 변수를 선언했다.
Queue<String> queue1 = Arrays.stream(cards1)
.collect(Collectors.toCollection(LinkedList::new));
Queue<String> queue2 = Arrays.stream(cards2)
.collect(Collectors.toCollection(LinkedList::new));
// String[] -> Queue<String> 으로 변환
while(index < goal.length){ //goal 길이만큼 반복
if(!queue1.isEmpty() && queue1.peek().equals(goal[index])){
queue1.poll(); // 앞에서부터 제거
index++;
} else if(!queue2.isEmpty() && queue2.peek().equals(goal[index])){
queue2.poll(); // 앞에서부터 제거
index++;
} else{
return "No";
}
}
return "Yes";
}
}
처음에 Stack을 써서 역정렬하려고 Collectors.reverseOrder()를 사용했는데, 영어순으로 정렬하는 것을 생각못해서 애를 먹었다. 그래도 Queue로 다시 잘 풀려서 다행이었다.
그리워하는 사람의 이름을 담은 문자열 배열 name, 각 사람별 그리움 점수를 담은 정수 배열 yearning, 각 사진에 찍힌 인물의 이름을 담은 이차원 문자열 배열 photo가 매개변수로 주어질 때, 사진들의 추억 점수를 photo에 주어진 순서대로 배열에 담아 return하는 solution 함수를 완성해주세요.
배열 두 개의 사이즈가 같아 <key,value> 형태로 저장하면 딱일 것 같았다. java에서 HashMap을 자주 쓰진 않는데, 이번 기회에 사용해보았다.
이번 문제의 핵심은 이것이다.
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public int[] solution(String[] name, int[] yearning, String[][] photo) {
HashMap<String, Integer> mapping = new HashMap<String, Integer>();
for(int i = 0; i < name.length; i++){ // key, value로 세팅
mapping.put(name[i], yearning[i]);
}
// 1. 이중 배열을 stream화하여 내부 배열을 순회하도록 함
// 2. mapping의 key인 문자열만 등록
// 3. mapping에서 key로 value를 찾아 정수로 변환
// 4. List화
List<Integer> answer = Arrays.stream(photo).map(arr ->
Arrays.stream(arr).filter(mapping::containsKey)
.mapToInt(el -> mapping.get(el)).sum())
.collect(Collectors.toList());
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
stream을 쓰면서 코드가 간결해지면서도 사용 범주가 늘어났다.
자주 쓰면서 코드 스킬을 익히도록 하자.