JXNVCE ALGO-LOG YouJin Jung

SCPC6-PRACTICE-NUMBER-OF-INVERSION

보자마자 이렇게 풀면 안되는걸 알았는데, 혹시나 수행 시간을 보니 광탈이다… 0.000xx초도 이렇게 critical함을 깨닫는다… Number of Inversion을 구하는 가장 대표적인 알고리즘 문제 유형같다… 처음 접해보는 것에 의의를 두자…(^_^);;

inversion 문제를 접근할 수 있는 방법은 크게 3가지다!

  1. for loop iteration - 광탈
  2. merge sort
  3. AVL tree
  4. set with upper bound (아직 이해를 못함)
// TimeLimit Exceed 5.00037초 - 0점
#include <vector>
#include <iostream>

using namespace std;

int Answer;

int main(int argc, char** argv)
{
	int T, test_case;
	setbuf(stdout, NULL);

	cin >> T;
	for(test_case = 0; test_case < T; test_case++)
	{
		Answer = 0;
		
         int N; int num;
         scanf("%d", &N);
         if (N<2 || N>100000) return 0;                   
         vector<int> numbers;
         for (int i=0; i<N; i++) {
             scanf("%d", &num);
             numbers.push_back(num);
         }
         for (vector<int>::iterator it=numbers.begin(); it!=numbers.end(); ++it) 
            for (vector<int>::iterator jt=it; jt!=numbers.end(); ++jt) 
                if (*it>*jt) Answer++;

		/////////////////////////////////////////////////////////////////////////////////////////////
	
        // Print the answer to standard output(screen).
		cout << "Case #" << test_case+1 << endl;
		cout << Answer << endl;

	}

	return 0;//Your program should return 0 on normal termination.
}

우선 내가 가장 처음에 냈던 답안…(쓰레기 답안) 으로 올리지만, 나머지 방법도 내일 한번 구현해봐야겠다! 시간이 늦어서 우선 자야겠다 ;ㅅ; 갈길이 정말 정말 멀었음을 제대로 깨닫는다! 머리 꽝 🔨🔨🔨

BOJ-1068

scpc6 연습문제였던 가까운 곱셈 문제랑 Combination(조합) 관련 백트리킹 문제 풀다가 포기하고 돌아왔다,,,,, 이 문제도 트리인데 구글 없이는 못했을 것 같다… 난 언제 구글 없이 스스로 풀 수 있으려나 😥🙏🏼 아무래도 푸는 양과 강도를 많이 늘려야할 듯 싶다… 틈틈히 찾아보기도 하고…

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;

int N, x, deleteNode;
vector <int> v[51];

int find(){
	int answer = 0;
    int temp = 0;

	for(int i=0; i<N; i++){
		if(v[i].size()==0)
			answer=answer+1;
	}
	queue <int> q;
	q.push(deleteNode);

	while(!q.empty()){
		int tmp = q.front();
		if(v[tmp].size()==0){
			temp=temp+1;
		}
		else{
			for(int i=0; i<v[tmp].size(); i++)
				q.push(v[tmp][i]);
		}
		q.pop();
	}

	for(int i=0; i<N; i++){
		for(int j=0; j<v[i].size(); j++){
			if(v[i][j]== deleteNode && v[i].size()==1)
				return answer-temp+1;
		}
	}

	return answer-temp;
}
int main() {
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);

	scanf("%d", &N);

	for(int i=0; i<N; i++){
		scanf("%d", &x);
		if(x!=-1) v[x].push_back(i);
	}

	scanf("%d", &deleteNode);
    int result = find();
    printf("%d", result);

    return 0;
}

image

SCPC6-PRACTICE-NUMBER-OF-INVERSION

보자마자 이렇게 풀면 안되는걸 알았는데, 혹시나 수행 시간을 보니 광탈이다… 0.000xx초도 이렇게 critical함을 깨닫는다… Number of Inversion을 구하는 가장 대표적인 알고리즘 문제 유형같다… 처음 접해보는 것에 의의를 두자…(^_^);;

inversion 문제를 접근할 수 있는 방법은 크게 3가지다!

  1. for loop iteration - 광탈
  2. merge sort
  3. AVL tree
  4. set with upper bound (아직 이해를 못함)
// TimeLimit Exceed 5.00037초 - 0점
#include <vector>
#include <iostream>

using namespace std;

int Answer;

int main(int argc, char** argv)
{
	int T, test_case;
	setbuf(stdout, NULL);

	cin >> T;
	for(test_case = 0; test_case < T; test_case++)
	{
		Answer = 0;
		
         int N; int num;
         scanf("%d", &N);
         if (N<2 || N>100000) return 0;                   
         vector<int> numbers;
         for (int i=0; i<N; i++) {
             scanf("%d", &num);
             numbers.push_back(num);
         }
         for (vector<int>::iterator it=numbers.begin(); it!=numbers.end(); ++it) 
            for (vector<int>::iterator jt=it; jt!=numbers.end(); ++jt) 
                if (*it>*jt) Answer++;

		/////////////////////////////////////////////////////////////////////////////////////////////
	
        // Print the answer to standard output(screen).
		cout << "Case #" << test_case+1 << endl;
		cout << Answer << endl;

	}

	return 0;//Your program should return 0 on normal termination.
}

우선 내가 가장 처음에 냈던 답안…(쓰레기 답안) 으로 올리지만, 나머지 방법도 내일 한번 구현해봐야겠다! 시간이 늦어서 우선 자야겠다 ;ㅅ; 갈길이 정말 정말 멀었음을 제대로 깨닫는다! 머리 꽝 🔨🔨🔨

BOJ-2164

카드 관련 간단한 문제인데 다음번엔 리스트를 직접 구현해봐도 좋을 것 같다. 사실 구현이 귀찮아서 구글에 linked list 관련 라이브러리를 찾아봤는데, 역시나 C++ Standard Template으로 #include <list>, std::list를 잘, 아주 편하게! 사용했다. 그래서 아주아주 쉽게 금방 풀 수 있었다.

#include <iostream>
#include <string>
#include <list>

using namespace std;

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

    list<int> cards;
    int N;
    cin >> N;
    if (N<0 || N>500000) return 0;
    for (int i=0; i<N; i++) 
        cards.push_back(i+1);
    
    int count = 0;
    while (cards.size()!=1) {
        if (count%2==0) {
            cards.pop_front();
            count++;
        }
        else if(count%2==1) {
            int temp = cards.front();
            cards.pop_front();
            cards.push_back(temp);
            count++;
        }
    }
    cout << cards.front() << endl;
}

image

덕분에 오늘도 일찍 취침 가능…! 오늘 연차였고 내일부터 다시 출근 ㅜㅜ이라… 걱정이 이만저만이 아니다…

meme

BOJ-2812

간단한 스택 문제로 시간이 없다는 핑계로 전에 풀었던 문제를 리뷰했다…

#include <iostream>
#include <string>
#include <stack>

using namespace std;

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

    int size, erase;
    stack<int> st;
    string num;
  
    cin >> size >> erase;
    cin >> num;

    for(int i=0; i<size ; ++i){
        while(!st.empty() && num[i]-'0'>st.top() && erase>0){
            st.pop();
            erase--;
        }
        st.push(num[i]-'0');
    }
  
    while(erase>0){
        st.pop();
        --erase;
    }

    stack<int> ans;

    while(!st.empty()){
        ans.push(st.top());
        st.pop();
    }

    while(!ans.empty()){
        cout << ans.top();
        ans.pop();
    }

    cout << "\n";
    return 0;
}

image

미루는 습관 버릇을 고치자… 내일 금요일이니까 조금만 힘내쟈,,,, 주말엔 더 난이도 있는거 풀기로 약속 ㅜㅜ