일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 코틀린기초
- 프로그래머스 java
- 백준 1197번 최소 스패닝 트리 - java
- Java
- 백준 1647번 도시 분할 계획 - java
- 백준 1043번 거짓말 - java 분리 집합
- HashMap
- 백준 14938번 서강그라운드
- 프로그래머스
- toUpperCase
- dp
- ac 5430번
- HashSet
- map
- hash
- 백준 1806번 부분합 java
- 백준 1541
- Stack
- 최소 힙 1927
- kotlin
- 18111번 마인크래프트 - java 구현
- 프로그래머스 자바
- append
- 백준 2473번 세 용액 - java
- 백준 3190번
- StringBuilder
- replace()
- mysql hy000 에러
- StringTokenizer
- 백준 2467번 용액 자바 - 이분탐색
- Today
- Total
말하는 컴공감자의 텃밭
알고리즘 재활 1일차 - 백준 1620, 10828, 1764번 본문
오랜만에 알고리즘이라 재활치료 시작합니다..
Boj 1620 나는야 포켓몬 마스터 이다솜
포켓몬 도감이 들어온다.
1번 피카츄~
2번 파이리~
...
이후 숫자가 주어지면 해당 번호의 포켓몬이 무엇인지
포켓몬 이름이 주어진다면 도감 번호가 무엇인지 출력해야한다.
빠르게 Map<> 구조를 떠올려주고, 중복이 없으니 hash를 생각했다
다만 key로 value 조회는 수월하지만, value로 key를 찾는건 다소 비효율적이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.StringTokenizer; public class Main { // S4 1620 나는야 포켓몬 마스터 다솜이 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); HashMap<String, String> poketmon = new HashMap<>(); for (int i = 1; i <= N; i++) { poketmon.put(br.readLine(), String.valueOf(i)); } for (int i = 0; i < M; i++) { String cmd = br.readLine(); if (poketmon.containsKey(cmd)) { sb.append(poketmon.get(cmd)); sb.append("\n"); } else { sb.append(getkey(poketmon, cmd)); sb.append("\n"); } } System.out.println(sb); } public static <K, V> K getkey(HashMap<K, V> map, V value) { for (K key : map.keySet()) { if (value.equals(map.get(key))) { return key; } } return null; } } | cs |
처음에 보자마자 풀었던 방식은
Map에 모든 벨류를 뒤져가며 찾아주었는데 이러니 시간 초과가 발생했다.
도감이 무려 100,000이었자네
따라서 key-value 형태로 하나 만들어주고, 반대로 value-key 형태로 만들어줬다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import java.io.*; import java.util.*; public class Main { // S4 1620 나는야 포켓몬 마스터 다솜이 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); HashMap<String, String> nameToNumber = new HashMap<>(); HashMap<String, String> numberToName = new HashMap<>(); for (int i = 1; i <= N; i++) { String name = br.readLine(); String number = String.valueOf(i); nameToNumber.put(name, number); numberToName.put(number, name); } for (int i = 0; i < M; i++) { String cmd = br.readLine(); if (nameToNumber.containsKey(cmd)) { sb.append(nameToNumber.get(cmd)); } else { sb.append(numberToName.get(cmd)); } sb.append("\n"); } System.out.println(sb); } } | cs |
보다 빠르게 조회할 수 있게 됐다.하나의 Map에 같이 담아도 좋은 방법인것 같다
Boj 10828 스택
기본적인 스택구조 이해 문제이다.
스택에 대한 기본적인 이해와 메서드 이해만 있다면 단순 구현문제이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import java.io.*; import java.util.*; public class Main { // S4 10828 스택 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(st.nextToken()); Stack<Integer> stack = new Stack<>(); for (int i = 1; i <= N; i++) { st = new StringTokenizer(br.readLine()); String cmd = st.nextToken(); switch (cmd) { case "push": stack.push(Integer.parseInt(st.nextToken())); break; case "top": sb.append(stack.isEmpty() ? -1 : stack.peek()); sb.append("\n"); break; case "pop": sb.append(stack.isEmpty() ? -1 : stack.pop()); sb.append("\n"); break; case "empty": sb.append(stack.isEmpty() ? 1 : 0); sb.append("\n"); break; case "size": sb.append(stack.size()); sb.append("\n"); break; } } System.out.println(sb); } } | cs |
가볍게 해줍시다.
Boj 1764 듣보잡
한번 더 등장하는 파이리..
1번도 듣지 못한 이름 리스트와
1번도 보지 못한 이름 리스트가 들어온다.
두 리스트에 중복적으로 나오는 이름이라면 듣도 보도 못한거니까 듣보잡이다.
중복된 데이터가 없어야 하므로 HashSet 구조를 떠올려주고,
retainAll()이라는 메서드를 통해 두 Set에 중복된 데이터를 찾아 주었다.
이후엔 정렬해야 했기에 Collection.sort 로 마무리.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import java.io.*; import java.util.*; public class Main { // S4 1764 듣보잡 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); HashSet<String> neverSeen = new HashSet<>(); HashSet<String> neverHeard = new HashSet<>(); for (int i = 0; i < N; i++) { String name = br.readLine(); neverSeen.add(name); } for (int j = 0; j < M; j++) { String name = br.readLine(); neverHeard.add(name); } neverSeen.retainAll(neverHeard); List<String> answer = new ArrayList<>(neverSeen); Collections.sort(answer); sb.append(answer.size()); sb.append('\n'); for (int i = 0; i < answer.size(); i++) { sb.append(answer.get(i)); sb.append('\n'); } System.out.println(sb); } } | cs |
물론 간단하게 set 하나로 contain 상태면 리스트에 추가하는 방식으로도 가능하다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | import java.io.*; import java.util.*; public class Main { // 1764 듣보잡 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); HashSet<String> neverSeen = new HashSet<>(); List<String> names = new ArrayList<>(); for (int i = 0; i < N; i++) { neverSeen.add(br.readLine()); } for (int j = 0; j < M; j++) { String name = br.readLine(); // 여기서 듣보잡 검증 if (neverSeen.contains(name)) { names.add(name); } } Collections.sort(names); sb.append(names.size()).append('\n'); for (String name : names) { sb.append(name).append('\n'); } System.out.print(sb); } } | cs |
'알고리즘 > Backjoon - Java' 카테고리의 다른 글
알고리즘 재활 3일차 - 백준 15652, 2636번 (0) | 2024.07.31 |
---|---|
알고리즘 재활 2일차 - 백준 2751, 10814, 11726, 1074번 (0) | 2024.07.30 |
백준 1600번 말이 되고픈 원숭이 G3 - BFS (1) | 2024.04.27 |
백준 2206번 벽 부수고 이동하기 G3 - BFS (1) | 2024.04.23 |
백준 2660번 회장뽑기 G5 - BFS (3) | 2024.04.17 |