File tree Expand file tree Collapse file tree 3 files changed +113
-0
lines changed
encode-and-decode-strings Expand file tree Collapse file tree 3 files changed +113
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments