문제
☆백준 풀면서 가장 스토리가 신선하고 매력적인 문제
1. 첫줄
N : 도감에 주어지는 포켓몬 수
M : 찾아야할 포켓몬 수
2. 두 번째 줄 ~ N+1번째 줄 (총 N개의 줄)
N개의 포켓몬 이름
3. N+2 ~ 끝 줄 (총 M개의 줄)
찾아야 할 포켓몬의 번호 혹인 이름 (문자열)
문제 링크 : https://www.acmicpc.net/problem/1620
원리
: 사실 결과를 구할수 있느냐보다는, 제한 된 시간안에 출력이 되느냐가 더 관건인 문제 (약 2초)
풀이방법
: 세 방법 모두 정상적으로 기능 하지만, 3번만 시간안에 통과가 가능함
1. ArrayList + try~catch
2. HashMap + 이중반복
3. 이중 HashMap
나의 코드
1. ArrayList + try~catch 사용방법 [ 시간초과 ]
ArrayList에 포켓몬이름을 담고, try~catch문으로 숫자인지 판별.
ArrayList의 1번 인덱스부터 세기위해 0번 인덱스에는 이다솜씨 넣어드림
숫자일 경우, 해당 인덱스의 포켓몬 출력
문자일 경우, 해당 문자열의 인덱스 출력
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class no1620 {
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 = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
List<String> list = new ArrayList<>();
list.add("이다솜꺼");
while (N-->0) list.add(br.readLine());
while (M-->0) {
String pokemon = br.readLine();
try {
Integer pokeNum = Integer.parseInt(pokemon);
bw.write(""+list.get(pokeNum)+"\n");
} catch (NumberFormatException ne) {
bw.write(""+list.indexOf(pokemon)+"\n");
}
}
bw.close();
}
}
2. HashMap + 이중 반복 사용 방법 [ 시간초과 ]
HashMap에 순서 : 포켓몬 이름을 key : value로 둘다 문자열로 저장
HashMap의 키값 중 주어진 인덱스 값이 있으면 밸류(포켓몬이름) 출력
없으면, value값 중 포켓몬 이름과 일치하는 key값 출력
*이때, entry반복문에서 바로 출력하게 되면 계속 반복 출력하게 되므로 꼭 entry반복 밖에서 출력해야함
import java.io.*;
import java.util.*;
public class no1620 {
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 = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
Map<String, String> map = new HashMap<>();
for(int i =1 ; i <= N ; i++) map.put(String.valueOf(i), br.readLine());
while (M-->0) {
String pokemon = br.readLine();
String pokeNum = "";
if(map.containsKey(pokemon)) bw.write(map.get(pokemon)+"\n");
else {
for(Map.Entry<String, String> entry : map.entrySet()) {
if(entry.getValue().equals(pokemon)) pokeNum = entry.getKey();
}
bw.write(pokeNum+"\n");
}
}
bw.close();
}
}
3. 이중 HashMap [ 성공 ]
key:value = 번호:이름 , key:value = 이름:번호 인 두개의 HashMap을 만든다.
*이때, 입력될 M개의 값이 몇개인지 확실하지 않으므로, M개를 형변환하지 않기위해 둘 다 String으로 함
M개를 반복하며 각 HashMap에 포함되어 있는지 확인하고, 맞춰서 출력
import java.io.*;
import java.util.*;
public class no1620 {
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 = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
Map<String, String> numMap = new HashMap<>();
Map<String, String> nameMap = new HashMap<>();
int count = 1;
while(N-->0) {
String cnt = String.valueOf(count);
String pokemon = br.readLine();
numMap.put(cnt, pokemon);
nameMap.put(pokemon, cnt);
count++;
}
while(M-->0) {
String pokemon = br.readLine();
String result = numMap.containsKey(pokemon) ? numMap.get(pokemon) : nameMap.get(pokemon);
bw.write(result+"\n");
}
bw.close();
}
}'알고리즘 저장소 (일반방식과 나만의 풀이) > JAVA' 카테고리의 다른 글
| [백준] no11047: 동전0 (0) | 2023.02.03 |
|---|---|
| [백준] no5430: AC (0) | 2023.02.02 |
| [백준] no1107: 리모컨 (0) | 2023.01.31 |
| [공식] 자료구조 공식 모음 (0) | 2023.01.30 |
| [공식] 팩토리얼 (Factorial) (0) | 2023.01.29 |