BaekJoon 10815번 숫자 카드

Date:     Last Updated:

출처: BaekJoon 숫자 카드

1차 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int sangCardLen = Integer.parseInt(br.readLine());
		String sangCardNum = br.readLine();
		int totalCardLen = Integer.parseInt(br.readLine());
		String totalCardNum = br.readLine();
		String[] arrSangCard = sangCardNum.split(" ");
		String[] arrTotalCard = totalCardNum.split(" ");

		Map<Integer, Integer> numberCardMap = new LinkedHashMap();
		for (String number : arrTotalCard) {
			numberCardMap.put(Integer.parseInt(number), 0);
		}
		
		for (String number : arrSangCard) {
			if(numberCardMap.containsKey(Integer.parseInt(number))){
				numberCardMap.put(Integer.parseInt(number), 1);
			}	
		}
		
		for (Entry<Integer, Integer> number : numberCardMap.entrySet()) {
			System.out.print(number.getValue() + " ");
		}
	}
}


/*
    예전에 시도했다가 풀지 못하고 다시 보는 문제. 확실히 다시 보니까 또 새롭고 다른 풀이 방법이 떠오른다. 역시 연습만이 살길인가보다.
    문제에는 이분탐색을 이용해서 풀라고 나왔는데 내 머리속에서의 해결법은 map을 이용한 해결이었다.
    다만 마지막에 출력할때 map은 보통은 순서를 보장하지 않으므로 그 해결을 어떻게 할지 고민했는데
    자바에서는 입력한 순서를 보장해주는 linkedhashmap이 있어서 이 자료구조를 이용해서 출력했다.
    
    1차 풀이
    1. 먼저 상근이의 카드와 전체 카드를 배열로 만든다.
    2. 전체 카드 배열을 반복하면서 숫자를 key로 value는 0으로 map에 넣는다.
    3. 상근이의 카드 배열을 반복하면서 map에 상근이의 카드 숫자가 key로 존재하는지 map.containsKey로 확인해서
    존재하면 value값을 1로 바꾼다.
    4. map을 출력하면 정답.
*/

1차 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedHashSet;
import java.util.Set;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int sangCardLen = Integer.parseInt(br.readLine());
		String sangCardNum = br.readLine();
		int totalCardLen = Integer.parseInt(br.readLine());
		String totalCardNum = br.readLine();
		String[] arrSangCard = sangCardNum.split(" ");
		String[] arrTotalCard = totalCardNum.split(" ");
		
		Set<Integer> numberCardSet = new LinkedHashSet<Integer>();
		
		for (String number : arrSangCard) {
			numberCardSet.add(Integer.parseInt(number));
		}
		
		for (String number : arrTotalCard) {
			if(numberCardSet.contains(Integer.parseInt(number))){
				System.out.print(1 + " ");
				continue;
			}
			System.out.print(0 + " ");
		}
	}
}

/*
    1차 풀이에서 출력을 위해서 돌던 반복문을 없앴고 map을 사용했는데 value가 필요없어져서 set으로 변경했고
    set도 linkedhashset을 이용해서 했다. 근데 다시 보니 set은 사용해야하지만 linkedhashset일 필요는 없었다.
    출력의 순서를 totalCard를 가지고 있는 배열로 하기 때문에 순서는 이미 보장이 된다.
    
    2차 풀이
    1. Set에 상근이의 카드를 모두 입력한다.
    2. 전체 카드의 숫자를 가지고 있는 arrTotalCard를 반복하면서 이 배열의 요소가 1번에서 입력한 set에 존재하면 1출력
    아니면 0 출력.
   
*/

이분 탐색으로 풀었으면 더 어려웠겠지?

Leave a comment