#1 k번째 수 https://school.programmers.co.kr/learn/courses/30/lessons/42748

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    vector<int> answer;
    for (int y = 0; y < commands.size(); ++y) {
        vector<int> vect;
        for (int x = commands[y][0] - 1; x < commands[y][1]; ++x) {
            vect.push_back(array[x]);
        }
        sort(vect.begin(), vect.end());
        answer.push_back(vect[commands[y][2] - 1]);
    }
    return answer;
}

 

 

#2 회전하는 큐 https://www.acmicpc.net/problem/1021

 

문제 이해가 한 동안 되지 않았다, 이 설명 통해 문제를 이해했다. 

https://www.acmicpc.net/board/view/65693 

 

글 읽기 - 문제가 이상한 것 같습니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

백트랙킹으로 모든 경우의 수 중 최소 좌/우 밀어내는 횟수 값을 출력하고자 했는데, 좌/우 동시에 진행되는 경우 무한루프에 빠져 tc3, tc4를 출력하지 못하는 문제가 발생했다(tc1, tc2는 출력됬지만, 사실상 스택오버플로우 문제가 발생한거다)

 

중복발생 방지로  used 배열 사용하면 ? 구현이 복잡해질 듯 하다. 백트랙킹은 적합해보이지 않는다.

 

틀림.

#include<iostream>
#include<deque>
#include<vector>
using namespace std;

/*
* 재귀로 모든 경우의 수 찾아서 그 중 작은 횟수를 구할 것.
con is condition meaning,   when con1_cnt == 3 , then return;
until con1_cnt ==3 , con2_cnt + con3_cnt is mini then that is result.
*/
int mini = 10e7;

int N, M;
void run(deque<int>dq, deque<int>target, int con1_cnt, int con2_cnt, int con3_cnt) {
    if (mini < con2_cnt + con3_cnt)return; // 가지치기
    if (con1_cnt == M) { // M개 모두 검사했으면 Return 
        if (con2_cnt + con3_cnt < mini) {
            mini = con2_cnt + con3_cnt;
        }
        return;
    }

    //if (target.size() == 1) {
    //    cout << "bug" << endl;
    //    return;
    //}
  //  stack over flow?  why

    deque<int>dq_backup = dq;
    deque<int>target_backup = target;

    // 0: 뽑기, 1: 왼쪽으로 한칸 이동  , 2: 오른쪽으로 한칸 이동

    //0. 뽑기
    if (dq.front() == target.front()) {
        dq.pop_front();
        target.pop_front();
        run(dq, target, con1_cnt + 1, con2_cnt, con3_cnt);
        dq = dq_backup;
        target = target_backup;
    }
    // 1. 왼쪽이동
    dq.push_back(dq.front());
    dq.pop_front();
    run(dq, target, con1_cnt, con2_cnt + 1, con3_cnt);
    dq = dq_backup;
    target = target_backup;

    //2. 오른쪽 이동
    dq.push_front(dq.back());
    dq.pop_back();
    run(dq, target, con1_cnt, con2_cnt, con3_cnt + 1);
    dq = dq_backup;
    target = target_backup;

}
int main(void) {
    cin >> N >> M;
    deque<int> dq;
    deque<int>target;
    for (int x = 1; x <= N; x++) {
        dq.push_back(x);
    }
    for (int x = 0; x < M; ++x) {
        int t;
        cin >> t;
        target.push_back(t);
    }
    run(dq, target, 0, 0, 0);
    cout << mini << endl;
}

 

 

멘토님으로부터 힌트를 얻어 중간 인덱스를 활용해 문제를 해결했다. 

 

정답.

/*
사이즈의 가운데 인덱스 와 타겟 값의 인덱스의 차이가 - 냐 +냐 즉
중간 인덱스 - 타겟 값의 인덱스 == + 면 좌측으로 밀기
-이면 우측으로 밀기.
while 이용
 while는 무한루프이나 조건문 달기, Target 벡터가 없다면 루프 끝내기
밀기 조건.

한쪽에만 치우쳐서 밀면 안됨, 
1,2,3,4,5,6,7,8,9,10
tar: 6, 8, 2 
에서 한쪽에만 치우치면 안됨, 중간인덱스 기준으로 어느쪽에 tar 인덱스가 치중됬는지 확인하고 밀어야함.. 
*/

#include<iostream>
#include<deque>
using namespace std;

int main(void) {
	int N, M, cnt = 0;
	deque<int>dq;
	deque<int>tar; //target
	scanf("%d %d", &N, &M);
	for (int x = 1; x <= N; ++x) {
		dq.push_back(x);
	}
	for (int x = 0; x < M; ++x) {
		int t;
		scanf("%d", &t);
		tar.push_back(t);
	}
	while (!tar.empty()) {
		int idx = -1;
		for (int x = 0; x < dq.size(); x++) {
			if (dq[x] == tar.front()) {
				idx = x;
				break;
			}
		}
		int dqSizeHalf = dq.size() / 2;
		if (dqSizeHalf - idx >= 0) {
		//+
			while (tar.front()!=dq.front()) { // 왼쪽으로 이동,  target 값을 찾을 때까지
				dq.push_back(dq.front());
				dq.pop_front(); // 왼쪽으로 이동 (spin)
				cnt++;
			}
			tar.pop_front();
			dq.pop_front();
		}
		else { // 0 또는 -
			while (tar.front() != dq.front()) { // 우측 이동
				dq.push_front(dq.back());
				dq.pop_back();
				cnt++;
			}
			tar.pop_front();
			dq.pop_front();
		}
	}
	cout << cnt << endl;
}

 

 

제출코드 ( print형식 c style로 통일)

#include<cstdio>
#include<deque>
using namespace std;

int main(void) {
	int N, M, cnt = 0;
	deque<int>dq;
	deque<int>tar;
	scanf("%d %d", &N, &M);
	for (int x = 1; x <= N; ++x) {
		dq.push_back(x);
	}
	for (int x = 0; x < M; ++x) {
		int t;
		scanf("%d", &t);
		tar.push_back(t);
	}
	while (!tar.empty()) {
		int idx = -1;
		for (int x = 0; x < dq.size(); x++) {
			if (dq[x] == tar.front()) {
				idx = x;
				break;
			}
		}
		int dqSizeHalf = dq.size() / 2;
		if (dqSizeHalf - idx >= 0) {
			while (tar.front() != dq.front()) { 
				dq.push_back(dq.front());
				dq.pop_front(); 
				cnt++;
			}
			tar.pop_front();
			dq.pop_front();
		}
		else {
			while (tar.front() != dq.front()) {
				dq.push_front(dq.back());
				dq.pop_back();
				cnt++;
			}
			tar.pop_front();
			dq.pop_front();
		}
	}
	printf("%d", cnt);
}

'프로그래머스 > 코딩테스트' 카테고리의 다른 글

4주차 과제(cpp)  (0) 2023.01.09
1일차 기초스터디(개념)  (0) 2022.12.13

+ Recent posts