技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

競技プログラミング day12

require 'pry'
# ----------------------------------------------------------
# ■ 問題
# https://atcoder.jp/contests/abc109/tasks/abc109_b

# ■ 前提条件
# 高橋くんは一人でしりとりの練習をしている
# 次の条件を満たしていない場合は失敗なので'No'とputsされる
# ---------------------------------------------
# その単語はまだ発言していない単語である
# その単語の先頭の文字は直前に発言した単語の末尾の文字と一致する
# ---------------------------------------------

# ■ 流れ説明
# 1.高橋くんが発言した単語の個数Nを入力
# 2.N回文のワードを入力
# 3.その単語の先頭の文字は直前に発言した単語の末尾の文字と一致するかの確認
# 4.その単語はまだ発言していない単語であるかの確認
# 5.3,4の条件を満たしている場合はYes,満たしていない場合はNoとputsで出力

# ■入力例
# 4
# hoge
# english
# hoge
# enigma

# ■ 出力例
# No(hogeが2回出ているので)

# ■ 工夫箇所
# ----------------------------------------------------------
# 1.高橋くんが発言した単語の個数Nを入力
N = gets.to_i

# # 2.N回文のワードを入力
words = []
N.times {
  words << gets.chomp
}

hash = {}
words.each_with_index do |word, index|
  #  4.その単語はまだ発言していない単語であるかの確認
  # ここでkeyが同じ場合はすでに発言している単語ということなのでNoと表示
  if hash.has_value?(word)
    puts 'No'
    exit
  end
  # 3.その単語の先頭の文字は直前に発言した単語の末尾の文字と一致するかの確認
  # ---------------------------------------------------
  # index > 0
  # ↓
  # 一番最初の文字は除外ケースなのでindexが0以上の場合にする
  # ---------------------------------------------------
  # wi[0]
  # ↓
  # wordの一番最初の文字(例:english -> e)
  # ---------------------------------------------------
  # words[i - 1][-1]
  # ↓
  # wordの一つ前の言葉の一番お尻の文字(例:englishの一つ前の文字はhoge、そのお尻の文字はe)
  if index > 0 && word[0] != words[index - 1][-1]
    puts 'No'
    exit
  end
  hash[index] = word
end

puts 'Yes'