문제 : https://www.acmicpc.net/problem/1822

 

1822번: 차집합

첫째 줄에는 집합 A의 원소의 개수 n(A)와 집합 B의 원소의 개수 n(B)가 빈 칸을 사이에 두고 주어진다. (1 ≤ n(A), n(B) ≤ 500,000)이 주어진다. 둘째 줄에는 집합 A의 원소가, 셋째 줄에는 집합 B의 원소

www.acmicpc.net

문제 요약 : 주어진 집합의 차집합 출력

입력 출력
1 ≤ n(A), n(B) ≤ 500000
1 ≤ A[N], B[N] ≤ 2147483647

집합 A에는 속하지만 집합 B에는 속하지 않는 원소 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_1822.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30944271 cbkpar 1822 맞았습니다!! 176104KB 1316ms Java 11 1142B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int a,b,i,t;
		HashMap<Integer,Boolean> map = new HashMap<>();
		StringTokenizer st = new StringTokenizer(br.readLine());
		a = Integer.parseInt(st.nextToken());
		b = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		for(i=0;i<a;i++) map.put(Integer.parseInt(st.nextToken()),true);
		st = new StringTokenizer(br.readLine());
		for(i=0;i<b;i++) {
			t = Integer.parseInt(st.nextToken());
			if(map.containsKey(t)) map.remove(t);
		}
        ArrayList<Integer> arr = new ArrayList<Integer>();
        for(int k:map.keySet()) arr.add(k);
        Collections.sort(arr);
        sb.append(arr.size()+"\n");
        if(arr.size()!=0) for(int k:arr) sb.append(k+" ");
        System.out.println(sb);
	}
}

HashMap을 통해 A의 원소를 전부 넣어 준 뒤

B의 원소를 하나하나 확인하며 HashMap에 해당 원소가 있다면 해당 맵을 지워준다.

그 뒤 HashMap에 남은 원소를 ArrayList에 넣어 준 뒤 정렬하여 출력한다.

 

문제 : https://www.acmicpc.net/problem/3181

 

3181번: 줄임말 만들기

꿍은 만사가 귀찮아서 말을 하기도 귀찮아 한다. 그래서 하려는 말을 대신해줄 줄임말을 만들려고 하는데 나름 규칙을 만들었다. 하려는 말은 최소 하나 이상의 단어를 포함하는데 각 단어들은

www.acmicpc.net

문제 요약 : 만들어진 줄임말 출력

입력 출력
1 ≤ 문장 길이 ≤ 100
맨 앞 단어를 제외하고
'i', 'pa', 'te', 'ni', 'niti', 'a', 'ali', 'nego', 'no', 'ili'에 해당하는 문자 제외 후
각 단어의 맨 앞문자의 대문자 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_3181.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30902978 cbkpar 3181 맞았습니다!! 14228KB 124ms Java 11 924B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = new StringTokenizer(br.readLine());
		sb.append(st.nextToken().toUpperCase().charAt(0));
		while(st.hasMoreTokens()) {
			String str = st.nextToken();
			if(str.equals("i")) continue;
			if(str.equals("pa")) continue;
			if(str.equals("te")) continue;
			if(str.equals("ni")) continue;
			if(str.equals("niti")) continue;
			if(str.equals("a")) continue;
			if(str.equals("ali")) continue;
			if(str.equals("nego")) continue;
			if(str.equals("no")) continue;
			if(str.equals("ili")) continue;
			sb.append(str.toUpperCase().charAt(0));
		}
		System.out.println(sb);
	}
}

단순하게 단어 하나하나 확인하며 위에 해당하는 단어가 있을 경우 건너뛰며 탐색한다.

 

 

HashMap 사용 )

메모리는 줄어들었지만 처리 시간이 늘어났다.

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
31095515 cbkpar 3181 맞았습니다!! 14120KB 132ms Java 11 941B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = new StringTokenizer(br.readLine());
		sb.append(st.nextToken().toUpperCase().charAt(0));
		HashMap<String,Boolean> chk = new HashMap<String,Boolean>();
		chk.put("i", true);
		chk.put("pa", true);
		chk.put("te", true);
		chk.put("ni", true);
		chk.put("niti", true);
		chk.put("a", true);
		chk.put("ali", true);
		chk.put("nego", true);
		chk.put("no", true);
		chk.put("ili", true);
		while(st.hasMoreTokens()) {
			String str = st.nextToken();
			if(chk.containsKey(str)) continue;
			sb.append(str.toUpperCase().charAt(0));
		}
		System.out.println(sb);
	}
}

 

문제 : https://www.acmicpc.net/problem/1269

 

1269번: 대칭 차집합

첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어

www.acmicpc.net

문제 요약 : 주어진 집합 A와 B의 대칭 차집합 원소 개수 출력

입력 출력
1 ≤ A, B(원소 개수) ≤ 200000
1 ≤ A[N], B[N] ≤ 100000000
A, B의 대칭차집합 원소 개수 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_1269.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30840117 cbkpar 1269 맞았습니다!! 66516KB 612ms Java 11 821B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int a,b,i,s;
		HashMap<Integer,Boolean> map = new HashMap<>();
		StringTokenizer st = new StringTokenizer(br.readLine());
		s = a = Integer.parseInt(st.nextToken());
		b = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		for(i=0;i<a;i++) map.put(Integer.parseInt(st.nextToken()),true);
		st = new StringTokenizer(br.readLine());
		for(i=0;i<b;i++) {
			if(map.containsKey(Integer.parseInt(st.nextToken()))) {
				s--;
			}else {
				s++;
			}
		}
		System.out.println(s);
	}
}

S의 값을 집합 A의 개수로 초기값을 둔 뒤

HashMap을 이용하여 A의 원소를 모두 넣고

 

B의 원소를 차례대로 확인하며

HashMap에 해당 키가 있을 경우 S를 1 감소시키고

HashMap에 해당 키가 없을 경우 S를 1 증가시킨다.

 

예제 )

A = {1, 2, 4}

B = {2, 3, 4, 5, 6}

 

 

문제 : https://www.acmicpc.net/problem/11652

 

11652번: 카드

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -262보다 크거나 같고, 262보다 작거나 같다. 준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지

www.acmicpc.net

문제 요약 : 가장 많이 갖고 있는 카드 번호 출력

입력 출력
1 ≤ n(카드 수) ≤ 1000000
-2^62 ≤ 카드번호 ≤ 2^62
가장 많이 갖고 있는 카드 출력(개수 같을 경우 작은 수)

 

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_11652.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30645018 cbkpar 11652 맞았습니다!! 24820KB 332ms Java 11 655B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,i,m,k;
		long t,ans;
		n = Integer.parseInt(br.readLine());
		long[] arr = new long[n];
		for(i=0;i<n;i++) arr[i] = Long.parseLong(br.readLine());
		Arrays.sort(arr);
		t = ans = arr[0];
		m = k = 1;
		for(i=1;i<n;i++) {
			if(t==arr[i]) {
				k++;
			}else {
				t = arr[i];
				k = 1;
			}
			if(k>m) {
				m = k;
				ans = t;
			}
		}
		System.out.println(ans);
	}
}

카드를 받은 뒤 번호 순으로 정렬 한 뒤

같은 번호의 개수를 세며 계산해준다.

 

느린코드 )

HashMap을 사용하여 해당 번호에 대해 몇개 입력 받았는지 계산하는 알고리즘을 작성하였다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		Map<Long, Integer> map = new HashMap<Long, Integer>();
		int n,i,m;
		long t,ans;
		n = Integer.parseInt(br.readLine());
		for(i=0;i<n;i++) {
			t = Long.parseLong(br.readLine());
			if(map.containsKey(t)) {
				map.put(t,map.get(t)+1);
			}else {
				map.put(t,1);
			}
		}
		ans = Long.MAX_VALUE;
		m = 0;
		for(Long k : map.keySet()) {
			if(map.get(k)>m) {
				m = map.get(k);
				ans = k;
			}else if(map.get(k)==m) {
				ans = Math.min(ans, k);
			}
		}
		System.out.println(ans);
	}
}

+ Recent posts