대부분은 단순 vector로 구현했고, 또 while문 하나로 완성한 풀이도 있었다...
문제를 좀 더 수학적으로 접근해서 짧고 최적화된 풀이를 하겠다.
#include <string>
#include <vector>
#include <iostream>
#include <stack>
using namespace std;
int solution(int n, int w, int num) {
int answer = 0;
int i, j, line, box_line;
bool direction = true;
//n은 박스 개수
//w는 너비
//num은 꺼내야 하는 박스 번호
vector<stack<int>> box_stack(w, stack<int>());
//상자 쌓기
for(i = 1; i <= n; i++){
if(direction){//오른쪽으로 쌓기
line = (i - 1) % w;
box_stack[line].push(i);
}
else{//왼쪽으로 쌓기
line = (w - 1) - ((i - 1) % w);
box_stack[line].push(i);
}
if(i == num){//찾아야 하는 박스가 쌓인 줄 번호
box_line = line;
cout << "box_line : " << box_line << "\n";
}
if(i % w == 0){//한 층을 다 채우면
direction = !direction;
}
}
while(!box_stack[box_line].empty()){
if(box_stack[box_line].top() == num){
answer++;
cout << box_stack[box_line].top() << "\n";
break;
}
else{
answer++;
cout << box_stack[box_line].top() << "\n";
box_stack[box_line].pop();
}
}
return answer;
}
사실 모든 상자을 다 쌓을 필요가 없고, num부터 시작할 수도 있다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(int n, int w, int num) {
int answer = 0;
while(num <= n) {
cout << "계산 시작 : " << num << " -> ";
answer++;
num += (w - 1 - (w + num - 1) % w) * 2 + 1;
cout << "계산 끝 : " << num << "\n";
}
return answer;
}