解説を見ると全探索でも出来るようだが、条件について矛盾がないか確かめていく方法を取った。
ポイント
いくつかひっかかったポイントがあったのでメモしておく。
- scanしたものを何に入れるか
まずs,cをmapに入れていこうとした。
だがそうするとだとvalueが0のとき、「条件として入力されていない」のか「0として入力された」の区別がつかなくなってしまった。
諦めてs,cを別のスライスに入れていった。
- 0が許される状況
n=1のときは1桁目が0でも良い。
n>=2のときはダメ。
- 条件が指定されていない桁
ここが最も引っかかったところ。
n>=2のときは、1桁目が指定されていなかったら0ではなく1を入れなければいけない。
解答
package main import ( "fmt" "strconv" "strings" ) func main() { var n,m int fmt.Scan(&n,&m) s := make([]int,m) c := make([]int,m) for i := 0; i < m; i++ { fmt.Scan(&s[i], &c[i]) s[i]-- } //矛盾があったらアウト for i := 0; i < m - 1; i++ { for j := i + 1; j < m; j++ { if s[i] == s[j] && c[i] != c[j] { fmt.Println(-1) return } } } //予め-1を入れておく ans := make([]string, n) for i := range ans { ans[i] = "-1" } //s,cの値を代入していく for i := 0; i < m; i++ { ans[s[i]] = strconv.Itoa(c[i]) } // 例外に配慮し値を入れる for i := range ans { if ans[i] == "-1" { if n == 1 || n >=2 && i >= 1{ ans[i] = "0" } else if n >= 2 { ans[i] = "1" } } } //000を除外 if n >= 2 && ans[0] == "0" { fmt.Println(-1) return } fmt.Println(strings.Join(ans,"")) }
入力例3で000を除外できていないことに気づいて慌てて追加した。
解けたのは嬉しいが、もっとシンプルに書けたと思う。