[editorial] 2007년 서울 온사이트 본선 A번 Molar Mass

  • Toivoa
    Toivoa

    A번 답게 가장 쉬운 문제입니다. 문제를 간단히 정리하면 분자식이 주어졌을 때 이 분자의 총 질량을 구하는 것입니다.
    분자식에 괄호같은 것도 없고, 원소도 C, H, O, N 뿐인 간단한 입력들만 들어오기 때문에 간단히 입력된 문자열을 파싱해서 답을 구하면 됩니다.
    이 정도의 파싱은 간단히 처리하셨을테지만 저는 C의 char*을 이용해서 다음과 같은 식으로 파싱했습니다.

    int solve(char *s)
    {
            int mass = 0;
            int ret = 0;
            while (*s != 0)
            {
                    if (*s >= 48 && *s <= 57)       // 48과 57은 각각 '0'과 '9' 입니다.
                    {
                            ret += mass * atoi(s);  // 숫자를 만나면 숫자 * 질량을 더한다.
                            while (*s >= 48 && *s <= 57) s++;       // 숫자 부분을 건너뛴다.
                            mass = 0;               // 질량을 0으로
                            continue;
                    }
                    ret += mass;    // 원소 기호가 연속적으로 나오는 경우를 위해 질량을 더한다.
                    if (*s == 'C') mass = 12010;    // 해당 원소 기호에 따라 질량을 넣어준다
                    if (*s == 'H') mass = 1008;
                    if (*s == 'O') mass = 16000;
                    if (*s == 'N') mass = 14010;
                    s++;
            }
            ret += mass;            // 원소기호로 끝나는 경우를 위해 마지막으로 질량을 더한다
            return ret;
    }
    
    • 컴퓨터 상에서 실수 표현의 한계 때문에 오차가 생길 수 있으니 가능하다면 정수로 계산하는 것이 좋습니다.
      [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

    16년 전
16개의 댓글이 있습니다.
  • JongMan
    JongMan

    C++ 이라면 헤더에 있는 isdigit() 함수를 사용하는 것도 좋습니다. :)


    16년 전 link
  • Toivoa
    Toivoa

    header 이름이 cctype인걸 보면 C에서도 쓰면 되는거 아니야?


    16년 전 link
  • JongMan
    JongMan

    아, 응, 맞아.


    16년 전 link
  • Taeyoon_Lee
    Taeyoon_Lee

    다행히 double로 계산해도 AC받을 수 있었어요.


    16년 전 link
  • sooshia
    sooshia

    소스가 참 간결하네요.


    16년 전 link
  • sooshia
    sooshia

    0, 9 정도의 char의 아스키코드는 외우고 계시나요?


    16년 전 link
  • JongMan
    JongMan

    그거 다들 외우고 있는 것 같은데.. C 에선 그냥 '0' '9' 써도 똑같은데;;
    과거의 습관인듯 하군요 -_-;


    16년 전 link
  • sooshia
    sooshia

    고수의 세계군요 +_+ ㅎㅎㅎ
    제가 외우고 있는건 A가 65다 정도?


    16년 전 link
  • 최치선
    최치선

    변태의 세계일듯 ㄲㄲ


    16년 전 link
  • sooshia
    sooshia

    자조적인 분위기 좋습니다. ㅋㅋ


    16년 전 link
  • Toivoa
    Toivoa

    너도 외우지 않아? 난 8, 13, 32, 48, 57, 65, 90, 97, 122 밖에 몰라 -_-q


    16년 전 link
  • hyunhwan
    hyunhwan

    그정도면 변태 인정


    16년 전 link
  • DongJoo
    DongJoo

    그정도면 변태인정2


    16년 전 link
  • JongMan
    JongMan

    그 정도면 변태 인정 3


    16년 전 link
  • helloneo
    helloneo

    아스키코드가 머에요..?


    16년 전 link
  • Being
    Being

    0x30 ~ 0x39 ㅋㅋㅋㅋㅋㅋㅋ


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