코딩테스트

99클럽 코테 스터디 7일차 TIL : HashSet

kchabin 2025. 1. 22. 22:06

입력

첫 번째 줄에 봉골레 파스타를 만들기 위한 요리 재료 종류의 개수 N$N$이 주어진다. (2≤N≤1000)$(2\le N\le 1 000)$

두 번째 줄에 봉골레 파스타에 들어가는 N$N$가지의 요리 재료가 공백으로 구분되어 주어진다. 모든 요리 재료는 한 번씩만 주어진다.

세 번째 줄에 봉골레 파스타에 들어가는 N$N$가지의 재료 중 현빈이가 사용한 N−1$N-1$가지의 요리 재료가 공백으로 구분되어 주어진다. 같은 요리 재료가 2$2$번 이상 주어지는 경우는 없다.

각 재료는 알파벳 대/소문자로 이루어져 있고 길이 20$20$ 이하의 문자열이다. 같은 철자를 가진 요리 재료이더라도, 대소문자의 여부가 다르다면 두 요리 재료는 다른 요리 재료이다.

출력

현빈이가 빼먹은 재료를 출력한다.

예제 입력 1 복사

5
Flour Garlic Seashell Oil Butter
Seashell Oil Butter Flour

예제 출력 1 복사

Garlic

내 풀이

빼먹은 하나의 재료를 찾는 문제.

처음에 HashMap<String, Boolean> 형태로 재료를 key값으로 저장해서 처음엔 죄다 false 값으로 초기화하고 나중에 사용한 재료로 반복문을 돌려서 해당 문자열이 key로 존재하면 true, 아니면 false 값으로 바꾼뒤 value=false인 key값만 출력하는 방식을 생각했지만 뜻대로 되지 않았다.

지피티가 차집합 연산을 알려줘서 불과 이틀전에 공부한 kotlin의 map 간 연산을 떠올릴 수 있었다.

fun main(){
    
    val N = readLine()!!.toInt()
    val all = readLine()!!.split(" ").toSet()
    val used = readLine()!!.split(" ").toSet()
    
    val missing = all - used
    println(missing.first())
    
  
}

이 문제에서 HashSet을 사용한다. Kotlin에서는 Set. 일단 문제 조건이 중복재료는 없는 조건이라 사용할 수 있다. Set은 차집합 연산이 가능한 자료구조이기 때문에 전체 재료set,사용한 재료 set을 만들어서 - 연산을 해주면 간단하게 빼먹은 재료 한 개를 찾아서 출력할 수 있다.

import java.util.*;

public class Main {

    public static void main(String[] args){
    
        Scanner sc = new Scanner(System.in);
        sc.nextLine();
        
        //필요한 재료
        String[] allIng = sc.nextLine().split(" ");
        Set<String> allSet = new HashSet<>(Arrays.asList(allIng));
        
        
        //사용한 재료
        String[] usedIng = sc.nextLine().split(" ");
        Set<String> usedSet = new HashSet<>(Arrays.asList(usedIng));
        
        //차집합 연산
        allSet.removeAll(usedSet);
        
        System.out.println(allSet.iterator().next());
        
        sc.close();
    }

}

Java에서는 HashSet을 사용한다. 일단 입력을 받을 때는 String 배열로 받는다. 불변이니까 가변인 Set으로 만들어주는 것이다. 여기도 동일하게 전체와 사용한 재료 셋을 만드는데 단순히 빼기 연산이 아니라 전체 재료 셋에서 사용한 재료 셋을 removeAll() 하는 방식으로 중첩되는 재료를 제거하고 빼먹은 재료 하나만 남겨 출력한다.