두 map의 key와 value를 모두 비교해서 boolean을 반환해주는 메소드.
✏️ 문제
* 설명
현수의 아빠는 제과점을 운영합니다. 현수아빠는 현수에게 N일 동안의 매출기록을 주고,
연속된 K일 동안의 매출액의 종류를 각 구간별로 구하라고 했습니다.
만약 N=7이고 7일 간의 매출기록이 아래와 같고, 이때 K=4이면
20 12 20 10 23 17 10
각 연속 4일간의 구간의 매출종류는
첫 번째 구간은 [20, 12, 20, 10]는 매출액의 종류가 20, 12, 10으로 3이다.
두 번째 구간은 [12, 20, 10, 23]는 매출액의 종류가 4이다.
세 번째 구간은 [20, 10, 23, 17]는 매출액의 종류가 4이다.
네 번째 구간은 [10, 23, 17, 10]는 매출액의 종류가 3이다.
N일간의 매출기록과 연속구간의 길이 K가 주어지면 첫 번째 구간부터 각 구간별
매출액의 종류를 출력하는 프로그램을 작성하세요.
* 입력
첫 줄에 N(5<=N<=100,000)과 K(2<=K<=N)가 주어집니다.
두 번째 줄에 N개의 숫자열이 주어집니다. 각 숫자는 500이하의 음이 아닌 정수입니다.
* 출력
첫 줄에 각 구간의 매출액 종류를 순서대로 출력합니다.
🔍풀이
HashMap의 key값으로 중복되는 값의 개수를 value로 넣어주고, two pointer를 이용해서 sliding window로 밀고가며 확인한다.
public ArrayList<Integer> solution(int n, int k, int[] arr){
ArrayList<Integer> answer = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0; i<k-1; i++){
map.put(arr[i], map.getOrDefault(map.get(arr[i] ,0)+1);
}
int li=0;
for(rt=k+1; rt<n; rt++){
map.put(arr[rt], map.getOrDefault(map.get(arr[rt]) ,0)+1);
answer.add(map.size());
map.put(arr[lt], map.get(arr[lt])-1);
if(map.get(arr[lt] == 0) map.remove(arr[lt]);
lt++;
}
return answer;
}
✏️ 문제
* 설명
S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을
작성하세요.
아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다.
* 입력
첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다.
S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다.
* 출력
S단어에 T문자열과 아나그램이 되는 부분문자열의 개수를 출력합니다.
🔍풀이
두 개의 hashMap을 만든 뒤, equals로 비교한다.
b.length-1 까지 담아준 뒤, for문에서 1.담고 2.비교 3.빼기 를 반복하여
two pointers와 sliding window를 이용한다.
public int solution(String a, String b) {
int answer = 0;
HashMap<Character, Integer> aMap = new HashMap();
HashMap<Character, Integer> bMap = new HashMap();
for(char c : b.toCharArray()) bMap.put(c, bMap.getOrDefault(c, 0)+1);
int L = b.length()-1;
for(int i = 0; i < L; i++) aMap.put(a.charAt(i), aMap.getOrDefault(a.charAt(i), 0)+1);
int lt = 0;
for(int rt = L; rt < a.length(); rt++){
aMap.put(a.charAt(rt), aMap.getOrDefault(a.charAt(rt), 0)+1);
if(aMap.equals(bMap)) answer++;
aMap.put(a.charAt(lt), aMap.get(a.charAt(lt))-1);
if(aMap.get(a.charAt(lt)) == 0) aMap.remove(a.charAt(lt));
lt++;
}
return answer;
}