[Algorithm] 🎴白駿10816デジタルカード2
0、問題
デジタルカードは整数と書かれたカードです.尚根にはN枚のデジタルカードがあります.整数M個を指定する場合は、この数が書かれた数値カードがルートに何個あるかを求めるプログラムを作成します.
入力
1行目には、上位のデジタルカードの個数N(1≦N≦500000)が与えられる.2行目には、数値カードの整数が表示されます.デジタルカードに書かれている数字は-1000000以上、1000000未満です.
3行目はM(1≦M≦500000)を与える.4行目には、上のルートがいくつかの数値カードであることを求めるためにスペースで区切られたM個の整数が与えられる.この数-1000000以上、1000000未満です.
しゅつりょく
1行目に入力したM個の数字については、各数字が書かれた数字カードをスペースで区切って出力します.
1.アイデア
HashMapの使用
💡 キー値としてカードの数字を使用
💡 最初の数字はvalue 1に格納され、すでに現れた数字はvalue+1に格納されます.
💡 mの数字がキー値であるかどうかを確認し、valueを出力します.
2.コア解答
1)最初の数字はvalue 1に格納され、出現した数字はvalue+1に格納される
if(map.containsKey(num)) {
map.put(num,map.get(num)+1);
} else {
map.put(num, 1);
}
2)mの数字がキー値かどうかをチェックし、valueを出力するif(map.containsKey(num))
sb.append(map.get(num));
else
sb.append("0");
sb.append(" ");
3.コード
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Hash_3 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
HashMap<Integer, Integer> map = new HashMap<>();
String[] s = br.readLine().split(" ");
for(int i=0; i<n; i++) {
int num = Integer.parseInt(s[i]);
if(map.containsKey(num)) {
map.put(num,map.get(num)+1);
} else {
map.put(num, 1);
}
}
int m = Integer.parseInt(br.readLine());
s = br.readLine().split(" ");
StringBuilder sb = new StringBuilder();
for(int i=0; i<m; i++) {
int num = Integer.parseInt(s[i]);
if(map.containsKey(num))
sb.append(map.get(num));
else
sb.append("0");
sb.append(" ");
}
System.out.println(sb.toString());
}
}
4.結果
成功
最初はシステムでした.out.println(map.get(num)+")にタイムアウトが発生しました.
+""演算には多くの時間がかかります.
これからはStringBuilderかBufferedWriterを活用して...
Reference
この問題について([Algorithm] 🎴白駿10816デジタルカード2), 我々は、より多くの情報をここで見つけました https://velog.io/@kha0318/Algorithm-백준-10816-숫자-카드-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol