diff --git a/counting-bits/jaejeong1.java b/counting-bits/jaejeong1.java new file mode 100644 index 000000000..620605403 --- /dev/null +++ b/counting-bits/jaejeong1.java @@ -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; + } +} diff --git a/encode-and-decode-strings/jaejeong1.java b/encode-and-decode-strings/jaejeong1.java new file mode 100644 index 000000000..7bd7a8232 --- /dev/null +++ b/encode-and-decode-strings/jaejeong1.java @@ -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 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 decode(String str) { + // write your code here + List 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; + } +} diff --git a/valid-anagram/jaejeong1.java b/valid-anagram/jaejeong1.java new file mode 100644 index 000000000..d9db99fb2 --- /dev/null +++ b/valid-anagram/jaejeong1.java @@ -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 sAnagram = createAnagramMap(s); + Map tAnagram = createAnagramMap(t); + + // 두 해시맵의 크기가 같은지 확인 + if (sAnagram.size() != tAnagram.size()) { + return false; + } + + // sAnagram과 tAnagram의 모든 키와 값을 비교 + for (Map.Entry 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 createAnagramMap(String text) { + Map anaGramMap = new HashMap<>(); + + for (var c: text.toCharArray()) { + anaGramMap.put(c, anaGramMap.getOrDefault(c, 0) + 1); + } + + return anaGramMap; + } +}