しぐまろぐ

勉強したことや読んだ本について書きます。

AtCoder ABC 157 C - Guess The Number

C - Guess The Number

解説を見ると全探索でも出来るようだが、条件について矛盾がないか確かめていく方法を取った。

ポイント

いくつかひっかかったポイントがあったのでメモしておく。

  • 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を除外できていないことに気づいて慌てて追加した。

解けたのは嬉しいが、もっとシンプルに書けたと思う。