SW Academy - jjin-choi/study_note GitHub Wiki

ยง Intro

  • main.cpp ์™€ user.cpp ๋กœ ๊ตฌ์„ฑ
  • ๊ฐ•์˜ ์ฝ”๋”ฉ ์Šคํƒ€์ผ : IDE : VS2019 (๋ณด์กฐ codeblocks(
  • #define LM 1000 ๋ณด๋‹ค๋Š” const int LM = 1000
  • ์‹๋ณ„์ž : ClassName ์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘

ยง (06/23) Divide and Conquer

Merge Sort

  • O(N * log(N)) : ๊ฐ level ๋งˆ๋‹ค N ๋ฒˆ์”ฉ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด ์ง€๋ฉฐ ์ด log(N) ๋งŒํผ์˜ ์ธต์œผ๋กœ ๊ตฌ์„ฑ

  • ํฌ๊ธฐ๊ฐ€ N์ธ ๋ฐฐ์—ด์„ ์ ˆ๋ฐ˜์”ฉ ์ชผ๊ฐœ์–ด ํฌ๊ธฐ๊ฐ€ 1์ด ๋˜๋ฉด ๋ฐ”๋กœ ์ „ ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ„ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ merge

  • merge ๊ณผ์ •

    • ์•ž์ชฝ ์ ˆ๋ฐ˜๊ณผ ๋’ค์ชฝ ์ ˆ๋ฐ˜์ด ๊ฐ๊ฐ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋‹ค.
    • ์•ž์ชฝ ๋ฐฐ์—ด์˜ index i ์™€ ๋’ค์ชฝ ๋ฐฐ์—ด index j ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ž‘์€ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋Œ€์ž…ํ•œ๋‹ค.
    • ํ•œ์ชฝ ๋ฐฐ์—ด์˜ index๊ฐ€ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ํ•œ์ชฝ์˜ ๋ฐฐ์—ด๋กœ ์ฑ„์šด๋‹ค.
    • ์ด ๋•Œ, ์ด ๋ฐฐ์—ด์€ ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์ฑ„์›Œ์ฃผ๋ฉด ๋œ๋‹ค.
/*
 :: Merge Sort ::
	divide โ†’ conquer โ†’ merge 
*/

#include <stdio.h>

const int SIZE = (1000 + 5);
int N, in[SIZE], trr[SIZE];

void inputData() 
{
	scanf("%d", &N);
	for (int i = 0; i < N; i++)
		scanf("%d", in + i);		// &in[i]
}

void printData(int *arr)
{
	for (int i = 0; i < N; i++)
		printf("%d ", arr[i]);
	puts("");						// printf("\n");
}

void mergeSort(int *arr, int s, int e)
{
	if (s >= e) return;				// 0. base condition

	int m = (s + e) / 2;			// 1. divide
	mergeSort(arr, s, m);			// 2. conquer
	mergeSort(arr, m + 1, e);

	int i = s, j = m + 1, k = s;	// 3. merge
	for (k = s; k <= e; k++)
	{
		if (j > e) trr[k] = arr[i++];
		else if (i > m) trr[k] = arr[j++];
		else if (arr[i] <= arr[j]) trr[k] = arr[i++];
		else trr[k] = arr[j++];
	}

	for (i = s; i <= e; i++)		// 4. copy
		arr[i] = trr[i];

	printData(arr);

}

int main()
{
	// freopen("input.txt", "r", stdin);
	inputData();
	mergeSort(in, 0, N - 1);
	return 0;
}

์ˆ˜์—ด ๋ณต์›

  • ๋ฌธ์ œ ๊ฐœ์š” ํ•„์ˆ˜ ๋ฌธ์ œ

    • N ๋ช…์˜ ํ•™์ƒ๋“ค์ด ์ผ๋ ฌ๋กœ ๋Š˜์–ด์„œ ์žˆ์œผ๋ฉฐ ๊ฐ ํ•™์ƒ๋“ค์€ 1 ~ N ๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ ์ธ ์นด๋“œ๋ฅผ ํ•œ ์žฅ์”ฉ ๋“ค๊ณ  ์žˆ๋‹ค.
    • ๊ฐ™์€ ๋ฒˆํ˜ธ๊ฐ€ ์ ํžŒ ์นด๋“œ๋Š” ์—†๋‹ค.
    • orderCheck(int left, int right) ํ•จ์ˆ˜๋Š” left ๋ฒˆ์งธ ํ•™์ƒ์ด right ๋ฒˆ์งธ ํ•™์ƒ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด 1, ์•„๋‹ˆ๋ฉด 0 ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์ตœ์†Œ์˜ ์งˆ์˜ (ํ•จ์ˆ˜ ํ˜ธ์ถœ)๋กœ ํ•™์ƒ๋“ค์ด ์„œ ์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์นด๋“œ ๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ 1

    • ํ•™์ƒ ๋ฒˆํ˜ธ๋ฅผ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ, ์ˆ˜๋ฅผ ๋ฐฐ์—ด์˜ ๊ฐ’์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐฐ์—ด์— ๋‹ด๊ธด ์ˆ˜๋“ค์€ 1 ~ N ๊นŒ์ง€์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆœ์—ด ์ค‘ ํ•˜๋‚˜.
    • orderCheck(int left, int right) ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋น„๊ต ํšŸ์ˆ˜์™€ ์ •๋น„๋ก€
  • ๋น„๊ต ํšŸ์ˆ˜์— ์ œํ•œ์ด ์—†๋‹ค๋ฉด ?

    • ๋ชจ๋“  ์›์†Œ๋ฅผ 1์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ์ˆ˜์™€ ๋น„๊ตํ•˜์—ฌ ์ž์‹ ๋ณด๋‹ค ์ž‘์€ ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.
    • O(N^2)
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ 2

    • ํ•™์ƒ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ์ˆ˜์— ๋”ฐ๋ผ index๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด ?
    • ํ•™์ƒ ๋ฒˆํ˜ธ๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ํ•™์ƒ์€ 1 ์„ N ๋ฒˆ์งธ ํ•™์ƒ์€ N ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.
    • ํ•™์ƒ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆ˜์— ๋”ฐ๋ผ์„œ ์˜ค๋ฆ„ ์ฐจ์ˆœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์„๊นŒ? โ†’ **ํ•™์ƒ ๋ฒˆํ˜ธ๋Š” ๋ฐฐ์—ด์˜ index ๋‹ค ! **
    • ํ•™์ƒ ๋ฒˆํ˜ธ๋ฅผ ์ฐจ๋ก€๋กœ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ํ•™์ƒ ๋ฒˆํ˜ธ๋ฅผ ํ•ฉ๋ณ‘ ์ •๋ ฌํ•œ๋‹ค.
    • N ๋ฒˆ ์ˆœํšŒํ•˜๋ฉฐ ํ•™์ƒ์ด ๊ฐ€์ง„ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
    • ์˜ˆ์‹œ - ํ•™์ƒ(์นด๋“œ) : 1(5) 2(3) 3(4) 4(2) 5(1)
    • ํ•™์ƒ์˜ index๋ฅผ ๊ฐ–๋Š” index[] ๋ฅผ ๋งŒ๋“ ๋‹ค. index(context) : 1(1) 2(2) 3(3) 4(4) 5(5)

    ๋‹ค์‹œ ๋ณด๊ธฐ

Binary Search

  • ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์—์„œ ํŠน์ • ๊ฐ’์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„ ๊ฐ’์„ ์„ ํƒํ•˜์—ฌ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹

  • ์ฐพ๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ฉด ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

  • ๋ฌธ์ œ ์œ ํ˜•

    • ์ตœ์ ํ™” ๋ฌธ์ œ (์ตœ์†Œ๊ฐ’, ์ตœ๋Œ€๊ฐ’) ๋ฅผ ๊ฒฐ์ • ๋ฌธ์ œ๋กœ ๋ฐ”๊ฟ”์„œ ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ
    • ์ด๋ถ„ ๊ฒ€์ƒ‰์œผ๋กœ ๊ฐ€์žฅ ์ตœ์ ์˜ ํ•ด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๋ฅผ ๊ตฌํ•œ๋‹ค.
    • ๋‹ต์˜ ํ›„๋ณด๋“ค์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ด์ง„ ๊ฒ€์ƒ‰ ๊ณผ์ •

    • ํ˜„์žฌ ํƒ์ƒ‰ ๊ตฌ๊ฐ„์˜ ๊ฐ€์šด๋ฐ ๋ฐฐ์—ด ๋ฒˆํ˜ธ mid๋ฅผ ๊ตฌํ•œ๋‹ค.
    • ๋งŒ์•ฝ A[mid] == target ์ด๋ฉด ์ด ๊ฐ’/ ๊ฐ’์˜ ์œ„์น˜๋ฅผ return
    • A[mid] < target ์ด๋ผ๋ฉด low = mid + 1 ๋กœ (๊ทธ ์•„๋ž˜๋กœ๋Š” ๋ณผ ํ•„์š”๊ฐ€ ์—†์Œ) ๊ฒ€์ƒ‰ ๋ฒ”์œ„ ์กฐ์ •ํ•œ๋‹ค.
    • low > high ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ชฉํ‘œ ๊ฐ’์ด ๋ฐฐ์—ด์ด ์—†๋Š” ๊ฒฝ์šฐ
/*
:: Binary Search ::
*/

#include <stdio.h>
const int SIZE = (int) 5e5 + 5; // (e : exponent) 5 * 10 ^ 5
int N, Q, in[SIZE], trr[SIZE];

void inputData()
{
	scanf ("%d", &N);
	for (int i = 0; i < N; i++)
		scanf ("%d", in + i);
}

void mergeSort(int *arr, int s, int e)
{
	// 0. Base condition
	if (s > e) return;

	// 1. divide
	int mid = (s + e) / 2;

	// 2. conqure
	mergeSort(arr, s, mid);
	mergeSort(arr, mid + 1, e);

	// 3. merge
	int i = s, j = mid + 1, k = s;
	for (k = s; k < e; k++)
	{
		if (e < j) trr[k] = arr[i++];
		else if (mid < i) trr[k] = arr[j++];
		else if (arr[i] <= arr[j]) trr[k] = arr[i++];
		else if (arr[j] < arr[i]) trr[k] = arr[j++];
	}

	// 4. copy
	for (int i = s; i < e; i++)
		arr[i] = trr[i];
}

int bsearch_DFS(int *arr, int s, int e, int target)
{
	// 1. not found
	if (s > e) return -1;

	// 2. mid
	int mid = (s+ e) / 2;

	// 3. find target
	if (arr[mid] == target) return mid;

	// 4. arr[mid] < target
	else if (arr[mid] < target)
		return bsearch_DFS(arr, mid + 1, e, target);

	// 5. arr[mid] > target
	else
		return bsearch_DFS(arr, s, mid, target);
}

int bsearch_loop(int *arr, int s, int e, int target)
{
	while (s <= e)
	{
		int mid = (s + e) / 2;

		if (arr[mid] == target)		 return mid;
		else if (arr[mid] < target)	 s = mid + 1;
		else						 e = mid - 1;
	}

	return -1;
}

void process()
{
	scanf ("%d", &Q);
	int i, tg;

	for (i = 0; i < Q; i++)
	{
		scanf ("%d", &tg);
		printf("%d\n", bsearch_loop(in, 0, N - 1, tg));
	}
}

int main()
{
	freopen("input.txt", "r", stdin);
	inputData();
	process();

	return 0;
}

์ œ๊ณฑ๊ทผ

  • ๋ฌธ์ œ ๊ฐœ์š”

    • ์ž„์˜์˜ ์ •์ˆ˜ N ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์–‘์˜ ์ œ๊ณฑ๊ทผ์˜ ์ •์ˆ˜ ๋ถ€๋ถ„ ์ถœ๋ ฅํ•˜๊ธฐ
    • ๋‹จ sqrt ํ•จ์ˆ˜ ์‚ฌ์šฉ ํ•˜์ง€ ๋ง์•„์•ผ ํ•จ
    • 2^63 - 1 : long long
  • 2^63 -1 ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด bsearch ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ

    • ๋ฏธ๋ฆฌ ๋ฒ”์œ„๋ฅผ ์‚ด์ง ์ฐพ์•„๋‘๋Š” ๊ผผ์ˆ˜..
    • mid ^ 2 < target ์œผ๋กœ ํ•˜์ง€ ๋ง๊ณ  mid < target / mid ๋กœ ๊ฐ’์„ ๋น„๊ตํ•˜์ž
  • (์ฐธ๊ณ ) ๋ฐ”๋นŒ๋กœ๋‹ˆ์•„ ๋ฒ•์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    • x_(n+1) = (x_n + a / x_n ) / 2
/*
:: Root Square
*/

#include <stdio.h>
typedef unsigned long long LL;

LL bsearch(LL s, LL e, LL target)
{
	LL ans = target, mid;
	while (s <= e)
	{
		mid = (s + e) / 2;

		if (mid < target / mid)	ans = mid, s = mid + 1;
		else					e = mid - 1;
	}
	return ans;
}

int main()
{
	freopen("input.txt", "r", stdin);
	LL N;

	scanf("%llu", &N);
	printf ("%llu", bsearch(1, N, N));
	return 0;
}

ยง (06/24) ๊ตฌํ˜„

์ˆ˜์—ด

  • N ์ผ์˜ ์˜จ๋„๊ฐ€ ์ •์ˆ˜ ์ˆ˜์—ด๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์—ฐ์†๋œ K์ผ์˜ ์˜จ๋„์˜ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ๊ฐ’ ์•Œ์•„๋ณด๊ธฐ

    • 1 <= K <= 100,000
    • -100 <= ์˜จ๋„ <= 100
  • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

    • prefix sum ์„ psum (๋ˆ„์ ํ•ฉ) ์— ์ €์žฅ
    • ์ฒซ K์ผ์˜ ํ•ฉ์„ ans ๋กœ ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜ ๋งค์šฐ ์ž‘์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด๋‘๊ณ 
    • ans = max (ans, psum[i] - psum[i-K])
    • ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ sliding window ๋ผ๊ณ  ํ•œ๋‹ค.
/*
:: Temperature ::
*/

#include <stdio.h>
const int MAX = (100000 + 5);
int N, K, in[MAX], psum[MAX];
int ans = -(int)1e9;

// debuging point 
// - syntax error(๋ฌธ๋ฒ•์  ์—๋Ÿฌ)
// - runtime error (์‹คํ–‰ ์ค‘ ์—๋Ÿฌ) 
// - logic (๋…ผ๋ฆฌ์  ์—๋Ÿฌ) : ๋ถ€๋ถ„ ์ ์ˆ˜๋งŒ ๋ฐ›๋Š” ๊ฒฝ์šฐ 

void inputData()
{
	scanf("%d %d", &N, &K);
	for (int i = 1; i <= N; i++)
	{
		scanf("%d", in + i);
		psum[i] = psum[i - 1] + in[i];
	}
}

void process()
{
	for (int i = K; i <= N; i++)
	{
		int sum = psum[i] - psum[i - K];
		if (ans < sum) ans = sum;
	}
}

int main()
{
	freopen("input.txt", "r", stdin);
	inputData();
	process();
	printf("%d\n", ans);
	return 0;
}

Kadane's Algorithm

  • Maximum subarray problem
    • ์œ„ ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ์ ์€ K ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    • D[i]๋ฅผ i๋ฒˆ์งธ ์ˆ˜๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•˜๋Š” ์—ฐ์† ๋ถ€๋ถ„ํ•ฉ์˜ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์ •์˜ํ•ด๋ณด์ž.
    • ์ฆ‰ in[i]๋ฅผ optimal solution์— ํฌํ•จํ–ˆ์„ ๋•Œ, D[i-1]์„ ์ด์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ธ์ง€
    • D[i-1] > 0 ์ด๋ฉด ์ด์šฉํ•˜์ง€๋งŒ, D[i-1] <= 0 ์ด๋ฉด ์ด์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • D[i] = max (in[i], D[i-1] + in[i])
    • ๋™์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์—†์ด, D[i] ๋ฅผ sum ์œผ๋กœ ๋ฐ”๊ฟ” ์ƒ๊ฐํ•˜๋ฉด, i๋ฒˆ์งธ sum์€ i๋ฒˆ์งธ sum์€ i๋ฒˆ์งธ ์ˆ˜๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•˜๋Š” ์—ฐ์† ๋ถ€๋ถ„ํ•ฉ์˜ ์ตœ๋Œ€๊ฐ’
/* 
:: Max Sub Array ::
*/

#include <stdio.h>
const int SIZE = (100000 + 5);
int N, in[SIZE], sum, ans;

void inputData()
{
	scanf("%d", &N);
	for (int i = 0; i < N; i++)
		scanf("%d", in + i);
}

void maxSubArray()
{
	sum = in[0];
	for (int i = 1; i < N; i++)
	{
		int cur = in[i];

		if (sum > 0) sum += cur;
		else sum = cur;

		if (ans < sum) ans = sum;
	}
}

int main()
{
	freopen("input.txt", "r", stdin);
	inputData();
	maxSubArray();
	printf("%d ", ans);
	return 0;
}

Two pointer

  • Two pointer ํ•„์ˆ˜๋ฌธ์ œ
    • ์ •๋ ฌ ํ›„ A ๋ฐฐ์—ด์˜ ์–‘์ชฝ ๋ index ๋ฅผ low = 0, high = N-1
    • sum = A[low] + A[high]
    • if (sum == 0) ์ธ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ข‹์€ ๊ฐ’์ด๋ฏ€๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ
    • if (sum > 0) ํ˜น์€ if (sum < 0)
/*
:: Two Solution :: 
*/

#include <stdio.h>
const int SIZE = (100000 + 5);
int N, count, sum, ans[2];

typedef struct sol
{
	int data;
	int sign = 1;
} SOL;

SOL in[SIZE], trr[SIZE];

int abs(int data)
{
	if (data < 0) return data * (-1);
	else return data;
}

void inputData()
{
	scanf("%d", &N);
	for (int i = 0; i < N; i++)
	{
		scanf("%d", &in[i].data);

		if (in[i].data < 0) 
		{
			in[i].data *= -1;
			in[i].sign = -1;
			count++;
		}
	}
}

void displayData(SOL *arr)
{
	printf("\n");
	for (int i = 0; i < N; i++)
	{
		if (arr[i].sign < 0)
			printf("-%d ", arr[i].data);
		else
			printf(" %d ", arr[i].data);
	}
	printf("\n");
}

void mergeSort(SOL *arr, int s, int e)
{
	// 0. base condition
	if (s >= e) return;

	// 1. divide
	int mid = (s + e) / 2;

	// 2. conquer
	mergeSort(arr, s, mid);
	mergeSort(arr, mid + 1, e);

	// 3. merge
	int i = s, j = mid + 1, k = s;
	for (k = s; k <= e; k++)
	{
		if (mid < i) {
			trr[k].sign = arr[j].sign;
			trr[k].data = arr[j++].data;
		}
		else if (e < j) {
			trr[k].sign = arr[i].sign;
			trr[k].data = arr[i++].data;
		}
		else if (arr[i].data <= arr[j].data) {
			trr[k].sign = arr[i].sign;
			trr[k].data = arr[i++].data;
		}
		else if (arr[i].data > arr[j].data) {
			trr[k].sign = arr[j].sign;
			trr[k].data = arr[j++].data;
		}
	}

	// 4. copy
	for (int i = s; i <= e; i++)
	{
		arr[i].sign = trr[i].sign;
		arr[i].data = trr[i].data;
	}
}


void process()
{
	ans[0] = in[0].data * in[0].sign;
	ans[1] = in[1].data * in[1].sign;
	sum = ans[0] + ans[1];
	int sign = in[1].sign;

	for (int i = 2; i < N; i++)
	{
		if (sign != in[i].sign)
		{
			sign = in[i].sign;
			int sol = in[i - 1].data * in[i - 1].sign + in[i].data * in[i].sign;
			if (abs(sol) < abs(sum))
			{
				sum = sol;
				ans[0] = in[i - 1].data * in[i - 1].sign;
				ans[1] = in[i].data * in[i].sign;
			}
		}
	}
}


int main()
{
	freopen("input.txt", "r", stdin);
	inputData();
	displayData(in);
	mergeSort(in, 0, N-1);
	displayData(in);
	process();
	if (ans[0] < ans[1]) 
		printf("\n Answer : %d + %d = %d ", ans[0], ans[1], sum);
	else 
		printf("\n Answer : %d + %d = %d ", ans[1], ans[0], sum);
	return 0;
}

ํ•ฉ์ด 0์ด ๋˜๋Š” ์—ฐ์† ๊ตฌ๊ฐ„ ์„ธ๊ธฐ

  • prefix sum ์„ ์ด์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ˆ˜๊ฐ€ ๋‹ค์‹œ ๋‚˜์˜ค๋ฉด ๊ทธ ์‚ฌ์ด์˜ sub sum ์ด 0 ์ด๋‹ค.

  • ๋™์ผํ•œ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฐœ์ˆ˜๋ฅผ cnt[] ์— ์ €์žฅํ•˜๋ฉด ๋ ๊นŒ ?

  • ํ•˜์ง€๋งŒ 1<= N <= 100000 ์ด๊ณ  -100 <= A[] <= 100 ์ด๋ฏ€๋กœ ๋ถ€๋ถ„ํ•ฉ์˜ ๋ฒ”์œ„๊ฐ€ -1์ฒœ๋งŒ ~ 1์ฒœ๋งŒ ์‚ฌ์ด๋‹ค

  • ์Œ์ˆ˜ ๊ตฌ๊ฐ„ shift ํ•˜์—ฌ 0 ~ 2์ฒœ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 64 M ์ด๋‹ค.

  • ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•ž์˜ 5๋งŒ๊ฐœ๊ฐ€ ๋ชจ๋‘ -100 ์ด๋ฉด ๋’ค์˜ 5๋งŒ๊ฐœ๊ฐ€ ๋ชจ๋‘ 100 ์ด์–ด์•ผ 0 ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—

  • subsum ํ•ฉ์ด -5๋ฐฑ๋งŒ ํ˜น์€ 5๋ฐฑ๋งŒ ์‚ฌ์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์€ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.

  • int ํ˜• ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ 1์ฒœ๋งŒ์ธ cnt[] ๋ฅผ ๋งŒ๋“ค์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ !

    • 1์ฒœ๋งŒ * 4 (int) / 1048576 (1M) = ์•ฝ 38 MB
  • cnt๋ฅผ ์™œ ๊ทธ๋ƒฅ ๋”ํ•˜์ง€ ,, ? combination ํ•ด์•ผ ํ•˜์ง€ ์•Š๋‚˜ ? 1์ผ๋• ๋นผ์•ผํ•˜์ง€ ์•Š๋‚˜.. !

/*
:: Sub Array Sum Zero
*/

#include <stdio.h>
const int SIZE = (100000 + 5);
const int MAX = SIZE * 100 / 2;
int in[SIZE], psum[SIZE], cnt[SIZE * 100];
int N;
long long sol; // 10๋งŒ๊ฐœ ์ด์ƒ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 

void inputData()
{
	scanf("%d", &N);
	for (int i = 0; i < N; i++)
		scanf("%d", in + i);
}

void prefixSum(int *arr)
{
	psum[0] = arr[0];
	for (int i = 1; i < N; i++)
		psum[i] = psum[i - 1] + arr[i];
}

int combi(int x)
{
	if (x > 1)
		return x * (x - 1) / 2;
	else
		return 0;
}

void countSum(int *arr)
{
	int max = 0;
	cnt[0 + MAX] = 1;

	for (int i = 0; i < N; i++)
	{
		if (psum[i] > MAX || psum[i] < -MAX)
			continue;

		cnt[psum[i] + MAX]++;
		if (max < psum[i] + MAX) 
			max = psum[i] + MAX;
	}

	for (int i = 0; i <= max; i++)
		sol += combi(cnt[i]);
}

int main()
{
	freopen("input.txt", "r", stdin);
	inputData();
	prefixSum(in);
	countSum(in);
	printf("%lld\n", sol);

	return 0;
}

ยง (06/25) String

์•”ํ˜ธ ํ’€๊ธฐ

  • ๋ณตํ˜ธํ™” ํ‚ค (26๊ฐœ์˜ ์†Œ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋จ) ์™€ ์•”ํ˜ธ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ ์›๋ฌธ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
  • fgets(๋ฌธ์ž์—ด ์ด๋ฆ„, ๋ฌธ์ž์—ด ๊ธธ์ด, ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ) ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • char* fgets(char* buf, int buf_size, FILE*stream);
    • char *buf[100];
    • fgets(buf, 100, stdin);
    • // ์ตœ๋Œ€ 99๊ฐœ ๋ฌธ์ž๊นŒ์ง€ ์ž…๋ ฅ ๋ฐ›๊ณ  ๋งˆ์ง€๋ง‰ ๋„ ๋ฌธ์ž ('\0' ์•„์Šคํ‚ค์ฝ”๋“œ 0) ์„ ๋„ฃ๋Š”๋‹ค.
    • fgets() ๊ฐœํ–‰๋ฌธ์ž ('\r', '\n') ๋„ ์ž…๋ ฅํ•œ๋‹ค๋Š” ์ ์— ์ฃผ์˜ .. !
/*
:: Encryption :: 
  'A' : 65
  'a' : 97
*/

#include <stdio.h>

const int SIZE = (100000 + 5);
char in[SIZE], out[SIZE], code[30];

void inputString()
{
	//	for (int i = 0; i<10; i++)
	//	scanf("%c", enc + i);
}

int strlen(char *str)
{
	int len = 0;
	while (*str && *str != '\r' && *str != '\n')
	{
		str++;
		len++;
	}
	*str = '\0';
	return len;
}

void printString(char *str)
{
	for (int i = 0; i<10; i++)
		printf("%c", str + i);
	printf("\n");
}

int isUpper(char c)
{
	return (c >= 'A' && c <= 'Z');
}

int isLower(char c)
{
	return (c >= 'a' && c <= 'z');
}

int main()
{
	freopen("input.txt", "r", stdin);
	fgets(code, 30, stdin);
	fgets(in, 100, stdin);
	//inputString();
	printf("code length : %d\n", strlen(code));
	printf("string length : %d\n", strlen(in));

	int len = strlen(in);

	for (int i = 0; i < len; i++)
	{
		char c = in[i];
		if (isUpper(c)) in[i] = code[c - 'A'] - 32;
		else if (isLower(c)) in[i] = code[c - 'a'];
	}

	puts(in); // printf("%s\n", buf);
	return 0;
}
#else
// cin, getline 

#include <iostream>
using namespace std;

char code[30], in[100];

int isUpper(char c)
{
	return (c >= 'A' && c <= 'Z');
}

int isLower(char c)
{
	return (c >= 'a' && c <= 'z');
}

int main()
{
	freopen("input.txt", "r", stdin);
	cin.getline(code, 30);
	cin.getline(in, 100);

	for (int i = 0; in[i]; i++)
	{
		char c = in[i];

		if (isUpper(c))
			in[i] = code[c - 'A'] - 32;
		else if (isLower(c))
			in[i] = code[c - 'a'];
	}

	cout << in;
	return 0;
}
#endif
  • c++ ์˜ iostream ์„ ์ด์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด ์ž…๋ ฅ ์ถœ๋ ฅ์„ ๋” ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • cin.getline(in, 100);
    • cout << in;
  • ์—ฌ๊ธฐ๋‹ค๊ฐ€ #include ์„ ํ•˜๋ฉด
    • string in; : string ์€ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
    • getline(cin, code);
#include <string>

int main()
{
	freopen("input.txt", "r", stdin);
	getline(cin, code);
	getline(cin, in);

	for (char &c:in)
	{
		if (isUpper(c))
			c = code[c - 'A'] - 32;
		else if (isLower(c))
			c = code[c - 'a'];
	}

	cout << in;
	return 0;
}

๋‹จ์–ด ์„ธ๊ธฐ

  • **ํ•„์ˆ˜ ๋ฌธ์ œ **
  • ์ž„์˜์˜ ๋ฌธ์žฅ์„ ์ž…๋ ฅ ๋ฐ›์•„ ๊ฐ ๋‹จ์–ด ๋ณ„๋กœ ๋‚˜๋ˆˆ ํ›„ ๋‹จ์–ด๋“ค์˜ ์ค‘๋ณต๋˜๋Š” ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ
    • ์ž…๋ ฅ๋œ ์ŠคํŠธ๋ง์€ ๊ธ€์ž ์ œํ•œ์ด ์—†์Œ. ์ฆ‰ ๊ณต๋ฐฑ์ด๋‚˜ ',' ๋„ ์ž…๋ ฅ ๊ฐ€๋Šฅ
    • ์ž…๋ ฅ๋œ ๋ฌธ์žฅ์—์„œ ๊ฐ ๋‹จ์–ด ์‚ฌ์ด์˜ ๊ตฌ๋ถ„์€ ๊ณต๋ฐฑ
    • ๋‹จ์–ด์—๋Š” ๊ณต๋ฐฑ์„ ์ œ์™ธํ•œ ๋‹จ์–ด๋“ค ๋งŒ์ด ํฌํ•จ
    • ๋ฌธ์žฅ ๋‹จ์œ„ ๋‹จ์–ด๋“ค์˜ ๋ฐœ์ƒ ๋นˆ๋„๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ

๋ณ€์žฅ

๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด

โš ๏ธ **GitHub.com Fallback** โš ๏ธ