Bakejoon/Silver

[Java] 백준 10815번 : 숫자카드 <Silver 5>

chattymin 2022. 6. 28. 00:47
728x90
반응형

⚠️ 내맘대로 작성한 코드이기 때문에 비합리적 진행과 근거없는 추론이 있을 수 있습니다!⚠️

 

https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

Code


import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
    Scanner scanner = new Scanner(System.in);

    int n, m;
    Set<Integer> nList = new HashSet<>();
    ArrayList<Integer> mList = new ArrayList<>();

    void run(){
        n = scanner.nextInt();
        for(int i = 0 ; i < n; i++){
            nList.add(scanner.nextInt());
        }

        m = scanner.nextInt();
        for(int i = 0; i<m; i++){
            if(nList.contains(scanner.nextInt())){
                mList.add(1);
            }
            else{
                mList.add(0);
            }
        }

        print();
    }

    void print(){
        for(Integer mList : mList){
            System.out.print(mList + " ");
        }
    }

    public static void main(String[] args) {
        Main my = new Main();
        my.run();
    }
}

Code 필수 요소

1. 두 카드 비교 방법

2. 속도 향상 방법

 

이것만 생각해내면 절반은 끝났다.

 

// 두 카드 비교 방법

두 카드들을 리스트를 이용해서 목록에 저장 시킨 후, 두 요소를 비교하면 된다. 

 

// 속도 향상 방법

처음에는 두개의 리스트를 이용해서 contains를 이용해서 값이 존재하는지 비교하려 했다. 근데 시간 초과 뜨더라. 그래서 리스트보다 속도가 빠른 맵을 이용해서 비교했다. 

 

// 전체적 설명

n을 입력 받은 후 그 횟수만큼 for문을 사용하고, map에 넣어준다. m도 입력받은 후 for문을 사용한다. 이때, if문 내부에 nList 내부에 값을 포함하고 있는지 contains를 사용해서 존재한다면 1을 add하고, 아니라면 0을 add한다. 그 후 출력시켜주면 끝.

 

알고리즘 자체는 정말 쉬웠다. 근데 골머리 썩은건 시간 초과. 리스트랑 리스트를 하니까 시간초과나서 해결방법 고민하는데 시간을 좀 많이 썼다. 그래서 List보다 빠른 map을 사용했고, 해결했다. 다 끝내고 다른 사람들 코드를 보니까 n을 정렬한 후 이분탐색으로 해결하더라. 오... 생각도 못했다ㅎ

 

 

-꿑-

728x90
반응형