AOJ 튜토리얼: 처음 시작하기

  • JongMan
    JongMan

    안녕하세요, AOJ 운영진 JM 입니다. 이 글에서는 프로그래밍 대회와 온라인 채점 사이트를 처음 접해 보는 분들을 위해 간단한 개념을 설명하고 첫번째 서브미션을 해 보려고 합니다. ^^

    프로그래밍 대회와 온라인 채점 사이트

    알고스팟은 ACM ICPC, 탑코더, 구글 코드 잼 등의 프로그래밍 대회를 준비하는 곳입니다. 프로그래밍 대회가 뭐 하는 것인가에 관해서는 각 대회의 웹사이트나 Soyoja 님의 소개글 을 참조하시고요.

    프로그래밍 대회를 준비하기 위한 가장 좋은 방법은 역시 직접 문제를 풀어 보는 것이지요. 하지만 작성한 프로그램을 실제로 컴파일해서 실행해서 채점을 하는 대회의 특성상, 자신이 문제를 잘 풀었는지 확인하기 쉽지 않죠. 이 때 도움이 되는 것이 온라인 채점 사이트들입니다. 유명한 온라인 채점 사이트들에는 다음과 같은 것들이 있습니다.

    다만 언어적 장벽이 있고, 처음 접근하는 사람에게는 아무래도 쉽지 않은 것이 사실이지요. 그래서 탄생한 것이 알고스팟 온라인 저지 (AOJ), 통칭 아오지 탄광입니다. :-)

    첫 번째 문제 풀어보기

    AOJ 의 오른쪽 메뉴의 Browse Problems 밑의 메뉴에서 문제 목록을 보실 수 있습니다. 맨 처음 시작하기 가장 좋은 곳은 튜토리얼 문제 목록 인데요, "Browse By Source" (출처로 검색하기) 에서 찾으실 수 있습니다. 해당 메뉴는 각 문제들이 출제된 대회별로 검색할 수 있는 기능입니다.

    (.. 물론 이 글을 쓰는 지금은 한 문제밖에 없습니다. -_-;)

    HELLOWORLD 문제 를 풀어 봅시다. 사람의 이름을 입력받고, 안녕! 이라고 대답해 주는 프로그램이죠. 프로그래밍을 처음 배울 때 다 짜 보는 프로그램입니다.

    입출력

    AOJ 에서 프로그램은 모두 표준 입력 (standard input) 에서 입력을 읽어들이고, 표준 출력 (standard output) 으로 출력을 보냅니다. C 로 말하자면 scanf/printf 를 쓰고, C++ 에서는 cin/cout, Java 에서는 System.in 과 System.out 을 쓰는 셈이지요. 프로그래밍을 처음 배울 때 짰던 콘솔 프로그램을 짠다고 생각하시면 됩니다.

    정답 기준

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

    아오지에서는 표준 출력 외에 표준 오류 (standard error) 출력 또한 전부 답으로 처리되니 유의하세요. 표준 오류에 메시지를 출력하면 오답으로 처리됩니다.

    테스트 케이스

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

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

    한 가지 프로그래밍 대회를 처음 접하는 사람들이 흔히 하는 실수는, 한 번에 입력을 다 읽어들여 저장한 뒤 답을 계산하고 한번에 출력하는 것입니다. 아오지는 모든 출력을 한 번에 모아서 정답 여부를 판정하기 때문에, 한 번에 한 개의 예제를 읽어들여, 답을 구하고 출력하는 것을 반복해도 괜찮습니다.

    시간 제한과 메모리 제한

    프로그램이 효율적인 알고리즘을 쓴다는 것을 검증하기 위해, 프로그램이 사용할 수 있는 시간과 메모리를 제한합니다. 대개의 경우 이 값은 기본적으로 1초와 64MB 이며, 문제 맨 위에 명시되어 있습니다.

    각 언어로 짜 본 HELLOWORLD 문제

    그럼 실제로 프로그램을 짜 봅시다. 다음은

    파이썬

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

    C++

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

    자바: 자바의 경우에, main 메소드가 있는 클래스명은 항상 Main 이어야 합니다.

    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 + "!");
            }
        }
    }
    

    네, 아름다운 코드라고는 할 수 없지만... 가장 간단하죠. ^^

    서브밋하기

    문제 오른쪽의 제출 버튼을 누르고 소스 코드를 붙여넣으면 서브미션 결과 페이지로 이동합니다. 채점중인 답의 상태를 실시간으로 확인할 수 있습니다. 처음 제출시에는 결과가 나오기까지 시간이 걸릴 수 (~1분) 있는데, 이것은 sleep 모드에 있던 채점 서버를 깨우는 데 걸리는 시간입니다. ^^

    붉은색 AC 가 뜨셨으면 성공입니다!

    그 다음에는..

    첫 문제를 성공적으로 푸셨으면 다른 문제를 하나씩 시도해 보면서 시작하세요. Browse By Category (분류별로 보기) 메뉴의 '구현' 분류는 별다른 수학이나 전산학적 지식 없이 풀 수 있는 프로그래밍 문제들을 주로 다루기 때문에, 처음 시작하기 좋은 분류입니다.

    의외로 길어지고 있기 때문에 첫 튜토리얼은 여기서 줄이고 다음 튜토리얼을 기약하겠습니다! 앞으로 다루려고 하는 주제들은 다음과 같습니다

    • 실수 입출력
    • 문자열 입출력
    • 채점 결과 해석하기 및 런타임 에러 해석하기
    • 문제 카테고리별 간략한 소개

    의견 및 오류 보고 환영합니다! 다른 튜토리얼도 환영합니다! >.<


    13년 전
4개의 댓글이 있습니다.
  • ssamkj
    ssamkj


    12년 전 link
  • limited10
    limited10

    튜토리얼 링크가 끊어진거 같습니다.
    또 Opera 브라우져인데 댓글 입력이 비정상적입니다.


    11년 전 link
  • JongMan
    JongMan

    제보 감사드립니다. 링크들 정정했습니다.
    오페라 댓글 입력은 차차 고쳐보겠습니다. ^^;


    11년 전 link
  • Baekjoon
    Baekjoon

    이 페이지의 예제소스는 <나 >가 한번 더 이스케이프 되있네요.
    튜토리얼 쪽엔 정상적으로 나오네요.


    11년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.