Skip to content

Commit bb0db1a

Browse files
authored
Merge pull request #373 from YeonguChoe/main
2주차 풀이
2 parents daa942f + d153a84 commit bb0db1a

File tree

5 files changed

+139
-0
lines changed

5 files changed

+139
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
func indexOf(slice []int, value int) int {
2+
for i, v := range slice {
3+
if v == value {
4+
return i
5+
}
6+
}
7+
return -1
8+
}
9+
10+
func buildTree(preorder []int, inorder []int) *TreeNode {
11+
if len(preorder) == 0 || len(inorder) == 0 {
12+
return nil
13+
}
14+
15+
// Preorder의 처음 값으로 root을 만듬
16+
rootVal := preorder[0]
17+
root := &TreeNode{Val: rootVal}
18+
19+
// inorder에서 root의 위치를 찾음
20+
mid := indexOf(inorder, rootVal)
21+
22+
// inorder에서 mid의 왼쪽은 left subtree이고 오른쪽은 right subtree이다.
23+
leftInorder := inorder[:mid]
24+
rightInorder := inorder[mid+1:]
25+
26+
// left preorder를 계산한다.
27+
leftPreorder := preorder[1 : len(leftInorder)+1]
28+
// right preorder를 계산한다.
29+
rightPreorder := preorder[len(leftInorder)+1:]
30+
31+
// tree 만들기
32+
root.Left = buildTree(leftPreorder, leftInorder)
33+
root.Right = buildTree(rightPreorder, rightInorder)
34+
35+
return root
36+
}

counting-bits/yeonguchoe.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
func countBits(n int) []int {
2+
var result []int = make([]int, n+1)
3+
var offset int = 1
4+
for i := 1; i <= n; i++ {
5+
if i == offset*2 {
6+
offset = offset * 2
7+
}
8+
result[i] = 1 + result[i-offset]
9+
}
10+
return result
11+
}

decode-ways/yeonguchoe.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
func dfs(s string, i int, memo map[int]int) int {
2+
if i == len(s) {
3+
return 1
4+
}
5+
if val, found := memo[i]; found {
6+
return val
7+
}
8+
if s[i] == '0' {
9+
memo[i] = 0
10+
return 0
11+
}
12+
13+
// 1자리 숫자로 디코딩
14+
result := dfs(s, i+1, memo)
15+
16+
// 2자리 숫자로 디코딩
17+
if i+1 < len(s) {
18+
// 10의 자리 숫자 또는 20의 자리 숫자로 디코딩
19+
if (s[i] == '1') || (s[i] == '2' && s[i+1] >= '1' && s[i+1] <= '6') {
20+
result += dfs(s, i+2, memo)
21+
}
22+
}
23+
// dp에 저장
24+
memo[i] = result
25+
return result
26+
}
27+
28+
func numDecodings(s string) int {
29+
// memo 테이블 만들고 dfs 호출
30+
memo := make(map[int]int)
31+
return dfs(s, 0, memo)
32+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
type Codec struct {
2+
}
3+
4+
// Encodes a list of strings to a single string.
5+
func (codec *Codec) Encode(strs []string) string {
6+
var temp []rune
7+
for _, v := range strs {
8+
var current_string = []rune(v)
9+
temp = append(temp, rune(len(current_string)))
10+
temp = append(temp, rune('π'))
11+
temp = append(temp, current_string...)
12+
}
13+
return string(temp)
14+
}
15+
16+
// Decodes a single string to a list of strings.
17+
func (codec *Codec) Decode(strs string) []string {
18+
var full_string = []rune(strs)
19+
var result []string
20+
21+
var index = 0
22+
23+
for index < len(full_string) {
24+
var word_start int = int(index)
25+
for full_string[word_start] != rune('π') {
26+
word_start += 1
27+
}
28+
length := int(full_string[word_start-1])
29+
result = append(result, string(full_string[word_start+1:word_start+1+length]))
30+
index = word_start + 1 + length
31+
}
32+
return result
33+
}

valid-anagram/yeonguchoe.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func isAnagram(s string, t string) bool {
2+
3+
var s_frequency map[rune]int = make(map[rune]int)
4+
var t_frequency map[rune]int = make(map[rune]int)
5+
6+
for i := 0; i < len(s); i++ {
7+
s_frequency[rune(s[i])] += 1
8+
}
9+
10+
for index, key := range t {
11+
t_frequency[key] += 1
12+
}
13+
14+
for key, value := range s_frequency {
15+
if v, key_exist := t_frequency[key]; !key_exist || v != value {
16+
return false
17+
}
18+
}
19+
20+
for key, value := range t_frequency {
21+
if v, key_exist := s_frequency[key]; !key_exist || v != value {
22+
return false
23+
}
24+
}
25+
26+
return true
27+
}

0 commit comments

Comments
 (0)