JOI 2020 一次予選 第一回

JOI 2020 一次予選 第一回 C - 共通要素

この問題でGoではN, Mは使わないのですがn, mに代入しておきます。
for文でint ai, biを用いてスライスaとbにappendしていきます。
aとbのどちらでもいいのですが、どちらかをソートします。
そして、for文を二つ使ってスライスaのcnta番目とbのcntb番目が等しいかつcのa[cnta]番目が0ならばaのcnta番目を出力してbreakします。
しかし、aとbに共通の整数が2組あった場合に2回カウントされてしまいます。
そこで今回はaとbが100以下なので長さ100のスライスcをすべて0で初期化してcの一度数えた数字番目を1にします。
そうすることで、毎回プリントする前に確認するので重複がなくなります。

Sample Code

package main

import (
  "fmt"
  "sort"
)

func main() {
  var n, m int
  fmt.Scan(&n, &m)
  var a = []int{}
  var b = []int{}
  var c = [105]int{0}
  for i:=0; i < n; i++ {
    var ai int
    fmt.Scan(&ai)
    a = append(a, ai)
  }
  for j:=0; j < m; j++ {
    var bi int
    fmt.Scan(&bi)
    b = append(b, bi)
  }
  sort.Sort(sort.IntSlice(a))
  for cnta:=0; cnta < n; cnta++ {
      for cntb:=0; cntb < m; cntb++ {
          if a[cnta] == b[cntb] && c[a[cnta]] == 0{
        fmt.Println(a[cnta])
        break
          }
      }
    c[a[cnta]] = 1
  }
}

JOI 2020 一次予選 第一回

JOI 2020 一次予選 第一回 B - JOIソート

初めにfor文でSの中にあるJとOとIの文字の個数を調べる。
そして、その個数の分だけJとOとIを出力する。
ただし、JとOが0個の時にIが1個出力されないため最後にJとOが0個かつIが0個でないときにIを一回だけ出力するようにする。

Sample Code

package main

import (
  "fmt"
  "strings"
)

func main() {
  var n int
  var s string
  fmt.Scan(&n, &s)
  for j:=strings.Count(s, "J"); i > 0; i-- {
    fmt.Printf("%s", "J")
  }
  for o:=strings.Count(s, "O"); o > 0; o-- {
    fmt.Printf("%s", "O")
  }
  for i:=strings.Count(s, "I"); i > 0; i-- {
    fmt.Printf("%s", "I")
  }
  if strings.Count(s, "J") == 0 && strings.Count(s, "O") == 0 && strings.Count(s, "I") != 0{
    fmt.Printf("%s\n", "I")
  }
}

JOI 2020 一次予選 第一回

JOI 2020 一次予選 第一回 A - 2 番目に大きい整数

まず初めに、listというスライスに数字を代入していく。
そして、二番目に大きい数を出力する必要があるので、listにソートをかけて2番目の数を出力する。

Sample Code

package main

import (
  "fmt"
  "sort"
)

func main() {
  var list = []int{}
  for i:=0; i < 3; i++ {
    var input int
    fmt.Scan(&input)
    list = append(list, input)
  }
  sort.Sort(sort.IntSlice(list))
  fmt.Println(list[1])
}