a = 0, b = 1 이라고 놓고 저거 지금 공 3개 뽑는 거니까 {0,0,0}, {0,0,1}, {0,1,0}, {0,1,1}, {1,0,0}, {1,0,1}, {1,1,0}, {1,1,1} 이렇게 8가지 경우를 모두 본다. 이 중 a가 2개, b가 1개가 아닌 경우는 skip하면 너가 원하는 게 돼.
ㅅㅅㅅ(218.51)2015-12-01 23:41
출력할 때만 0 => a, 1 => b로 바꾸면 돼.
ㅅㅅㅅ(218.51)2015-12-01 23:41
current 는 현재 조합이고. current[0] < count(ball) 은 첫번째 숫자가 2보다 작은지 본 거야. 2, 0, 0이 되는 순간 더 이상 조합이 없기 때문에 반복을 종료해야 되거든.
ㅅㅅㅅ(218.51)2015-12-01 23:42
current[last]++; 는 맨 마지막 자리를 하나 올리는 거고. 근데 그게 2가 되어버릴 수 있으니깐, for 문으로 2가 넘는 자리는 0으로 만들고 이전 자리에 덧셈을 수행한다.
pseudo code로 올린다.
ball = {a, b};
// ball_number = {0, 1};
current = {0, 0, ..., 0, -1}; // aa...a?
while( current[0] < count(ball) ) { current[last]++; for(i = last; i > 0; --i) { if(current[i] >= count(ball)) { current[i] = 0; current[i - 1]++;} } if(is_valid(ball)) { ... 출력 ... } else { continue; /* 스킵 */ } }
is_valid(...) { ... a가 2개, b가 1개인지 체크 ... }
좀 더 최적화할 여지가 많지만, 일단 바로 무식하게 짜보면 저렇게 짤 수 있어.
for 문 안의 if 문에 else 추가해서 break; 붙이는 걸 깜빡했네.
음 어렵네여 감사합니당
근데 ball이 뭔가요??
추첨 공.
a = 0, b = 1 이라고 놓고 저거 지금 공 3개 뽑는 거니까 {0,0,0}, {0,0,1}, {0,1,0}, {0,1,1}, {1,0,0}, {1,0,1}, {1,1,0}, {1,1,1} 이렇게 8가지 경우를 모두 본다. 이 중 a가 2개, b가 1개가 아닌 경우는 skip하면 너가 원하는 게 돼.
출력할 때만 0 => a, 1 => b로 바꾸면 돼.
current 는 현재 조합이고. current[0] < count(ball) 은 첫번째 숫자가 2보다 작은지 본 거야. 2, 0, 0이 되는 순간 더 이상 조합이 없기 때문에 반복을 종료해야 되거든.
current[last]++; 는 맨 마지막 자리를 하나 올리는 거고. 근데 그게 2가 되어버릴 수 있으니깐, for 문으로 2가 넘는 자리는 0으로 만들고 이전 자리에 덧셈을 수행한다.
근데 생각해 보니 슈도 코드 잘못 썼다.
어렵네열..
http://ideone.com/oX3SVO
걍 실제로 짜봤다.
for 문에 break; 넣는 거 또 까먹었다 ㅡㅡㅋ 그거 추가했음.
http://ideone.com/wt0QKN
감사합니다