728x90
1. 문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
2. 풀이
배열 활용
- 숫자의 범위가 -10,000,000부터 10,000,000까지이므로 그 두배+1만큼 배열 크기를 정했다.
- 입력받은 값+10000000 위치에 접근해서 +1 한다.
- 찾을 정수가 주어지면 정수+10000000을 해서 인덱스를 찾아 그 값을 출력한다.
import java.io.*;
import java.util.*;
public class BOJ_10816_숫자카드2 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(in.readLine());
int[] cards = new int[20000001];
st = new StringTokenizer(in.readLine());
for(int i=0;i<N;i++) cards[Integer.parseInt(st.nextToken())+10000000]++;
int M = Integer.parseInt(in.readLine());
st = new StringTokenizer(in.readLine());
for(int i=0;i<M;i++) sb.append(cards[Integer.parseInt(st.nextToken())+10000000]).append(" ");
System.out.println(sb);
}
}
Map 활용
- 상근이 카드 숫자를 key값, 몇 번 나왔는지 세는 카운트를 value로 삼아 map에 넣는다. 단, 이미 키값이 있을 경우 저장된 카운트+1을 한 뒤 map에 다시 저장한다.
- 없다면 새로 저장한다. (카운트=1)
- 검색할 정수를 입력받으면 그 키값으로 접근해 카운트를 출력한다.
import java.io.*;
import java.util.*;
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;
int n = Integer.parseInt(br.readLine());
Map<Integer,Integer> cards = new HashMap<>();
st = new StringTokenizer(br.readLine()," ");
for(int i=0;i<n;i++) {
int num = Integer.parseInt(st.nextToken());
Integer cnt = cards.get(num);
if(cnt != null) {
cards.put(num, cnt+1);
} else {
cards.put(num, 1);
}
}
int m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine()," ");
for(int i=0;i<m;i++) {
int num = Integer.parseInt(st.nextToken());
Integer cnt = cards.get(num);
if(cnt != null) sb.append(cnt+" ");
else sb.append("0 ");
}
System.out.println(sb);
}
}
3. 결과
아래가 Map, 위가 배열사용코드다. 메모리와 시간을 맞바꿨다. 취향따라 선택하면 될 것 같다!
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 11726 2xn 타일링 - JAVA (0) | 2022.03.19 |
---|---|
[BOJ] 1920 수 찾기 - JAVA (0) | 2022.03.18 |
[BOJ] 9095 1, 2, 3더하기 - JAVA (0) | 2022.03.17 |
[BOJ] 11053 가장 긴 증가하는 부분 수열 - JAVA (0) | 2022.03.16 |
[BOJ] 1912 연속합 - JAVA (0) | 2022.03.15 |
댓글