[프로그래머스 - Java] 카드 뭉치, 추억 점수

RedPanda·2025년 4월 19일
0

[알고리즘] Java

목록 보기
19/22

카드 뭉치

원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
한 번 사용한 카드는 다시 사용할 수 없습니다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
문자열로 이루어진 배열 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을 자주 쓰진 않는데, 이번 기회에 사용해보았다.

이번 문제의 핵심은 이것이다.

  • HashMap 색인
  • 이중 배열 순회
  • 없는 key 필터링 : 문제를 잘못 봐서 사진에 없는 사람 확인을 못했다. 문제를 잘 읽도록 하자.
  • Map에서 value 찾기
  • List -> Int[] 변환 : 이 부분은 통째로 외워야겠다.
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을 쓰면서 코드가 간결해지면서도 사용 범주가 늘어났다.
자주 쓰면서 코드 스킬을 익히도록 하자.

profile
끄적끄적 코딩일기

0개의 댓글