if: magazine, ransomNote의 문자가 1개이고 둘이 같지 않다면
-> return false
map1 : ransomNote <- 문자열과 개수 저장
map2 : magazine <- 문자열과 개수 저장
for(map1.keySet()){
if: map2에 map1의 key가 없거나, map1이 가지고 있는 문자열의 개수가 map2보다 많다면
-> return false;
}
return true;
class Solution {
public boolean canConstruct(String note, String maga) {
if(note.length() + maga.length() == 2 && !note.equals(maga)){
return false;
}
Map<Character, Integer> map1 = new HashMap<>(note.length());
Map<Character, Integer> map2 = new HashMap<>(maga.length());
for(char c : note.toCharArray()){
map1.put(c, map1.getOrDefault(c, 0) + 1);
}
for(char c : maga.toCharArray()){
map2.put(c, map2.getOrDefault(c, 0) + 1);
}
for(char c : map1.keySet()){
if(map2.get(c) == null){
return false;
}
if(map2.get(c) < map1.get(c)){
return false;
}
}
return true;
}
}
시간 복잡도: O(n)
공간 복잡도 : O(n)
O(m*n)
O(1)
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if(ransomNote.length() > magazine.length())
return false;
int letters[] = new int[26];
for(int i = 0;i < ransomNote.length(); i++) {
char ch = ransomNote.charAt(i);
int index = magazine.indexOf(ch, letters[ch-'a']); // ch가 이전에 사용한 마지막 위치 이후부터 등장하는 첫번째 위치를 찾는다.
if(index == -1) //존재하니 않는다면
return false;
letters[ch-'a'] = index + 1; // 다음에 등장할 경우 이 인덱스 다음부터 탐색한다.
}
return true;
}
}
- 아스키코드와 배열을 활용하여 문제를 해결하는 방법도 있다는 것을 알게 됐습니다.
- String의 indexOf 메서드 활용 방법을 학습했습니다.