SW Academy - jjin-choi/study_note GitHub Wiki
- main.cpp ์ user.cpp ๋ก ๊ตฌ์ฑ
- ๊ฐ์ ์ฝ๋ฉ ์คํ์ผ : IDE : VS2019 (๋ณด์กฐ codeblocks(
- #define LM 1000 ๋ณด๋ค๋ const int LM = 1000
- ์๋ณ์ : ClassName ์ ๋๋ฌธ์๋ก ์์
-
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)
-
์ ๋ ฌ๋ ๋ฆฌ์คํธ์์ ํน์ ๊ฐ์ ์์น๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
-
๋ฆฌ์คํธ ์ค๊ฐ ๊ฐ์ ์ ํํ์ฌ ์ฐพ๊ณ ์ ํ๋ ๊ฐ๊ณผ ๋น๊ตํ๋ ๋ฐฉ์
-
์ฐพ๋ ๊ฐ์ด ์๋๋ฉด ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ผ ์ ์์
-
๋ฌธ์ ์ ํ
- ์ต์ ํ ๋ฌธ์ (์ต์๊ฐ, ์ต๋๊ฐ) ๋ฅผ ๊ฒฐ์ ๋ฌธ์ ๋ก ๋ฐ๊ฟ์ ์๊ฐํ๋ ๊ฒฝ์ฐ
- ์ด๋ถ ๊ฒ์์ผ๋ก ๊ฐ์ฅ ์ต์ ์ ํด๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๋ฅผ ๊ตฌํ๋ค.
- ๋ต์ ํ๋ณด๋ค์ด ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
-
์ด์ง ๊ฒ์ ๊ณผ์
- ํ์ฌ ํ์ ๊ตฌ๊ฐ์ ๊ฐ์ด๋ฐ ๋ฐฐ์ด ๋ฒํธ 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;
}
-
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;
}
- 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 ํ์๋ฌธ์
- ์ ๋ ฌ ํ 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;
}
-
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;
}
- ๋ณตํธํ ํค (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;
}
- **ํ์ ๋ฌธ์ **
- ์์์ ๋ฌธ์ฅ์ ์
๋ ฅ ๋ฐ์ ๊ฐ ๋จ์ด ๋ณ๋ก ๋๋ ํ ๋จ์ด๋ค์ ์ค๋ณต๋๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ
- ์ ๋ ฅ๋ ์คํธ๋ง์ ๊ธ์ ์ ํ์ด ์์. ์ฆ ๊ณต๋ฐฑ์ด๋ ',' ๋ ์ ๋ ฅ ๊ฐ๋ฅ
- ์ ๋ ฅ๋ ๋ฌธ์ฅ์์ ๊ฐ ๋จ์ด ์ฌ์ด์ ๊ตฌ๋ถ์ ๊ณต๋ฐฑ
- ๋จ์ด์๋ ๊ณต๋ฐฑ์ ์ ์ธํ ๋จ์ด๋ค ๋ง์ด ํฌํจ
- ๋ฌธ์ฅ ๋จ์ ๋จ์ด๋ค์ ๋ฐ์ ๋น๋๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก