diff --git a/09/14888.c++ b/09/14888.c++ new file mode 100644 index 0000000..64e122e --- /dev/null +++ b/09/14888.c++ @@ -0,0 +1,71 @@ +#include +#include +#include + +using namespace std; + +int n; +const int ADD=0, SUB=1, MUL=2, DIV=3; +const int INF=1e9; +vector num(11,0); +vector calc(4,0); +int max_val=-INF, min_val=INF; + +void backtrack(int cnt, int ans){ //백트래킹 + //연산자를 다 쓴 경우 재귀 호출 종료 + if(cnt==n-1){ + max_val=max(max_val,ans); //최댓값 저장 + min_val=min(min_val,ans); //최솟값 저장 + return; + } + //연산 + for(int i=0;i<4;i++){ + if(calc[i]==0){ //연산 기호 다 씀 (연산 끝) + continue; + } + calc[i]--; //연산 + int new_ans=0; + switch(i){ + case ADD: + new_ans = ans + num[cnt+1]; + break; + case SUB: + new_ans = ans - num[cnt+1]; + break; + case MUL: + new_ans = ans*num[cnt+1]; + break; + case DIV: + new_ans = ans / num[cnt+1]; + break; + } + + backtrack(cnt+1, new_ans); + calc[i]++; //연산자 반납 + + } +} + + +int main() +{ + ios_base::sync_with_stdio(false); + cin.tie(NULL); cout.tie(NULL); + + //입력 + cin >> n; + for(int i=0;i> num[i]; + } + for(int i=0;i<4;i++){ + cin >> calc[i]; + } + + //연산 + backtrack(0,num[0]); + + //출력 + cout << max_val << "\n" << min_val; + + return 0; +} \ No newline at end of file diff --git a/09/15665.c++ b/09/15665.c++ new file mode 100644 index 0000000..4fc955a --- /dev/null +++ b/09/15665.c++ @@ -0,0 +1,43 @@ +#include +#include +#include +#include + +using namespace std; + +int n, m; +set s; +vector ans; + +void backtrack(int cnt){ //백트래킹 + if(cnt==m){ //m개의 수를 채웠을때 재귀 호출 + for(int i=0;i> n >> m; + ans.assign(m,0); + + for(int i=0;i> x; + s.insert(x); + } + + backtrack(0); + + return 0; +} \ No newline at end of file diff --git a/09/20055.c++ b/09/20055.c++ new file mode 100644 index 0000000..5b8ea8b --- /dev/null +++ b/09/20055.c++ @@ -0,0 +1,90 @@ +#include +#include + +using namespace std; + +struct info { //벨트 정보 + int power; //내구도 + bool is_on; //로봇 여부 +}; + +// 벨트 한 칸 회전 +void rotateBelt(deque &belt, int n) { + belt.push_front(belt.back()); //마지막 칸을 맨 앞으로 옮김 + belt.pop_back(); + belt[n - 1].is_on = false; //마지막 칸 로봇 내림 +} + +// 로봇을 움직일 수 있으면 한 칸 이동 +void moveRobot(deque &belt, int n) { + for (int i = n - 2; i >= 0; i--) {//뒤에서부터 로봇 위치 확인 + if (!belt[i].is_on) { + continue; + } + //다음 칸에 로봇이 없고 내구도가 0이 아니라면 로봇 한 칸 전진 + if (!belt[i + 1].is_on && (belt[i + 1].power >= 1)) { + belt[i].is_on = false; + belt[i + 1].is_on = true; + belt[i + 1].power--; + } + + belt[n - 1].is_on = false; //마지막 칸 로봇 내림 + } +} + +//올리는 위치에 로봇을 올릴 수 있으면 올림 +void putRobot(deque &belt) { + if (!belt[0].is_on && belt[0].power >= 1) { + belt[0].is_on = true; + belt[0].power--; + } +} + +//내구도 확인 +bool checkFinish(deque &belt, int n, int k) { + int count = 0; + + for (int i = 0; i < 2 * n; i++) { + if (belt[i].power == 0) { + count++; + } + } + + return count >= k; +} + +int solution(deque &belt, int n, int k) { + int step = 1; + while (true) { //한 단계 + // 벨트 회전 + rotateBelt(belt, n); + // 로봇 이동 + moveRobot(belt, n); + // 로봇 올리기 + putRobot(belt); + + // 내구도 확인 + if (checkFinish(belt, n, k)) { + return step; + } + step++; + } +} + + +int main() { + // 입력 + int n, k; + cin >> n >> k; + deque belt(2 * n); //회전에 유리한 deque사용 + for (int i = 0; i < 2 * n; i++) { //내구도 저장 + cin >> belt[i].power; + belt[i].is_on = false; + } + + // 연산 + int answer = solution(belt, n, k); + + // 출력 + cout << answer; +} \ No newline at end of file