3-O 사다리 조작
217
작성한 질문수 19
안녕하세요 강사님 오랜만에 질문 올립니다 !
http://boj.kr/73fc760053694b58a0f206eadf8b20ef
기저사례가 좀 많기는 하지만..
모든 테케 정답 나오고, 강사님 코드와 비교했을 때 check 함수도 거의 흡사하며 재귀함수 실행 횟수가 더 효율적일 때도 있는데요...
틀렸습니다가 나오는 원인을 잘 모르겠습니다 ㅜ ㅜ
답변 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;
}
이렇게 하면 시간초과가 납니다.

이게 왜 그러냐면 이 정점에서 + 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





