JXNVCE ALGO-LOG YouJin Jung

BOJ-1003


BOJ-1010

처음에 틀리고, 질문게시판에 들러 슬쩍 답변을 보았는데 이번 문제는 자료형 문제가 아니라, 조합의 점화식을 이용하고, OVERFLOW가 나지 않도록 유의해야하는 문제라는 답변을 보고 잠깐 고민하다가 수월하게 수정할 수 있었다. 그리고 잘 사용할 줄 몰랐던 <utility> 라이브러리의 pair개념도 적용해보기도 했다. 하핫… 😅

평소에 nCr 조합식을 풀때 접근했던 뇌피셜 방식이 있었는데, 이게 이번 문제 푸는데 많이 도움이 되었다. 만약 조합의 정의만 알고 접근했다면 오버플로우 다루는데에 까다로웠을 법도 하다.

#include <iostream>
#include <utility>
#include <vector>

using namespace std;

int comb(int n, int r) {
    long long nume = 1, de = 1;
    for (int i=r; i>=1; i--) {
        nume=nume*n;
        n--;
        de=de*i;
    }
    return int(nume/de);
}

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

    int T, N, M;
    cin >> T;

    vector<pair<int, int>> p, t;
    
    for (int i=0; i<T; i++) {
        cin >> N >> M;
        pair<int, int> q = make_pair(N,M);
        t.emplace_back(q);
    }

    for (int i=0; i<T; i++) {
        pair<int, int> q = (t.back());
        t.pop_back();
        p.emplace_back(q);
    }

    for (int i=0; i<T; i++) {
        int count = 0;
        int n = p.back().second;
        int r = p.back().first;
        if (0<r<=n && r<=n<30) {
            if (n==r) count = 1;
            else {
                if (r>n/2) r = n-r;
                count = comb(n, r);
            }
            p.pop_back();
            cout << count << endl;
        }
    }
    return 0;
}

오랜만에 수학(?) 문제 푸니까 재밌었고, 풀면 풀수록 오기가 생겼는데 그래서 너무 재밌게 풀었다. 간만에 뇌가 말랑해진 것 같은 느낌?!?@ 허허…^_ㅠ! 🧠🧠

image

BOJ-2225

long long과 같은 데이터타입과 문제마다 필요한 값 define이 아직까진 서툴고 낯설다. 어떻게 저렇게 생각해서 풀었지…싶은 너무 대단한 분들이 많다ㅠㅠ!! 스펀지처럼 흡수하는 수 밖에… 🙏🏼😭😭

#include<iostream>
 
#define MAX 201
#define Moduler 1000000000

using namespace std;
 
int N, K;
long long DP[MAX][MAX];
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);  cout.tie(NULL);

    cin >> N >> K;

    for (int i = 0; i <= N; i++){
        DP[1][i] = 1;
    }
 
    for (int k = 2; k <= K; k++) {
        for (int n = 0; n <= N; n++) {
            for (int i = 0; i <= n; i++) {
                DP[k][n] = DP[k][n] + DP[k - 1][i];
            }
            DP[k][n] = DP[k][n] % Moduler;
        }
    }
 
    cout << DP[K][N] << endl;
 
    return 0;
}

내일은 월간 밋업이 있는 날인데 밋업에 짧은 GCE 발표 소개를 하게되었는데 준비를 하나도 못했다… 방금까지 슬라이드 만드느라 고생했다… 생각보다 한시간이면 끝날 줄 알았는데 사소한 디자인부터 내용 정리에 자료 검색까지 생각보다 시간이 많이 걸려서 힘들었다ㅜㅜ 세시간반정도 걸렸는데… 그래서 내일까지 해야하는 많은 것들을 다 못했다… 오늘 잠은 글렀다(이러면서 잘잠 ㅠㅠ)(왜 머리가 아프냐…)

image

SCPC-PRACTICE-ROUND1-FRIENDS.md

Recursion을 사용해 아주 느린 코드… 🤦🏼‍♀️🤦🏼‍♀️

#include <iostream>

using namespace std;

int Answer, N;

void collect(int* arr, int* cmp, int j) {
    int i = arr[j];
    cmp[j] = 0;
    if (i+j>N) return;
    else if (cmp[i+j]==0) {
        Answer--;
        return;
    }
    else if (i<=N) {
        collect(arr, cmp, i+j);
    }
    else return;
}

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;
		/////////////////////////////////////////////////////////////////////////////////////////////
        cin >> N;
        int *arr = new int[N+1];
        int *cmp = new int[N+1];
        arr[0] = 0; cmp[0] = 0;
        for (int i=1; i<=N; i++) {
            int num;
            cin >> num;
            if (num<=0 || num>N) return 0;
            else {
                arr[i] = num;
                cmp[i] = num;
            }
        }

        for (int i=1; i<=N; i++) {
            if (cmp[i]==0) continue;
            else {
                collect(arr, cmp, i);
                Answer++;
            }
        }
		/////////////////////////////////////////////////////////////////////////////////////////////
		
		// Print the answer to standard output(screen).
		cout << "Case #" << test_case+1 << endl;
		cout << Answer << endl;
        delete[] arr;
        delete[] cmp;
	}

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

image

오늘 3시까지 마감이었던 예선이었는데 깜빡하고 오늘 1시쯤 시작해서 한문제밖에 못 풀었다… 성능/테크닉 관점에서 고려도 못한채, 아직까진 실력이 부족하다는 것을 느끼고, 앞으로 체계적으로 난이도 있는 문제 위주로 공부를 시작해야겠다.

BOJ-9251

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int dp[1001][1001] = {0};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
	string st1, st2;
    scanf("%s %s", &st1, &st2);
	
    for(int i=1; i<=st2.size(); i++) {
        for (int j=1; j<=st1.size(); j++) {
			if (st2[i-1] == st1[j-1])
				dp[i][j] = dp[i-1][j-1] + 1;
			else
				dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
		} 
    }
	cout << dp[st2.size()][st1.size()] << endl;
    return 0;
}

런타임(Segmentation)에러 + 시간초과 에러 발생했었음…. 뭐지…왜지…