AtCoder Beginner Contest 327 振り返り

今回は早めに。

結果

なんとか3完しました。


各問題の振り返り

A - ab

isInfixOfを使って解きました。

main :: IO ()
main = do
  _ <- BS.getLine
  s <- BS.getLine

  if BS.pack "ab" `BS.isInfixOf` s || BS.pack "ba" `BS.isInfixOf` s
    then putStrLn "Yes"
    else putStrLn "No"

{- Library -}
readInputInt :: IO Int
readInputInt = fst . fromJust . BS.readInt <$> BS.getLine

B - A^A

二分探索を使って効率化すればいけるだろうと思ったのですが、TLE連発で苦しみ…
探索範囲を絞ることでなんとかACすることができました。

main :: IO ()
main = do
  b <- readInputInt
  print $ solve $ fromIntegral b

expA :: Integer -> Integer
expA a = a ^ a

findA :: Integer -> Integer -> Integer -> Integer
findA b left right
  | midExp == b = mid
  | left > right = -1
  | midExp < b = findA b (mid + 1) right
  | otherwise = findA b left (mid - 1)
  where
    mid = (left + right) `div` 2
    midExp = expA mid

solve :: Integer -> Integer
solve b = findA b 1 (min b (round (fromIntegral b ** (1 / 3))))

C - Number Place

ChatGPTさんのおかげでまぐれ当たり的に解けました。やってることは単純で、行、列、3x3の範囲それぞれのリストを作ってsortして判定します。
3x3はリスト内包表記を使ってconcatMapしてあげると結構簡単にリストができます。便利。

main :: IO ()
main = do
  grid <- replicateM 9 $ map read . words <$> getLine
  putStrLn $ if isValidSudoku grid then "Yes" else "No"

isValidSudoku :: [[Int]] -> Bool
isValidSudoku grid = all validGroup (rows ++ cols ++ blocks)
  where
    rows = grid
    cols = transpose grid
    blocks = [concatMap (take 3 . drop j) (take 3 . drop i $ grid) | i <- [0, 3, 6], j <- [0, 3, 6]]
    validGroup group = sort group == [1 .. 9]

全体を振り返って

B問題でTLE連発でまだまだだな。。と思いました。TLEの時は落ち着いて探索範囲を絞ることが重要だなと言うことが今回の学びです。

この記事が気に入ったらサポートをしてみませんか?