시계 맞추기(CLOCKSYNC) 질문있습니다.

  • sgc109
    sgc109

    CLOCKSYNC

    우선 재귀적으로 완전탐색을 구현하여 각각의 10개의 스위치에 대해 0번~3번을 누르게 해서
    총 4^10 가지를 검사하여 결과적으로 모든 시계가 12시가 된 경우는 총 몇번의 스위치를 눌렀는지(pressed 변수) 를 반환하여 가장작은 횟수를 min 변수에 넣었고 만약 모든 경우에 불가능하다면 기본값인 987654321 을 반환 하게 했습니다.

    문제에서 주어진 테스트케이스는 모두 올바른 결과가나왔고
    추가적으로 몇가지 케이스에 대해 테스트를 해봤는데 올바른 결과가 나왔습니다(저의 생각으론 올바른 결과인데 맞는지 봐주시면감사하겠습니다.)
    1. 한 스위치만 한번 누르면 되는 경우
    (9 9 9 12 12 12 12 12 12 12 12 12 12 12 12 12)
    2. 한 스위치를 세번 누르면 되는경우
    (3 3 3 12 12 12 12 12 12 12 12 12 12 12 12 12)
    3. 모든 스위치를 한번씩 누르면 되는경우
    (3 6 3 12 9 12 6 12 9 6 6 9 9 9 12 12)
    4. 모든 스위치를 세번씩 누르면 되는경우
    (9 6 9 12 3 12 6 12 3 6 6 3 3 3 12 12)
    5. 0번 시계만 9시 나머지시계는 12시인 경우(불가능한 경우(아마))
    (9 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12)

    #include<iostream>
    #define FOR(i,n) for(int i=0; i <n; i++)
    
    using namespace std;
    
    int mySwitch[10][5] = { { 0, 1, 2,-1,-1 }, { 3, 7, 9, 11 ,-1}, { 4, 10, 14, 15,-1 }, { 0, 4, 5, 6, 7 }, { 6, 7, 8, 10, 12 }, { 0, 2, 14, 15 ,-1}, { 3, 14, 15,-1,-1 }, { 4, 5, 7, 14, 15 }, { 1, 2, 3, 4, 5 }, { 3, 4, 5, 9, 13 } };
    
    int press_switch(int clock[17], int pressed, int cur) {
        if (cur == 10) {
            FOR(i, 16){
                if (clock[i] % 4 != 0) return 987654321;
            }
            return pressed;
        }
        int min = 987654321;
        FOR(i, 4) {
            for (int j = 0; mySwitch[cur][j] != -1 && j < 5; j++) {
                clock[mySwitch[cur][j]] += (1 * i);
            }
    
            int cnt = press_switch(clock, pressed + i, cur + 1);
            if (min > cnt) min = cnt;
    
            for (int j = 0; mySwitch[cur][j] != -1 && j < 5; j++) {
                clock[mySwitch[cur][j]] -= (1 * i);
            }
        }
        return min;
    }
    
    
    int main() {
        int C;
        cin >> C;
        while (C--) {
            int clock[17] = { 0, };
            FOR(i, 16) {
                int tmp;
                cin >> tmp;
                tmp %= 12;
                tmp /= 3;
                clock[i] = tmp;
            }
            int ans = press_switch(clock, 0, 0);
            if (ans == 987654321) cout << -1 << endl;
            else cout << ans << endl;
        }
    
        return 0;
    }
    

    9년 전
4개의 댓글이 있습니다.
  • jseo
    jseo

    mySwitch[cur][j] != -1 && j < 5 ==> j < 5 && mySwitch[cur][j] != -1

    로 바꾸니까 정답으로 되네요. illegal memory access가 일어나서 그러는것 같은데... 왜 RTE가 아닌 오답으로 처리되는지 저도 잘은 모르겠네요.


    9년 전 link
  • sgc109
    sgc109

    앗 그 부분을 놓쳤네요..!! 와 직접 작성한 코드도 아닌데 어떻게 발견하셨는지.. 대단하십니다.ㅎㅎ 감사힙니다!


    9년 전 link
  • sgc109
    sgc109

    jseo


    9년 전 link
  • icuris
    icuris

    후자는 j<5로 미리 처리해버려서 그런거고 전자는 j가 4까지만 있어야하는데 j=5로 access해서 그런 오류가 나는거 아닐까요?


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