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の時は落ち着いて探索範囲を絞ることが重要だなと言うことが今回の学びです。