Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions 09/14888.c++
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n;
const int ADD=0, SUB=1, MUL=2, DIV=3;
const int INF=1e9;
vector<int> num(11,0);
vector<int> 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<n;i++){
cin >> num[i];
}
for(int i=0;i<4;i++){
cin >> calc[i];
}

//연산
backtrack(0,num[0]);

//출력
cout << max_val << "\n" << min_val;

return 0;
}
43 changes: 43 additions & 0 deletions 09/15665.c++
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

int n, m;
set<int> s;
vector<int> ans;

void backtrack(int cnt){ //백트래킹
if(cnt==m){ //m개의 수를 채웠을때 재귀 호출
for(int i=0;i<m;i++){
cout<<ans[i]<<" ";
}
cout <<"\n";
return;
}
for(auto it: s){ //중복 허용하여 숫자 선택
ans[cnt]=it;
backtrack(cnt+1);
}
}

int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);

cin >> n >> m;
ans.assign(m,0);

for(int i=0;i<n;i++){ //set에 저장하여 중복 없애고 오름차순 정렬
int x;
cin >> x;
s.insert(x);
}

backtrack(0);

return 0;
}
90 changes: 90 additions & 0 deletions 09/20055.c++
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#include <deque>
#include <iostream>

using namespace std;

struct info { //벨트 정보
int power; //내구도
bool is_on; //로봇 여부
};

// 벨트 한 칸 회전
void rotateBelt(deque<info> &belt, int n) {
belt.push_front(belt.back()); //마지막 칸을 맨 앞으로 옮김
belt.pop_back();
belt[n - 1].is_on = false; //마지막 칸 로봇 내림
}

// 로봇을 움직일 수 있으면 한 칸 이동
void moveRobot(deque<info> &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<info> &belt) {
if (!belt[0].is_on && belt[0].power >= 1) {
belt[0].is_on = true;
belt[0].power--;
}
}

//내구도 확인
bool checkFinish(deque<info> &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<info> &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<info> 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;
}