class Solution {
public boolean isIsomorphic(String s, String t) {
if (s.length() != t.length()) return false;
// 개수를 확인
HashMap<Character, Integer> sMap = new HashMap<>();
HashMap<Character, Integer> tMap = new HashMap<>();
for (int i = 0; i < s.length(); i++){
sMap.put(s.charAt(i), (sMap.getOrDefault(s.charAt(i), 0))+1);
tMap.put(t.charAt(i), (tMap.getOrDefault(t.charAt(i), 0))+1);
}
//개수비교
List<Integer> sValues = new ArrayList<>(sMap.values());
List<Integer> tValues = new ArrayList<>(tMap.values());
Collections.sort(sValues);
Collections.sort(tValues);
if (sValues.equals(tValues)){
return true;
}
return false;
}
}
처음에 이런식으로 풀었다가 복병을 만났다. 생각해보니 개수만 같으면 되는 게 아니라 위치도 같아야한다는 것이었다.
따라서 이런 접근법은 맞지 않았고, 바로 해시맵하나로 풀면 된다는 것을 알게되었다.
한번 시도해보자
class Solution {
public boolean isIsomorphic(String s, String t) {
if (s.length() != t.length()) return false;
// 개수를 확인
HashMap<Character, Character> mappingDict = new HashMap<>();
for (int i = 0; i < s.length(); i++){
char sChar = s.charAt(i);
char tChar = t.charAt(i);
// 1. key에 있고 값도 같은 경우 pass
// 2. key에 있는데 value가 다른 경우 || key가 없는데 value는 존재하는 경우 false
// 3. 둘다 없는 경우 put
if (mappingDict.containsKey(sChar) && mappingDict.get(sChar) == tChar){
continue;
}else if (!mappingDict.containsKey(sChar) && !mappingDict.containsValue(tChar)){
mappingDict.put(sChar, tChar);
}else{
return false;
}
}
return true;
}
}
완료!
위의 문제와 아주 유사한 문제이다.
class Solution {
public boolean wordPattern(String pattern, String s) {
// 개수를 확인
HashMap<Character, String> mappingDict = new HashMap<>();
String[] sArray = s.split(" ");
if (sArray.length != pattern.length()) return false;
for (int i = 0; i < pattern.length(); i++){
char patternChar = pattern.charAt(i);
String sWord = sArray[i];
if (mappingDict.containsKey(patternChar) && mappingDict.get(patternChar).equals(sWord)){
continue;
}else if (!mappingDict.containsKey(patternChar) && !mappingDict.containsValue(sWord)){
mappingDict.put(patternChar, sWord);
}else{
return false;
}
}
return true;
}
}
캐릭터형에서 문자열로 바꾸도록 변경한 후에 equals 로 비교할 수 있게 바꾸니 해결되었다.
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) return false;
HashMap<Character, Integer> anagram = new HashMap<>();
for (char sChar : s.toCharArray()){
anagram.put(sChar, anagram.getOrDefault(sChar, 0) + 1);
}
for (char tChar : t.toCharArray()){
if (!anagram.containsKey(tChar)) {
return false;
}else if (anagram.get(tChar) < 1){
return false;
}else{
anagram.put(tChar, anagram.get(tChar) - 1);
}
}
return true;
}
}
이 친구도 푸는데 큰 어려움은 없어서 패스
처음에 이 문제를 보고 너무 안 와닿아서 챗지피티랑 이것저것 질문을 했다. 계속 물어보니 HashMap의 형태를 조금바꾸면 된다는 것을 알 수 있었다. 우와
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> group = new HashMap<>();
for (String candidate : strs) {
char[] charArray = candidate.toCharArray();
Arrays.sort(charArray);
String key = new String(charArray);
group.putIfAbsent(key, new ArrayList<>());
group.get(key).add(candidate);
}
return new ArrayList<>(group.values());
}
}
완료!
--
요즘 꾸준히 뭔가를 해보려고 하고 있다. 대표적으로 운동과 독서를 하는 중인데, 어제 특이한 경험을 해서 뭔가뭔가한 마음으로 적어본다..
처음 운동할 때 엄청 힘들었던 운동 루틴이 있었다. 어제 시도했을 때는 그다지 힘들지 않았다. 그때에는 하다가 중간에 쉬기도 해야했고, 몇번 시도했다가 그만두기도 하고, 자세를 바르지 않게 했던 경험이 있었다. 그런데 꾸준히 다른 루틴을 운동하다가 오랜만에 그 루틴을 시도해봤는데 마지막까지 멈추지 않고 자세도 신경쓰면서 지속할 수 있었다. 꽤나 놀라웠다. 꾸준히 운동은 했지만 열심히는 하지 않았으니까. 그런데 이런 성과가 나올 줄은 몰랐다. 대충대충하더라도 결국 꾸준히 하는게 중요하다는 사실을 다시 느꼈다.
리트코드도 지금까지 약 3분의 1정도 와있다. 옛날에 한창 코테 준비하는 것보다 양이 꽤나 된다. 그때는 일주일에 40문제 풀고 그 뒤로 안봤는데, 2주가량 걸렸지만 40문제를 넘겼다. 꾸준히 남기는게 중요하니까 어떻게 해서든 꾸준히 해보자.
독서도. 오랜만에 책 읽었더니 5시간동안 읽어버렸다. 오랜만에 글 읽으니까 재밌었다. 그리고 도서관에 갔다가 저번에 재밌게 읽었던 수필을 찾아서 읽게 되었는데 기억 안나는 내용도 있었지만 전체적인 흐름을 알고 읽어서 재밌었다. 역시 명작은 다회독을 해야한다. 오랜만에 옛날에 감명깊게 봤던 작품의 명대사를 찍어논 이미지를 봤다. 근데 옛날과는 다른 방면으로 보이긴 했다. 명대사는 명대사지만.. 원래 찍으려고 했던 대사는 그게 아닌 것 같은데 그 위나 아래의 대사들이 더 마음에 와닿기도 하고.. 뭐든 깊게 이해하려면 여러번 시도해봐야하는 것 같다.
'공부용 > 연습장' 카테고리의 다른 글
[리트코드] 15일차 (0) | 2025.02.19 |
---|---|
[리트코드] 14일차 (0) | 2025.02.18 |
[리트코드] 12일차 (0) | 2025.02.16 |
리트코드 11일차 (0) | 2025.02.14 |
python 으로 mp3 다운로드 프로그램 작성하기 (0) | 2025.02.13 |