[5_R]문제해설에서 100의 의미가 무엇인가요?
252
작성한 질문수 8
안녕하세요!
문제 해설 : http://boj.kr/db0d13a9155748f38feda4624064efd9
에서, move함수나 ismal함수에 '인덱스가 100이면' 이라는 조건이 있는데 이 부분이 잘 이해가 안됩니다. ㅜㅜ.
말이 윳놀이 판에서 통과한 경우를 의미하신건가요??
만약 그렇다면, 다른 값이 아니라 100이라고 주신 이유가 있나요?
감사합니다!
답변 1
0
안녕하세요 ㅎㅎ
말이 윳놀이 판에서 통과한 경우를 의미하신건가요??
>> 네 맞습니다. 판에서 벗어나는 경우를 의미합니다.
만약 그렇다면, 다른 값이 아니라 100이라고 주신 이유가 있나요?
>> 판에서 벗어나는 특정값으로 하기만 하면 됩니다. 100은 제 스타일인데요. ㅎㅎ
일단 제가 만든 맵을 보면 1 ~ 31까지의 번호를 적어서 구현을 했죠?
그 외의 번호로 한 것이다 라고 보시면 됩니다.
참고로 100이아닌 이렇게 하셔도 됩니다.
#include<bits/stdc++.h>
using namespace std;
const int INF = 987654321;
int a[14], mal[4], n = 10;
int v[104];
vector<int> adj[54];
int move(int here, int cnt){
if(here == 1201) return 1201;
if(adj[here].size() >= 2){
here = adj[here][1]; cnt--;
}
if(cnt){
queue<int>q;
q.push(here);
int there;
while(q.size()){
int x = q.front(); q.pop();
there = adj[x][0];
q.push(there);
if(there == 1201)break;
cnt--;
if(cnt == 0)break;
}
return there;
}else return here;
}
bool isMal(int mal_idx, int idx){
if(mal_idx == 1201) return false;
for(int i = 0; i < 4; i++){
if(i == idx) continue;
if(mal[i] == mal_idx) return true;
}
return false;
}
void add(int here, int there){
adj[here].push_back(there);
}
void setMap(){
for(int i = 0; i <= 19; i++) add(i, i + 1);
add(5, 21); add(21, 22); add(22, 23); add(23, 24);
add(15, 29); add(29, 30); add(30, 31);add(31, 24);
add(10, 27); add(27, 28); add(28, 24); add(24, 25);
add(25, 26); add(26, 20); add(20, 1201);
v[1] = 2; v[2] = 4; v[3] = 6; v[4] = 8; v[5] = 10;
v[6] = 12; v[7] = 14; v[8] = 16; v[9] = 18; v[10] = 20;
v[11] = 22; v[12] = 24; v[13] = 26; v[14] = 28; v[15] = 30;
v[16] = 32; v[17] = 34; v[18] = 36; v[19] = 38; v[20] = 40;
v[21] = 13; v[22] = 16; v[23] = 19; v[24] = 25;
v[27] = 22; v[28] = 24; v[25] = 30; v[26] = 35;
v[29] = 28; v[30] = 27; v[31] = 26;
}
int go(int here){
if(here == n) return 0;
int ret = 0;
for(int i = 0; i < 4; i++){
int temp_idx = mal[i];
int mal_idx = move(temp_idx, a[here]);
if(isMal(mal_idx, i)) continue;
mal[i] = mal_idx;
ret = max(ret, go(here + 1) + v[mal_idx]);
mal[i] = temp_idx;
}
//cout << "RET : " << ret << "\n";
return ret;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);setMap();
for(int i = 0; i < n; i++) cin >> a[i];
cout << go(0) << "\n";
return 0;
}
참고로 1201은 제 생일입니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
4 - A
0
9
1
코딩살구클럽 입장이 안됩니다
0
48
2
4-F 경우의 수 질문입니다.
0
30
2
코딩살구클럽 가입이 안됩니다.
0
63
2
살구 클럽에 대한 질문있습ㄴ디ㅏ
0
53
1
교안 158페이지 문의드립니다
0
43
2
코딩살구클럽 관련 건의사항
0
105
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
44
1
진행 방법 질문드립니다!
0
78
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
63
2
2주차 개념#12 트리 순회
0
32
2
백준사이트가 종료된다고 합니다.
0
307
2
백준 서비스 종료
9
943
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
179
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
71
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
65
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
53
2





