반응형
매주 토요일이면 충남대 할리스를 가서 공부를 하는데,
옆에서 지연이가 어떤 문제를 보며 해시맵 어렵다고 하여
나도 알려달라고 해 풀어보았다.
그동안 백준/SWEA에서 문제 풀면서
해시맵을 쓴 적이 없었던 것 같은데, 좋은 경험이 되었다.
1. 문제 출처
문제 번호를 쳐도 나오지 않는 문제 ...
오늘도 역시 실패한 설계와 성공한 설계를 둘 다 쓸 것이다.
2. 설계
1) 실패한 설계
해시맵으로 포켓몬 번호와 이름을 저장해서 퀴즈에 포켓몬 번호가 들어오면 해시맵의 get을 이용하여 바로 포켓몬 이름을 찾게 했다. 근데, 포켓몬 이름을 입력받았다면, 해시맵의 정보를 모두 돌면서 같은 이름을 가진 포켓몬을 잡아내어 포켓몬 번호를 출력하게 했다.
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();//포켓몬 개수
int M = sc.nextInt();//내가 맞춰야 하는 문제 개수
//포켓몬 정보 받기
HashMap<Integer,String> pocketmon = new HashMap<>();
for(int i=1;i<=N;i++) {
pocketmon.put(i, sc.next());
}
//퀴즈 시작
for(int test=1;test<=M;test++) {
String ans = sc.next();
if(isnum(ans)) {
int num_ans = Integer.parseInt(ans);
System.out.println(pocketmon.get(num_ans));
}else {
for(Map.Entry<Integer, String> entry : pocketmon.entrySet()) {
if(entry.getValue().equals(ans)){
System.out.println(entry.getKey());
break;
}
}
}
}//퀴즈 끝
}
public static boolean isnum(String ans) {
try {
Integer.parseInt(ans);
}catch(NumberFormatException e) {
return false;
}
return true;
}
}
1%에서 시간 초과가 났다.
2) 성공한 설계
그리하여 나는 메모리를 좀 더 써가며 시간을 절약하고자 했다. 바로 해시맵 2개를 쓰는 방안이다. 즉, get 메서드를 적극 활용하겠다는 의미다. 하나의 해시맵은 포켓몬 번호를 키(pocketmonNum)로 갖고, 하나의 해시맵은 포켓몬 이름을 키(pocketmonName)을 키로 갖게 했다.
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();//포켓몬 개수
int M = sc.nextInt();//내가 맞춰야 하는 문제 개수
//포켓몬 정보 받기
HashMap<Integer,String> pocketmonNum = new HashMap<>();
HashMap<String,Integer> pocketmonName = new HashMap<>();
for(int i=1;i<=N;i++) {
String name = sc.next();
pocketmonNum.put(i, name);
pocketmonName.put(name, i);
}
//퀴즈 시작
for(int test=1;test<=M;test++) {
String ans = sc.next();
if(isnum(ans)) {
int num_ans = Integer.parseInt(ans);
System.out.println(pocketmonNum.get(num_ans));
}else {
System.out.println(pocketmonName.get(ans));
}
}//퀴즈 끝
}
public static boolean isnum(String ans) {
try {
Integer.parseInt(ans);
}catch(NumberFormatException e) {
return false;
}
return true;
}
}
3. 전체 코드
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();//포켓몬 개수
int M = sc.nextInt();//내가 맞춰야 하는 문제 개수
//포켓몬 정보 받기
HashMap<Integer,String> pocketmonNum = new HashMap<>();
HashMap<String,Integer> pocketmonName = new HashMap<>();
for(int i=1;i<=N;i++) {
String name = sc.next();
pocketmonNum.put(i, name);
pocketmonName.put(name, i);
}
//퀴즈 시작
for(int test=1;test<=M;test++) {
String ans = sc.next();
if(isnum(ans)) {
int num_ans = Integer.parseInt(ans);
System.out.println(pocketmonNum.get(num_ans));
}else {
System.out.println(pocketmonName.get(ans));
}
}//퀴즈 끝
}
public static boolean isnum(String ans) {
try {
Integer.parseInt(ans);
}catch(NumberFormatException e) {
return false;
}
return true;
}
}
해시맵 쓰는 방법 외에도 숫자의 입력값이 들어오는지, 문자열 값이 들어오는지 판단해주는 함수를 작성해보는 것도 써보아서 좋았다.
이제 시험 공부 하러 가볼까...
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[그래프] 백준 1068번 트리 - JAVA (0) | 2023.04.26 |
---|---|
[BFS] 백준 1349번 숨바꼭질3 - JAVA (0) | 2023.04.24 |
[Queue/구현] 백준 11866번 요세푸스 문제 0 - JAVA (반복문/큐 2가지 풀이) (0) | 2023.04.15 |
[BFS] 백준 7569번 토마토 - JAVA (3차원을 곁들인 토마토) (2) | 2023.04.14 |
[BFS] 백준 7576번 토마토 - JAVA (0) | 2023.04.13 |