Graphics Programming

[ALGOSPOT] HOTSUMMER - fold, map 활용하기 본문

Season 1/하스켈

[ALGOSPOT] HOTSUMMER - fold, map 활용하기

minseoklee 2014. 10. 8. 19:23
문제: https://algospot.com/judge/problem/read/HOTSUMMER

문제 수: n
목표치: goal
사용량: a1 a2 a3 a4 a5 a6 a7 a8 a9

a1 + a2 + ... + a9 <= goal 을 만족하는지를 n번 판단하면 된다. 이제 IO 모나드는 익숙해서 굳이 >>= 를 일일이 쓰며 따져볼 필요가 없으니 do 표기를 사용해서 금방 작성했다.

import Control.Monad

import System.IO


main = do

  numProblems_s <- getLine

  let numProblem = read numProblems_s :: Int

  forM_ [1..numProblems] $ const $ do

    goal_s <- getLine

    let goal = read goal_s :: Int

    usageList <- getLine

    let total = foldr1 (+) (map read $ words usageList)

    putStrLn (if total <= goal then "YES" else "NO")


여기서 핵심 코드는 문자열 "a1 a2 a3 a4 a5 a6 a7 a8 a9" 을 getLine으로 입력받았을 때 전부 정수로 변환해서 더하는 것이다.

usageList = "a1 a2 a3 a4 a5 a6 a7 a8 a9" 라고 하면
x = words usageList = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9"]
y = map read x = [a1, a2, a3, a4, a5, a6, a7, a8, a9]
total = foldr1 (+) y = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9

이걸 한 줄로 압축하면 total = foldr1 (+) (map read $ words usageList) 이 된다. 튜토리얼은 그만 풀어봐도 될 것 같다.
Comments