자바생
Published 2021. 1. 13. 21:06
자바(백준) 2776 암기왕 BOJ(Java)
728x90
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package Binary_Search;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
    static int note[];
    static StringBuilder sb = new StringBuilder();
    static Map<Integer, Integer> noteMap;
 
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        int test = Integer.parseInt(st.nextToken());
        int n,m;
 
 
        for(int i = 0; i < test; i++){
            st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            note = new int[n];
            noteMap = new HashMap<>();
 
            st = new StringTokenizer(br.readLine());
 
            for(int j = 0; j < n; j++){
                int num = Integer.parseInt(st.nextToken());
                note[j] = num;
                if(!noteMap.containsKey(num))
                    noteMap.put(num,1);
            }
 
            Arrays.sort(note);
 
            st = new StringTokenizer(br.readLine());
            m = Integer.parseInt(st.nextToken());
 
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < m; j++){
                int num = Integer.parseInt(st.nextToken());
                binarySearch(num);
            }
        }
 
        System.out.print(sb);
    }
    //1. noteSet에 수첩 1의 데이터를 저장
    //2. 그다음에 noteSet을 배열로 만들고 정렬하기
    //3. 수첩2의 데이터를 binarySearch 메소드에 한개씩 넣기
    //4. sb에 1 또는 0을 넣기
    //-------------------------문제에서 int범위로 사용하기 때문에 set을 array로 바꾸지못함
    //-------------------------왜냐하면 set을 배열로 바꾸려고 하면 array 자료형이 Integer가 되어야함
    //1. note 배열에 수첩1 데이터 저장
    //2. noteMap에 note배열들의 자료들을 저장 --> 왜냐하면 중복이 있을 수 있으므로 
    //3. note 데이터를 정렬하고 binarySearch에 수첩2 데이터를 넣기
    //3-1. binarySearch에는 인자로 들어있는 num이 noteMap에 포함되어있는 key라면 그 때 1을 반환하게 하면 됨.
    public static void binarySearch(int num){
        int st,ed,mid;
        st = 0;
        ed = note.length-1;
        while(st <= ed){
            mid = (st + ed) / 2;
            if(noteMap.containsKey(num)){
                sb.append(1 + "\n");
                return;
            }
            else if(note[mid] > num) ed = mid - 1;
            else st = mid + 1;
        }
        sb.append(0 + "\n");
    }
}
 
cs

처음에 이 문제를 풀 때 중복이 되는지 안되는지 확인을 하지 않고 일반적인 이분탐색 문제라고 생각을 하고 풀었지만 당연하게 바로 틀렸다. 그래서 왜 틀렸나 보니, 내가 풀었던 문제들(ex 숫자 찾기)는 중복되지 않는다고 미리 전제로 깔아놓았지만 이 문제는 중복 얘기를 하지 않았다. 그래서 중복이 나올 수 있다는 가정을 생각하고 처음에는 Set 컬렉션에 데이터를 집어넣은 뒤, Set 컬렉션을 Array로 바꾸어서 문제를 풀면 되겠다고 생각했다. 하지만 제출을 하고 난 뒤, 런타임 에러가 떴고, 왜 떴는지 자세히 보니 문제에서 int형을 다룬다고 쓰여있다고 했다. 그러면 set을 쓰지 말라는 건가?라고 생각이 들었다. 그러면 어떻게 중복되는 데이터를 빼낼 수 있을까라는 생각을 하였다. 거기서 HashMap이 생각이 났다. HashMap에 원래의 데이터를 넣고, 데이터가 존재하지 않을 경우에 데이터를 넣는다. 그리고 binarySearch 메소드에서 이 숫자가 있는지 없는지 판별하기 위해서, noteMap에 key로 num이 있는지 없는지 확인만 하면 중복을 빼낼 수 있다.

728x90

'BOJ(Java)' 카테고리의 다른 글

자바(백준) 2512 예산  (0) 2021.01.15
자바(백준) 2805 나무 자르기  (0) 2021.01.14
자바(백준) 10816 숫자 카드2  (0) 2021.01.13
자바(백준) 10815 숫자 카드  (0) 2021.01.13
자바(백준) 1764 듣보잡  (0) 2021.01.13
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그