Skip to content

Commit c9df583

Browse files
authored
Merge pull request #340 from jaejeong1/main
[jaejeong1] WEEK 02 Solutions
2 parents 5a776b6 + 93deaff commit c9df583

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

counting-bits/jaejeong1.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class SolutionCountingBits {
2+
public int[] countBits(int n) {
3+
// 0 ~ n 까지의 수를 이진수로 변환한다음, 1의 개수를 카운트해 배열로 반환
4+
// 홀수/짝수 여부를 나눠서 1의 개수를 구함
5+
// 홀수: 이전 값 + 1, 짝수: i / 2의 1의 개수와 같은 값
6+
// 시간복잡도: O(N), 공간복잡도: O(N)
7+
8+
int[] countingBits = new int[n + 1];
9+
countingBits[0] = 0;
10+
11+
for (int i=1; i<=n; i++) {
12+
if (isOddNumber(i)) {
13+
countingBits[i] = countingBits[i - 1] + 1;
14+
} else {
15+
countingBits[i] = countingBits[i / 2];
16+
}
17+
}
18+
19+
return countingBits;
20+
}
21+
22+
// 시간복잡도: O(1)
23+
private boolean isOddNumber(int n) {
24+
return n % 2 == 1;
25+
}
26+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
class SolutionEncodeAndDecodeStrings {
5+
6+
private static final char SEPERATOR = '/';
7+
/*
8+
* @param strs: a list of strings
9+
* @return: encodes a list of strings to a single string.
10+
*/
11+
// 풀이: 문자열 길이를 구분자와 함께 encode해 decode시 문자열 길이를 참고할 수 있도록 한다
12+
// 시간복잡도: O(N), 공간복잡도: O(1)
13+
public String encode(List<String> strs) {
14+
// write your code here
15+
var answer = new StringBuilder();
16+
17+
for (var str : strs) {
18+
answer.append(SEPERATOR)
19+
.append(str.length())
20+
.append(str);
21+
}
22+
23+
return answer.toString();
24+
}
25+
26+
/*
27+
* @param str: A string
28+
* @return: decodes a single string to a list of strings
29+
*/
30+
// 풀이: 문자열 길이를 구분자와 함께 encode해 decode시 문자열 길이를 참고할 수 있도록 한다
31+
// 시간복잡도: O(N), 공간복잡도: O(N)
32+
public List<String> decode(String str) {
33+
// write your code here
34+
List<String> answer = new ArrayList<>();
35+
var i = 0;
36+
while (i < str.length()) {
37+
var seperatorIdx = str.indexOf(SEPERATOR, i) + 1;
38+
var size = Integer.parseInt(str.substring(seperatorIdx, seperatorIdx + 1));
39+
i = seperatorIdx + size + 1;
40+
answer.add(str.substring(seperatorIdx + 1, i));
41+
}
42+
43+
return answer;
44+
}
45+
}

valid-anagram/jaejeong1.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
class SolutionValidAnagram {
5+
public boolean isAnagram(String s, String t) {
6+
// 풀이: 해시맵을 사용해 s와 t의 문자 별 빈도수를 저장한다
7+
// 두 빈도수의 모든 키와 값이 같고, 크기가 같은지 비교한다.
8+
// 다르다면 false를 반환, 모두 같다면 true를 반환한다.
9+
// 시간복잡도: O(N), 공간복잡도: O(1)
10+
11+
Map<Character, Integer> sAnagram = createAnagramMap(s);
12+
Map<Character, Integer> tAnagram = createAnagramMap(t);
13+
14+
// 두 해시맵의 크기가 같은지 확인
15+
if (sAnagram.size() != tAnagram.size()) {
16+
return false;
17+
}
18+
19+
// sAnagram과 tAnagram의 모든 키와 값을 비교
20+
for (Map.Entry<Character, Integer> entry : sAnagram.entrySet()) {
21+
var key = entry.getKey();
22+
int value = entry.getValue();
23+
24+
// tAnagram에 key가 존재하지 않거나, 그에 대응하는 value가 다르면 false 반환
25+
if (!tAnagram.containsKey(key) || !tAnagram.get(key).equals(value)) {
26+
return false;
27+
}
28+
}
29+
30+
return true;
31+
}
32+
33+
private Map<Character, Integer> createAnagramMap(String text) {
34+
Map<Character, Integer> anaGramMap = new HashMap<>();
35+
36+
for (var c: text.toCharArray()) {
37+
anaGramMap.put(c, anaGramMap.getOrDefault(c, 0) + 1);
38+
}
39+
40+
return anaGramMap;
41+
}
42+
}

0 commit comments

Comments
 (0)