Skip to content

Instantly share code, notes, and snippets.

@sanoyo
Last active February 16, 2020 23:14
Show Gist options
  • Save sanoyo/5b4ff7530a9c037e2b79d1d8224277f1 to your computer and use it in GitHub Desktop.
Save sanoyo/5b4ff7530a9c037e2b79d1d8224277f1 to your computer and use it in GitHub Desktop.
Goの学習記録[2ヶ月目]

Goの学習記録[2ヶ月目]

AtCoder 版!蟻本 (初級編)
Go言語:文法基礎まとめ
【初級編】Go言語を始める方のための落とし穴、問題の解決方法やよくある間違い

重要なこと

  • 一気に解こうとしないこと
  • 一つずつ解ける問題の幅を上げていくこと
  • 時間制限を設けること

2/17

155コンテスト復習

2/16

155コンテスト

2/14

AtCoder Beginner Contest 152 C

2/11

AtCoder Beginner Contest 154 D

累積和

累積和を何も考えずに書けるようにする! - Qiita Golangを用いた様々な計算の高速化 - Qiita

2/10

下記コンテストの復習 AtCoder Beginner Contest 154

C問題解けなかった要因

計算量を考えていなかった。 回答は出せていたのだが、計算量を考慮していなかったので、間違いとなった。 しかしかなり良い気づき。

# 解説
# https://img.atcoder.jp/abc154/editorial.pdf
C: Distinct
単純に全ての 2 つの整数の組に関してループで回し等しいか判定する場合、計算量が O(N2) となり間に合いません。
ところが、与えられた整数列に等しい値がある場合、この整数列をソートすると隣接する場所にこれらの値が集まることになります。
そのため、一度与えられた数列をソートすると、全ての隣接する 2 項を比較し、等しい値がなければ YES で、等しい値があれば NO です。

2/9

コンテスト参加
AtCoder Beginner Contest 154

2/7

Atcoder abc109_c

割り算基礎

# https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1487006889
①1÷3=0あまり1
②3÷5=0あまり3

ユークリッド互除法

aとbの最大公約数 →bとrの最大公約数

# https://mathtrain.jp/euclid

390 を 273 で割ると,商が 1 で余りが 117 です:
390=273⋅1+117
「390 と 273 の最大公約数」
=「273 と 117 の最大公約数」

次に,273 を 117 で割ると、273=117⋅2+39
「273 と 117 の最大公約数」
=「117 と 39 の最大公約数」

2/6

Atcoder abc109_c

for文 (i+1)問題

// 以下のように「i+1」を使用すると、
for i := 0; i < len(A); i++ {
  intervals = append(intervals, A[i+1]-A[i])
  fmt.Println(i)
}


// こんな実装方法がある
for i := 1; i < len(A); i++ {
  intervals = append(intervals, A[i]-A[i-1])
  fmt.Println(i)
}

新しい標準入力受け取りパターン

sc := bufio.NewScanner(os.Stdin)
sc.Split(bufio.ScanWords)

A := make([]int, N)
for i := range A {
  A[i] = nextInt(sc)
}

ユークリッド互除法

2/5

Atcoder abc109_b

map

mapは重複を許さない

mapは、

Go言語 - マップの基本的な操作

2/4

Atcoder abc109_a
Atcoder abc109_b

2/3

動的計画法

Atcoder abc153 e
プログラミングコンテストでの動的計画法
典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~
動的計画法(Dynamic Programming)をサルでも分かるように説明する - その1(フィボナッチ数列)

自分の解釈

DP法と呼ばれる。 全探索をさらに効率よく実装できる。

2種類のDP

  • トップダウン:メモ化再帰、メモ化
  • ボトムアップ:分割統治法、漸化式ループ

累乗

Atcoder abc153 d

// 2の8乗
fmt.Println(math.Pow(2,8)) // 256

Goのmathパッケージをさわってみたメモ

1/31

At Coder joi2011yo_e

戦略変更

BFSのアルゴリズム解くよりも、問題をより多く解いていこう

1/30

At Coder joi2011yo_e

1/29

Atcoder abc007

キュー

Goでのキューはただのスライス+appendで実装できる

1/28

Atcoder dfs
Atcoder abc007

課題

なぜ、 'o'の時に、falseを返すのか (031/002_main.go)

1/27

Atcoder 153 Atcoder dfs

1/26

Atcoder 153

1/24

Atcoder dfs

1/23

Atcoder dfs
https://atcoder.jp/contests/arc031/submissions/7030599
https://atcoder.jp/contests/arc031/submissions/9643970

rune

1文字ずつ取り出すことができる
String と Rune

Qiita

【Go/アルゴリズム】DFS

1/22

Atcoder dfs
Atcoder dfs

DFS後編

DFS (深さ優先探索) 超入門! 〜 グラフ・アルゴリズムの世界への入口 〜【後編】

スタックとキュー

スタックとキューを極める! 〜 考え方と使い所を特集 〜

1/20

Atcoder dfs

明日やること: https://qiita.com/drken/items/4a7869c5e304883f539b

dfs実装前の前処理的

  • スタートの座標、ゴールの座標を用意してあげる。
  • 迷路の位置を示す配列が、文字列sと一致 → スタートの座標として値を更新。
  • 迷路の位置を示す配列が、文字列gと一致 → ゴールの座標として値を更新。
  • DFS実行
  • DFSで再帰的にTrueになるまで実行する

Atcoder dfs

よくある間違い

【初級編】Go言語を始める方のための落とし穴、問題の解決方法やよくある間違い

配列が1つの時と複数の時の出力の違い

var test [][]byte
test = make([][]byte, h)
fmt.Println(test)
// [[] [] [] []]

var test []byte
test = make([]byte, h)
fmt.Println(test)
// 4 5

行で入力を受け取りたい場合

  • 最初のあたいは、fmt.Scanで受け取る
  • 次にfor文の中で、fmt.Scan()を回す

1/19

Atcoder arc029 A

bit 全探索

ビット演算を用いたフラグ管理

例えばビット bit に i 番目のフラグが立っているかどうかは if ((bit>>i) & 1) と書くこともできます

ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜

bit 全探索

n個の要素からなる集合 {0,1,…,n−10,1,…,n−1} の部分集合をすべて調べ上げる手法のことです

// これがbit全検索の型
for bit := 0; bit < (1 << uint64(n)); bit++ {
  // fmt.Println(bit) // 3を入力した場合、0~7の計8つが出力される。
  for i := 0; i < n; i++ {
    // fmt.Println(i) // 3を入力した場合、0, 1, 2のセットが計8つが出力される。
    if (bit>>uint64(i))&1 == 1 { // bitsのi個目の要素の状態がonかどうかチェック(ここは問題によって条件を変化させる)
    }
  }
}

(1<<n)は2^nと覚える

bit全探索について簡単にまとめる
【Golang】Goでbit全探索をしよう

1/17

Atcoder arc029 A

左シフト演算子 <<

シフト演算子は左側のオペランドを右側のオペランド分だけ左または右にシフトします。 左オペランドには int, uint, long, ulong のみを、 右オペランドには int のみを取ることが出来ます。

シフト 左シフト演算子 <<

1/16

再帰的に簡単な実装をしてみる

print系関数の違い

【Go】print系関数の違い
fmt パッケージ

2の階乗 再帰関数

フィボナッチ数を扱う - 再帰呼出し お気楽 Go 言語プログラミング入門

1/15

再帰関数

再帰関数を学ぶと、どんな世界が広がるか
V - 2.05.再帰関数

再帰関数とは

メソッド内で、自分自身を呼び出すこと

再帰関数を呼び出す時に注意すべきこと

  • ベースケースをに対して、必ずreturnを実装すること
  • 再帰呼び出しを行ったときの問題が、元の問題よりも小さな問題となるように再帰呼び出しを行い、そのような「より小さい問題の系列」が最終的にベースケースに辿り着くようにする

ベースケース

  • 再帰呼び出しを行わずに完了できる処理をベースケースという
動的計画法

再帰関数が2箇所呼ばれる実装をしてしまうと、同じ計算が複数走ることになり、計算量が爆増することになる。 そんな時に活用できるのが、動的計画法

文字の分解

s = "ABCDEFGhijklmn"
fmt.Println(s[4:10]) // -> "EFGhij"
 
 # [最初の数字(どこから開始するのか上記4文字目の以降のGo):終了する地点(: この数値は含めない)]

[Golang] 文字列操作サンプル

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment