ACM IPCP 2010 대전 본선 problem C. Password 질문올립니다.

  • freedomJ
    freedomJ

    이 문제... 예전에 코딩해서 솔루션은 도출했는데, 채점서버가 계속 런타임에러를 뱉어서...; 결국 다음문제로 그냥 넘어간 슬픈사연이 ㅠㅠ

    문제를 간략히 요약하면 다음과같습니다.
    이 문제에서 password는 5글자이고, Password는 6*5 행렬로 줍니다. 행은 별의미 없고, 1열부터 5열까지 각 열 위치에 해당 Password를 포함하고 있으면 됩니다.
    예를 들어 Password가 COMPU라고 가정하면, 비밀번호입력을 아래와 같이 준다면 통과가 됩니다.

    AYGSU
    DOMRA
    CPFAS
    XBODG
    WDYPK
    RBCDE
    또는
    CBOPT
    DOSBG
    GTRAR
    APMMS
    WSXNU
    EFGHI

    1열에 C가 존재하고, 2열에 O, 3열에 M, 4열에 P 5열에 U가 각각 존재하기 때문입니다.
    따라서 5글자의 PASSWORD로 여러가지 INPUT이 존재할 수 있습니다. (PASSWORD 입력인 6*5 행렬을 GRID라 하겠습니다.)

    문제의 INPUT은 2개의 GRID와 Order k가 주어집니다. (k의 범위는 1이상 7777미만 입니다.)
    그럼 2개의 GRID로 비밀번호가 될 수 있는 후보들이 나오겠지요.
    그중에 k번째 password를 출력하는 문제입니다.
    물론 2개의 GRID로 보았을때 k개의 비밀번호 후보가 없는경우 No를 출력하면 됩니다.

    스포일러 box 어떻게 사용하는지 몰라서...; 저의 생각을 적어봅니다 ( ;;; )

    저는 이 문제 접근을 입력받은 2개의 6*5 그리드와 같은 크기의 6*5 CHAR 행렬을 만들고
    2개의 GRID중에 각 열별로 중복되는 부분만 넣습니다. (이때 몇개씩 중복되는지도 체크)
    예제의 경우 예를 들면
    AOGAU
    DPMPS
    CBO
    WB
    [4 4 3 2 2] : 각 열별 중복되는 갯수
    이렇게 저장이 되고, 열단위 SORT를 한뒤, 중복값을 제거합니다.
    ABGAG
    COMPS
    DPO
    W
    [4 3 3 2 2]

    4*3*3*2*2가 K를 초과하면 계속진행하고 작거나 같으면 No를 출력하고 끝납니다.(정확히 말하면 TESTCASE를 실행합니다.)
    K번째를 뽑을때 꽤나 번잡스런 수식이 들어가지만 뽑아냅니다. (이 부분은 다소 수학적인 내용이기때문에 생략하겟습니다 ^^;)

    저는 문제를 이렇게 접근하고 풀었는데, 코딩을 잘못해서 그런지 Runtime error가 뜹니다 ㅠㅠ,
    알고리즘은 맞게 구축했는지 궁금해서 질문올립니다. 혹은 다른 해법이 있으신분은 설명 좀 부탁드립니다.

    덧붙여서 Runtime error잡는 노하우 좀 전수해주십시오(--)(__)(--)


    13년 전
4개의 댓글이 있습니다.
  • astein
    astein
    1. Test Case가 여럿인 문제에서 초기화를 제대로 하지 않은 경우
    2. 배열의 크기를 잘못 참조하는 경우 ( 혹은 잘못 선언한 경우 )

    Runtime error라면 위의 두 가지를 우선적으로 살펴보세요~


    13년 전 link
  • Taeyoon_Lee
    Taeyoon_Lee
    1. 0으로 나누는 경우가 있는지 본다.
    2. sqrt같은 실수 관련 함수를 썼다면, 잘못된 값이 들어가는 경우는 없는지 생각해본다. (예를 들자면, sqrt(x)에서 x가 -0.00000001인 경우 Runtime Error 발생)

    13년 전 link
  • wookayin
    wookayin

    런타임 에러의 대부분은 Astein 님께서 말씀해 주신 2번 경우일테니까 이를 중점적으로 살펴보시고...

    sqrt 함수가 음수가 들어왔을때 RE가 날수도 있지만 컴파일러에 따라 에러가 나지 않을 수도 있습니다. 제 기억으로는 음수 넣으면 그냥 NaN (not a number)라는 double값이 결과로 뱉어졌던 것 같네요.

    아 그리고 stack overflow 인 경우가 있는데(무한루프, or 진짜로 잘 동작하는데 스택이 몇만번씩 들어가서 부족한 경우) 이것도 참고해 보세요.


    13년 전 link
  • Being
    Being

    NaN이 발생하는 게 맞고요, NaN이 발생함에 따라 그 뒤의 로직이 전부 엉망진창이 되면서 결국엔 RTE를 뱉는 경우죠 대부분 ㅎㅎ 아예 엉뚱한 답을 찍기도 하고요.


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