inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-O

3-O 사다리 조작

217

이종현

작성한 질문수 19

0

안녕하세요 강사님 오랜만에 질문 올립니다 !

http://boj.kr/73fc760053694b58a0f206eadf8b20ef

기저사례가 좀 많기는 하지만..

모든 테케 정답 나오고, 강사님 코드와 비교했을 때 check 함수도 거의 흡사하며 재귀함수 실행 횟수가 더 효율적일 때도 있는데요...

틀렸습니다가 나오는 원인을 잘 모르겠습니다 ㅜ ㅜ

c++ 코딩-테스트

답변 1

0

큰돌

안녕하세요 종현님 ㅎㅎ

오랜만에 큰거 하나 들고오셨군요.. ㅎㅎ

저 정말 오래걸렸어요 ㅠㅠ

일단은.. 종현님의 코드가 뭐가 틀린지 위주로 해봤는데 잘 안나왔습니다.

그래서 이럴 때 제가 하는 방법이 있는데요.

처음부터 다시 짜는 방법입니다.

물론.

종현님의 코드스타일이 묻어나게 짜봤습니다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N, M, H; 
int ladder[31][11];  
int answer = 1e9;  
bool check() {
    for (int i = 1; i <= N; i++) {
        int pos = i;
        for (int j = 1; j <= H; j++) {
            if (ladder[j][pos]) {
                pos = ladder[j][pos];
            }
        }
        if (pos != i) return false;
    }
    return true;
}

void go(int cnt, int index) {
    if (cnt >= answer || cnt > 3) return;

    if (check()) {
        answer = min(answer, cnt);
        return;
    } 

    int y = (index - 1) / (N - 1) + 1;
    int x = (index - 1) % (N - 1) + 1; 
    if (y > H) return; 
    if (ladder[y][x] == 0 && ladder[y][x + 1] == 0) {
        ladder[y][x] = x + 1;
        ladder[y][x + 1] = x;
        go(cnt + 1, index + 1);
        ladder[y][x] = 0;
        ladder[y][x + 1] = 0;
    }

    go(cnt, index + 1);
}

int main() { 
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
    cout.tie(NULL);
    cin >> N >> M >> H;
    for (int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        ladder[a][b] = b + 1;
        ladder[a][b + 1] = b;
    }

    go(0, 1);
    
    if (answer > 3) cout << -1 << '\n';
    else cout << answer << '\n';
    
    return 0;
}

이렇게 하면 시간초과가 납니다.

image

이게 왜 그러냐면 이 정점에서 + 1 하면서 순차적으로 탐색하는 것..

로직상은 괜찮지만 사실 이게 엄청나게 별로긴 하거든요. 정점에서 2중for문으로 바로 다른 정점을 sparse하게 뛰는게 더 빠릅니다. 그래서 시간초과가 떠요.

사실 종현님 코드가 이렇게 시간초과가 떠야 정상인데.. 왜 틀린지는... 죄송합니다 ㅠ

 

그래서 종현님 코드스타일을 녹인 정답코드는 다음과 같구요.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N, M, H; 
int ladder[31][11];  
int answer = 1e9;  
bool check() {
    for (int i = 1; i <= N; i++) {
        int pos = i;
        for (int j = 1; j <= H; j++) {
            if (ladder[j][pos]) {
                pos = ladder[j][pos];
            }
        }
        if (pos != i) return false;
    }
    return true;
}

void go(int cnt, int y, int x) {
    if (cnt >= answer || cnt > 3) return;

    if (check()) {
        answer = min(answer, cnt);
        return;
    }  

    for (int i = y; i <= H; i++) {
        for (int j = (i == y) ? x : 1; j < N; j++) {
            if (ladder[i][j] == 0 && ladder[i][j + 1] == 0) {
                ladder[i][j] = j + 1;
                ladder[i][j + 1] = j;
                go(cnt + 1, i, j + 2);
                ladder[i][j] = 0;
                ladder[i][j + 1] = 0;
            }
        }
    }
}

int main() { 
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
    cout.tie(NULL);
    cin >> N >> M >> H;
    for (int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        ladder[a][b] = b + 1;
        ladder[a][b + 1] = b;
    }

    go(0, 1, 1); 
    
    if (answer > 3) cout << -1 << '\n';
    else cout << answer << '\n';
    
    return 0;
}

50% 부족한 답변..

죄송합니다..

 

감사합니다. 🙂

 


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


4 - A

0

7

1

코딩살구클럽 입장이 안됩니다

0

46

2

4-F 경우의 수 질문입니다.

0

29

2

코딩살구클럽 가입이 안됩니다.

0

60

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

51

1

교안 158페이지 문의드립니다

0

42

2

코딩살구클럽 관련 건의사항

0

104

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

44

1

진행 방법 질문드립니다!

0

78

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

63

2

2주차 개념#12 트리 순회

0

32

2

백준사이트가 종료된다고 합니다.

0

307

2

백준 서비스 종료

9

939

1

sk 하이닉스 코테 대비

0

382

2

3-G 최댓값 질문

0

53

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

63

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

4-H 질문 있습니다 (코드 리뷰)

0

68

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

178

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

71

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

65

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

52

2