티스토리 뷰
leetcode.com/problems/find-the-difference/
그렇게 어려운 문제는 아니었다.
s 문자열에서 임의의 문자를 하나 추가해서 셔플링시킨 t 문자열을 보고 어떤 문자가 추가된건지 return 해주는 문제다.
하나하나 대조하면서 찾으려면 O(N^2) 이 걸리니까 Linear 하게 풀 수 있는 아이디어가 필요했음
일단 소문자 a-z 로 제한이 되니까 a-z 를 index 삼아서 s 에 있는 문자들을 counting 하고
t 에 있는 문자열을 돌면서 counting 된게 없으면 그 문자를 리턴해주도록 했다.
public static char findTheDifference(String s, String t) {
int[] letter = new int[26];
char c = 0;
for (int i = 0; i < s.length(); i++) {
letter[s.charAt(i) - 'a']++;
}
for (int i = 0; i < t.length(); i++) {
c = t.charAt(i);
if (letter[c - 'a'] == 0) {
break;
} else {
letter[c - 'a']--;
}
}
return c;
}
더 최적화 할 방법이 있나? 시간복잡도는 O(N) 이 최적인것 같다. 어차피 한번은 훑어봐야 하니까
공간복잡도를 최적화 시켜보자. 기본 아이디어는 아래와 같다.
s 와 t 는 다른 문자가 1개 존재한다.
그럼 나머지 문자는 다 같다. 같으면 무시하는 로직이 뭐가 있지? XOR 개념이다
s : "ab"
t : "abc" 일 때
a ^ a ^ b ^ b ^ c 를 하면 c만 남는다 두개씩 나온건 다 0으로 돌아가니까.
같은거 판단하는 로직은 XOR을 자주 쓰니까 기억해야지
최종 코드는 아래와 같다. 한번씩 돌면서 전체 문자를 XOR 시켜주면 남는 캐릭터만 리턴해준다
public static char findTheDifference2(String s, String t) {
char c = 0;
for(int i = 0; i < t.length(); i++) { c ^= t.charAt(i); }
for(int i = 0; i < s.length(); i++) { c ^= s.charAt(i); }
return c;
}
끄읏
'Computer Science > 알고리즘' 카테고리의 다른 글
[Leetcode] Teemo Attacking (0) | 2020.09.28 |
---|---|
[Leetcode] Largest Number (2) | 2020.09.28 |
[Leetcode] Car Pooling (1) | 2020.09.22 |
[Leetcode] Multiply Strings (0) | 2020.09.15 |
[정올] 순서찾기 (문제번호 : 2437) (0) | 2020.02.17 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- gRPC
- Redis
- excel parsing
- 스프링 시큐리티
- 카르다노
- leetcode
- architecture
- 알고리즘
- 암호화폐
- 사토시 나가모토
- Blockchain
- 블록체인
- Spring
- 백준
- SpringBoot
- CARDANO
- Bitcoin
- Nealford
- Bruteforce
- DP
- vuejs
- 동적계획법
- white paper
- k8s
- 아키텍처
- 스프링
- kubernetes
- Vue.js
- Java
- 비트코인
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함