백준_1764번_듣보잡

임정민·2023년 2월 2일
3

알고리즘 문제풀이

목록 보기
33/173
post-thumbnail

코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67

문제

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

[나의 풀이]

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

public class Correct {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
		
        // 중복되는 값을 찾게되는 시간을 줄이기 위해
        // Map 자료구조의 key값으로 접근하는 방식 선택!
        Map<String,Integer> not_be_heard_seen = new HashMap<>();

        for (int i = 0; i < N; i++) {
            not_be_heard_seen.put(br.readLine(),1);
        }

        for (int i = 0; i < M; i++) {
            String input = br.readLine();
            if(not_be_heard_seen.keySet().contains(input))
            not_be_heard_seen.put(input,2);
        }

        List<String> ANS = new ArrayList<>();
		
        // Map 자료구조는 Entry로 분해해서 for문을 돌릴 수도 있다!
        for(Map.Entry<String, Integer> entry : not_be_heard_seen.entrySet()){
            if(entry.getValue()==2){
                ANS.add(entry.getKey());
            }
        }
        bw.write(ANS.size() + "\n");

        Collections.sort(ANS);

        for (int i = 0; i < ANS.size(); i++) {
            bw.write(ANS.get(i) + "\n");
        }

        bw.flush();

    }

}

이번 문제는 굉장히 쉬운 문제라고 생각했지만 여러번의 시간 초과 때문에 생각보다 오래 걸렸습니다...🐷🐷🐷

문제에서 요구하는 핵심 아이디어는 자료형 안의 원하는 요소 값을 찾는 시간을 줄이기 위해 Map 자료형을 활용하는 것이였고 순차적인 인덱스 접근이 아닌 Key or Value값으로 빠르게 탐색하는 방식으로 풀어야했습니다.🧐🧐🧐

아래 코드들은 이 요점을 파악하지 못하여 시간 초과가 난 두가지 풀이입니다.

// 1. 원하는 요소를 찾고자 Contains를 활용한 것이 원인이였습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Collections;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        LinkedList<String> be_heard = new LinkedList<>();
        for(int i=0;i<N;i++){
            be_heard.add(br.readLine());
        }

        Collections.sort(be_heard);

        int cnt = 0;
        for(int i=0;i<M;i++){
            String be_seen = br.readLine();
            if(be_heard.contains(be_seen)){
                bw.write(be_seen);
                bw.newLine();
                cnt++;
            }
        }

        System.out.println(cnt);

        bw.flush();
        
    }
    
}
// 2. 리스트1.removeAll(리스트2)을 활용하여 꽤 참신한 풀이라고 
// 생각했지만 이 또한 시간초과가 났습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class Try_remove_all {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        List<String> not_be_heard = new ArrayList<>();
        List<String> not_be_heard_origin = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            String input = br.readLine();

            not_be_heard.add(input);
            not_be_heard_origin.add(input);
        }

        List<String> not_be_seen = new ArrayList<>();
        for (int i = 0; i < M; i++) {
            not_be_seen.add(br.readLine());
        }

        not_be_heard.removeAll(not_be_seen);
        not_be_heard_origin.removeAll(not_be_heard);

        Collections.sort(not_be_heard_origin);

        int n = not_be_heard_origin.size();

        bw.write(n+"");
        bw.newLine();

        for(int i=0;i<n;i++){
            bw.write(not_be_heard_origin.get(i));
            bw.newLine();
        }

        bw.flush();

    }

}

이 정도 쉬운 문제도 파훼하는데에 오래 걸리는 것을 보면 한참 중에 한참 멀었다는 생각이 듭니다. 그래도 꿈이 있으니 화이팅 해보겠습니다!

감사합니다!💐💐💐

profile
https://github.com/min731

1개의 댓글

comment-user-thumbnail
2023년 2월 3일

👍

답글 달기