Skip to content

Commit

Permalink
Merge pull request #340 from jaejeong1/main
Browse files Browse the repository at this point in the history
[jaejeong1] WEEK 02 Solutions
  • Loading branch information
jaejeong1 authored Aug 24, 2024
2 parents 5a776b6 + 93deaff commit c9df583
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 0 deletions.
26 changes: 26 additions & 0 deletions counting-bits/jaejeong1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
class SolutionCountingBits {
public int[] countBits(int n) {
// 0 ~ n 까지의 수를 이진수로 변환한다음, 1의 개수를 카운트해 배열로 반환
// 홀수/짝수 여부를 나눠서 1의 개수를 구함
// 홀수: 이전 값 + 1, 짝수: i / 2의 1의 개수와 같은 값
// 시간복잡도: O(N), 공간복잡도: O(N)

int[] countingBits = new int[n + 1];
countingBits[0] = 0;

for (int i=1; i<=n; i++) {
if (isOddNumber(i)) {
countingBits[i] = countingBits[i - 1] + 1;
} else {
countingBits[i] = countingBits[i / 2];
}
}

return countingBits;
}

// 시간복잡도: O(1)
private boolean isOddNumber(int n) {
return n % 2 == 1;
}
}
45 changes: 45 additions & 0 deletions encode-and-decode-strings/jaejeong1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import java.util.ArrayList;
import java.util.List;

class SolutionEncodeAndDecodeStrings {

private static final char SEPERATOR = '/';
/*
* @param strs: a list of strings
* @return: encodes a list of strings to a single string.
*/
// 풀이: 문자열 길이를 구분자와 함께 encode해 decode시 문자열 길이를 참고할 수 있도록 한다
// 시간복잡도: O(N), 공간복잡도: O(1)
public String encode(List<String> strs) {
// write your code here
var answer = new StringBuilder();

for (var str : strs) {
answer.append(SEPERATOR)
.append(str.length())
.append(str);
}

return answer.toString();
}

/*
* @param str: A string
* @return: decodes a single string to a list of strings
*/
// 풀이: 문자열 길이를 구분자와 함께 encode해 decode시 문자열 길이를 참고할 수 있도록 한다
// 시간복잡도: O(N), 공간복잡도: O(N)
public List<String> decode(String str) {
// write your code here
List<String> answer = new ArrayList<>();
var i = 0;
while (i < str.length()) {
var seperatorIdx = str.indexOf(SEPERATOR, i) + 1;
var size = Integer.parseInt(str.substring(seperatorIdx, seperatorIdx + 1));
i = seperatorIdx + size + 1;
answer.add(str.substring(seperatorIdx + 1, i));
}

return answer;
}
}
42 changes: 42 additions & 0 deletions valid-anagram/jaejeong1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import java.util.HashMap;
import java.util.Map;

class SolutionValidAnagram {
public boolean isAnagram(String s, String t) {
// 풀이: 해시맵을 사용해 s와 t의 문자 별 빈도수를 저장한다
// 두 빈도수의 모든 키와 값이 같고, 크기가 같은지 비교한다.
// 다르다면 false를 반환, 모두 같다면 true를 반환한다.
// 시간복잡도: O(N), 공간복잡도: O(1)

Map<Character, Integer> sAnagram = createAnagramMap(s);
Map<Character, Integer> tAnagram = createAnagramMap(t);

// 두 해시맵의 크기가 같은지 확인
if (sAnagram.size() != tAnagram.size()) {
return false;
}

// sAnagram과 tAnagram의 모든 키와 값을 비교
for (Map.Entry<Character, Integer> entry : sAnagram.entrySet()) {
var key = entry.getKey();
int value = entry.getValue();

// tAnagram에 key가 존재하지 않거나, 그에 대응하는 value가 다르면 false 반환
if (!tAnagram.containsKey(key) || !tAnagram.get(key).equals(value)) {
return false;
}
}

return true;
}

private Map<Character, Integer> createAnagramMap(String text) {
Map<Character, Integer> anaGramMap = new HashMap<>();

for (var c: text.toCharArray()) {
anaGramMap.put(c, anaGramMap.getOrDefault(c, 0) + 1);
}

return anaGramMap;
}
}

0 comments on commit c9df583

Please sign in to comment.