728x90
🎈섹션2. 해싱 & 시간 파싱 알고리즘 - (1)
🟦 2-1. 한 번 사용한 최초 문자
코드
- HashMap<문자, 빈도수> 저장해야 한다.
- map.getOrDefault() 사용해서 문자가 중복없이 카운팅 되도록 해야 함
- 다시 i로 전체 길이 순회하면서 i번째 문자(key) 기준으로 get 한 value가 1인 경우 해당 i+1을 곧장 리턴해주어야 한다.
// 2-1. 한 번 사용한 문자
import java.util.*;
class Solution1 {
//솔루션 함수
public int solution(String s){
//각 문자, 빈도수
HashMap<Character, Integer> map = new HashMap<>();
//각 문자별 빈도수 카운팅
for(char x : s.toCharArray()) {
//맵에 담되, 중복 없이 담음
map.put(x, map.getOrDefault(x, 0) + 1);
}
//i를 길이만큼 순회하면서
for(int i=0; i<s.length(); i++) {
//만약 맵에 각 i번째 문자 (key)값 기준으로 value를 가져왔더니 1이면 리턴함
if(map.get(s.charAt(i)) == 1) return i+1;
}
return -1;
}
//실행 메인
public static void main(String[] args){
Solution1 T = new Solution1();
System.out.println(T.solution("statitsics"));
System.out.println(T.solution("aabb"));
System.out.println(T.solution("stringshowtime"));
System.out.println(T.solution("abcdeabcdfg"));
}
}
🟦 2-2. 같은 빈도수 만들기
첫 시도
- map.get(s.charAt(i)) 로 값을 가져오면 안됨
- map.getOrDefault(key, 0) 으로 가져와야 없는 문자도 0으로 뽑아옴
- abcde 순서대로 필요한 개수 가져와야 하므로 tmp를 만들었어야 함 ..
/* 2-2. 같은 빈도수 만들기 */
import java.util.*;
class Solution2 {
//솔루션 함수
public int[] solution(String s){
int[] answer = new int[5];
HashMap<Character, Integer> map = new HashMap<>();
//일단 담고 카운팅
for(char x: s.toCharArray()) {
map.put(x, map.getOrDefault(x, 0)+1);
}
int max = Integer.MIN_VALUE;
//전체 탐색하면서 max 길이만틈 담고
for(int i=0; i<s.length(); i++) {
if(max < map.get(s.charAt(i))) max = s.charAt(i);
}
//빈도수 맞지 않는 애들에 대하여.
for(int i=0; i<s.length(); i++) {
if(map.get(s.charAt(i)) != max) {
//최대 - 기존값
int tmp = map.get(s.charAt(i));
answer[i] = max- tmp;
}
answer[i] = 0;
}
return answer;
}
//실행 메인
public static void main(String[] args){
Solution2 T = new Solution2();
System.out.println(Arrays.toString(T.solution("aaabc")));
System.out.println(Arrays.toString(T.solution("aabb")));
System.out.println(Arrays.toString(T.solution("abcde")));
System.out.println(Arrays.toString(T.solution("abcdeabc")));
System.out.println(Arrays.toString(T.solution("abbccddee")));
}
}
완성 코드
/* 2-2. 같은 빈도수 만들기 */
import java.util.*;
class Solution2 {
//솔루션 함수
public int[] solution(String s){
int[] answer = new int[5];
HashMap<Character, Integer> map = new HashMap<>();
//일단 담고 카운팅
for(char x: s.toCharArray()) {
map.put(x, map.getOrDefault(x, 0)+1);
}
int max = Integer.MIN_VALUE;
//이 순서대로 answer 담아야 하므로
String tmp = "abcde";
for(char key : tmp.toCharArray()) {
//없는 문자가 있어도 기본으로 0이라도 반환함
if(map.getOrDefault(key, 0) > max) {
max = map.getOrDefault(key, 0);
}
}
//정답 세팅
for(int i =0; i<tmp.length(); i++) {
//맵 내부 순회하면서 abcde 순서대로 각 (max-빈도수)필요한 추가 개수 가져오되
// 없으면 0 반환하도록
answer[i] = max - map.getOrDefault(tmp.charAt(i), 0);
}
return answer;
}
//실행 메인
public static void main(String[] args){
Solution2 T = new Solution2();
System.out.println(Arrays.toString(T.solution("aaabc")));
System.out.println(Arrays.toString(T.solution("aabb")));
System.out.println(Arrays.toString(T.solution("abcde")));
System.out.println(Arrays.toString(T.solution("abcdeabc")));
System.out.println(Arrays.toString(T.solution("abbccddee")));
}
}
728x90
'알고리즘 이론 [개념] > [개념] 코테 알고리즘 공부 - 시즌 2' 카테고리의 다른 글
섹션2. 해싱 & 시간 파싱 알고리즘 - (3) (0) | 2023.04.26 |
---|---|
섹션2. 해싱 & 시간 파싱 알고리즘 - (2) (0) | 2023.04.24 |
섹션1. 시뮬레이션 & 구현 - (3) | 과일 가져가기 문제 풀이 (0) | 2023.04.19 |
섹션1. 시뮬레이션 & 구현 - (2) (1) | 2023.04.14 |
섹션1. 시뮬레이션 & 구현 - (1) | 사다리타기, 로봇 문제 풀이 (0) | 2023.04.10 |