알고스팟 온라인 저지/첫 번째 문제 풀기

어서 와 온라인 저지는 처음이지?

왼쪽 메뉴의 온라인 저지/문제 풀기를 클릭하면 문제 목록을 볼 수 있다. 문제 목록에서는 각 문제를 출처별/분류별/출제자별로 필터링해 볼 수 있다.

입출력을 테스트하기 위해, 가장 간단한 HELLOWORLD 문제를 풀어보자.

입출력

온라인 저지에서 프로그램은 모두 표준 입력 (standard input) 에서 입력을 읽어들이고, 표준 출력 (standard output) 으로 출력을 보낸다. Wikipedia에서 표준 입출력이 무엇인가에 대한 설명을 읽을 수 있다. C 로 말하자면 scanf/printf 를 쓰고, C++ 에서는 cin/cout, Java 에서는 System.inSystem.out 을 쓴다.

정답 기준

제출된 프로그램은, 채점 입력에 대한 계산 결과가 정확하게 정답과 일치해야만 정답으로 인정된다. 따라서 프로그램의 출력은 정확하게 문제에 명시된 대로여야 하며, 덜 출력해도 더 출력해도 안 된다. 답만 출력하는 대신 'The answer is X', 'Enter N' 등의 메시지를 출력하는 것은 전부 오답으로 처리된다.

생각해 보자. 채점을 사람이 하는 게 아닌 이상 프로그램이 출력한 메세지가 입력을 요구하는 것인지 아니면 답을 출력한 것인지 어떻게 안단 말인가?

테스트 케이스

온라인 저지에서는 항상 여러 개의 입력에 대해 프로그램을 실행해 보고 모든 답이 맞게 나오는 경우에만 정답으로 인정하게 된다. 입력을 바꿔 가며 프로그램을 여러 번 실행해도 되지만, 대개는 프로그램은 한 번만 실행하되, 입력 파일에서 여러 개의 입력을 주는 방식을 택한다.

이 문제에서도 인사할 사람의 이름이 첫 줄에 주어진다고 되어 있다.

한 가지 프로그래밍 대회를 처음 접하는 사람들이 흔히 하는 실수는, 한 번에 입력을 다 읽어들여 저장한 뒤 답을 계산하고 한번에 출력하는 것이다. 온라인 저지는 모든 출력을 한 번에 모아서 정답 여부를 판정하기 때문에, 한 번에 한 개의 예제를 읽어들여, 답을 구하고 출력하는 것을 반복해도 괜찮다. 물론 모든 입력을 받아 모아서 계산한 뒤 한꺼번에 출력해도 무방하지만, 구현의 편의를 위해서는 각 입력을 바로 처리하는 것이 현명하다.

다시 말하자면 표준입출력을 redirection하여 채점한다. 입력을 한 줄씩, 한 케이스씩 사람이 입력하고 결과를 채점하는 것이 아니다.

각 언어로 짜 본 HELLOWORLD 문제

Python

import sys
rl = lambda: sys.stdin.readline()
n = int(rl())
for i in range(n):
  print "Hello, %s!" % rl().strip()

C

#include<stdio.h>
int main() {
    int cases;
    char name[1024];
    scanf("%d", &cases);
    while(cases--) {
        scanf("%s", name);
        printf("Hello, %s!\n", name);
    }
}

C++

#include<iostream>
#include<string>
using namespace std;
int main() {
  int cases;
  cin >> cases;
  while(cases--) {
    string name;
    cin >> name;
    cout << "Hello, " << name << "!" << endl;     
  }
}

Java

Java의 경우에는, main 메소드가 있는 클래스명은 항상 Main 이어야 한다. 또한, 패키지를 지정해서는 안 된다.

// package helloworld; << DON'T

import java.util.HashMap;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int cases = sc.nextInt();
        while(cases-- > 0) {
            String name = sc.next();
            System.out.println("Hello, " + name + "!");
        }
    }
}

Haskell

하스켈의 경우에도, 모듈의 이름은 항상 Main 이어야 한다.

module Main where

main :: IO ()
main = do
  getLine
  interact (unlines . map hello . lines)

hello :: String -> String    
hello = ("Hello, " ++) . (++ "!")

Scala

스칼라의 경우에도, main() 함수가 있는 오브젝트의 이름은 항상 Main 이어야 한다.

object Main {
  def main(args: Array[String]): Unit = {
    var cases = Integer.parseInt(readLine())
    while (cases > 0) {
      println("Hello, " + readLine() + "!")
      cases -= 1
    }
  }
}

Ruby

루비 하앍하앍

Integer(gets).times { puts "Hello, #{gets.strip}!" }

JavaScript(Node.js)

파워!

var input = [];
require('readline')
.createInterface(process.stdin, {})
.on('line', function(line) {
  input.push(line.trim());
}).on('close', function() {
  for (var i = 1; i <= +input[0]; i++)
    console.log('Hello, ' + input[i] + '!');
});

Go

package main
import "fmt"
func main() {
        var cases int
        var name string
        fmt.Scanf("%d", &cases)
        for cases > 0 {
                fmt.Scanf("%s", &name)
                fmt.Printf("Hello, %s!\n", name)
                cases--
        }
}

Lua (LuaJIT)

cases, _= io.read("*number", "*line")
while cases > 0 do
    cases = cases - 1
    name = io.read("*line")
    print("Hello, " .. name .. "!")
end

서브밋하기

문제 위 오른쪽의 제출 버튼을 누르고 소스 코드를 붙여넣으면 서브미션 결과 페이지로 이동하게 된다.

붉은색으로 정답이라는 말이 떴으면 성공!

25개의 댓글이 있습니다.
  • unbing
    unbing

    node.js 최신버전으로는 입력에서 에러가 나네요 ㅜㅜ

    뭐가 맞는 방법인지 알아보다가 역량 부족으로 그냥 https://github.com/visionmedia/n 이거 이용해서 쉽게 다운그레이드 했어요 ㅋㅋ;;


    5년 전 link
  • Being
    Being

    @unbing, 그거 함 확인해주시면 안되나여 ㅋㅋ node 업데이트 해도 되긴 하는데...


    5년 전 link
  • unbing
    unbing

    음... 다시 버전을 0.8.1로 바꾸니까 똑같은 코드가 돌아가네여... 뭐지 ㅜㅜ 제가 공부를 좀 더 해보고 코멘트를 할게요... node.js 처음 이용해본거라 머리속이 혼란 그 자체 ㅋㅋㅋ;;; 근데 이거 뭔가 이상하죠? ㅋㅋ 내가 뭘 잘못한거지...


    5년 전 link
  • joybro
    joybro

    node.js 예제의 "i <= +input[0]" 에서 "+" 의미가 있는건가요?


    4년 전 link
  • Being
    Being

    input[0]은 문자열이므로 +input[0]과 같이 쓰면 number 타입으로 변환됩니다.


    4년 전 link
  • joybro
    joybro

    스펙을 찾아보진 않았지만 number 와 string 을 비교하면 string 이 number 로 변환되어 비교되는 것으로 알고 있습니다. 예제 코드에서 +가 의미있는 경우는 찾기 힘들것 같네요.


    4년 전 link
  • Being
    Being

    맞는 말씀이네요 :) 방어적인 코딩의 일환으로 생각하는 게 어떨까요?


    4년 전 link
  • joybro
    joybro

    네. 생소한 사용법이라 신기해서 여쭤봤었습니다. 답변 감사드립니다 :)


    4년 전 link
  • skkeem
    skkeem

    왜 C에서 while 조건식이 cases-->0 이 아닌 cases-- 일까 생각해봤는데 C에서는 0이 아닌 숫자는 true로 받으니까 제대로 작동 하겠군요!


    4년 전 link
  • husylvan
    husylvan

    Scala의 새 버전(2.11.1)에서는 scala.readLine()함수 대신 scala.io.StdIn.readLine()을 사용해야 한다고 합니다. 정수를 입력 받을 때는 scala.io.StdIn.readInt().


    3년 전 link
  • JongMan
    JongMan

    husylvan, 제보 감사합니다. 직접 고쳐 주시면 더 좋은데.. 흐흐..


    3년 전 link
  • mega_woo
    mega_woo

    오늘 처음이네요... 잘부탁드림


    3년 전 link
  • paradise7
    paradise7

    역시 평가 시스템도 컴퓨터라 딱 맞게끔 해줘야 하네요.


    3년 전 link
  • cdy8835
    cdy8835

    이름이 대소문자이고 50자 이하인건 왜 체크하지 않나요???


    3년 전 link
  • hyunstar
    hyunstar

    잘 보고 갑니다 감사합니다.


    3년 전 link
  • astein
    astein

    cdy8835 // 문제에 써 있는 입력조건에 맞지 않는 입력은 주어지지 않는다고 가정하시고 풀어도 되기 때문입니다.


    3년 전 link
  • pumpyboom
    pumpyboom

    발자취 ㅎㅎ


    2년 전 link
  • corruptangle
    corruptangle

    좋네요 ㅎㅎ 이런 정보조차도 전 감사합니다. ㅎㅎ


    2년 전 link
  • S_woomin
    S_woomin

    c언어에서 실행 시키고 5명을 입력 받겠다 하고 사용자명을 abc로 하고 엔터치면 왜 프로그램이 동작 안할까요..닫기 나오네요


    2년 전 link
  • kuman514
    kuman514

    오옹 여기서 "왜 출력 채점 기준을 바꾸지 말고 명세서를 단 하나라도 빠짐 없이 읽어야 하는지" 이해했습니다.


    2년 전 link
  • jeonhyoju
    jeonhyoju

    아무리 튜토리얼이라지만 이건 정답이 아니라고 봅니다.
    입력이 잘못되었을 때에 대한 처리가 있어야 됩니다.
    그리고 java에서 Scanner를 왜 close 안 해줍니까?
    저 상태로 계속 실행하면 시스템 memory full 됩니다.
    그리고 "Java의 경우 class명을 Main으로 하고
    패키지는 지정하지 마라"는 거는 문제에 포함시켰어야죠.
    덕분에 3번 컴파일 실패했네요.
    수정 부탁드립니다.


    1년 전 link
  • 디지펜
    디지펜

    하스켈...


    1년 전 link
  • hajunho
    hajunho

    자바로 복습하려고 들어 왔는데요. 많이 배워갈께요.


    1년 전 link
  • VONLUEAPS
    VONLUEAPS

    C#은 제공안하시나보네요 아쉽.... ㅠ


    1년 전 link
  • keviny.seo
    keviny.seo

    python3.x 부터는 print에 () 를 추가해야합니다. 참고하세요.
    ex. print ("Hello, %s!" % rl().strip())


    2주 전 link
  • 댓글을 남기시려면 로그인하세요.