c00 - KimTaebin-ai/study_posts GitHub Wiki
๊ธฐ๋ณธ์ ์ธ write ํจ์์ ์กฐ๊ฑด๋ฌธ์ ๋ค๋ฃจ๋ ๋ฌธ์
#include <unistd.h>
void ft_putchar(char c)
{
write(1, &c, 1);
}
write ํจ์๋ unistd์์ ์ง์ํ๋ ํ์ค ์ถ๋ ฅํจ์๋ก ๋ฌธ์์ด๋ก๋ง ์ถ๋ ฅํ ์ ์๋ค. write (a, b, c)๋ a๋ ์ถ๋ ฅ๋ชจ๋๋ก, 0,1,2 ์ค์ ํ๋์ ์ธ์๋ฅผ ๊ฐ๋๋ฐ 0,1์ ํ์ค์ ์ถ๋ ฅ์ด๊ณ , 2๋ ํ์ค์ค๋ฅ์ด๋ค ๋ฐ๋ผ์ ์์ผ๋ก ์ถ๋ ฅ์ ํด์ผํ๋ ๊ฑฐ์ ๋ชจ๋ ๋ฌธ์ ์์๋ a์ ๋ซ์ด๊ฐ ์ซ์๋ 1์ผ ๊ฒ์ด๋ค. b๋ ๋ด๊ฐ ์ถ๋ ฅํ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๋ ๊ฒ์ด๋ค. c๋ ์ถ๋ ฅํ ๋ฐ์ดํฐ์ ๊ธธ์ด๋ฅผ ๋ํ๋ธ๋ค.
์ด ์ ๋๋ง ์ดํดํ๊ณ ๋ค์ ๋ฌธ์ ๋ก ๋์ด๊ฐ์.
#include <unistd.h>
void ft_print_alphabet(void)
{
char alpha;
alpha = 'a';
while (alpha <= 'z')
{
write(1, &alpha, 1);
alpha++;
}
}
์ํ๋ฒณ์ ์ถ๋ ฅํด์ผํ๋ฏ๋ก, ์์คํค ์ฝ๋๊ฐ์ ์ด์ฉํ ์ถ๋ ฅ์ด๋ค. ์ด์ ๋ฌธ์ ์์ ์ฌ์ฉํ writeํจ์๋ฅผ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ฐ๋ณต๋ฌธ์ ์์ผ๋ฌธ๋ง ํ์ฉ๋๋ค. norminette๋ฅผ ํญ์ ์ฃผ์ํ ๊ฒ
#include <unistd.h>
void ft_print_reverse_alphabet(void)
{
char a;
a = 'z';
while (a >= 'a')
{
write (1, &a, 1);
a--;
}
}
#include <unistd.h>
void ft_print_numbers(void)
{
char n;
n = '0';
while (n <= '9')
{
write(1, &n, 1);
n++;
}
}
์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ writeํจ์๋ ๋ฌธ์์ด๋ก๋ง ์ถ๋ ฅํ ์ ์๊ธฐ์, ์ซ์๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด์๋ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ผํ๋ค. ์ฌ๊ธฐ์ ๋๋ atoi ๊ตฌํ์ ๋ ์ฌ๋ ธ๋๋ฐ ๋ฌธ์ ์์๋ all digit์ ์ถ๋ ฅํ๋ผ๊ณ ๋ช ์๋์ด ์๊ธฐ์ 012345789๋ง ์ถ๋ ฅํ๋ฉด ๋๋ค. ๊ทน๋จ์ ์ผ๋ก๋ ๋ฐ๋ณต๋ฌธ ์์ด write(1, "0123456789", 10); ๊ณผ ๊ฐ์ ํํ๋ก ์ถ๋ ฅํด๋ ๊ธฐ๊ณํป๊ฐ์์ ํต๊ณผ๊ฐ ๋๋ค.
#include <unistd.h>
void ft_is_negative(int n)
{
if (n >= 0)
{
write(1, &"P", 1);
}
else
{
write(1, &"N", 1);
}
}
#include <unistd.h>
void ft_print_comb(void)
{
char num[3];
num[0] = '0';
while (num[0] <= '7')
{
num[1] = num[0] + 1;
while (num[1] <= '8')
{
num[2] = num[1] + 1;
while (num[2] <= '9')
{
write(1, &num, 3);
if (num[0] != '7')
{
write(1, &", ", 2);
}
num[2]++;
}
num[1]++;
}
num[0]++;
}
}
๋ง์ ๋ถ๋ค์ด ํ์ด๋ฅผ ์ํด ๊ณ ๋ฏผํ๊ณ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ฆฐ ๋ฌธ์ ์ด๋ค
์ด๋ฐ ์ ํ์ ๋ฌธ์ ๋ ๊ท์น์ ์ฐพ์ผ๋ฉด ๋น ๋ฅด๊ฒ ํ ์ ์๋ค
- 10์ ์๋ฆฌ ์๋ 100๋ณด๋ค ์์ ์ ์์ผ๋ฉฐ ์ต์๊ฐ์ 100์ ์๋ฆฌ ์๋ณด๋ค 1์ด์ ์ปค์ผํจ
- ๋ฐฐ์ด์ ๋์ 789๋ก ๊ณ ์ . ์ฆ, 100์๋ฆฌ ์ต๋๊ฐ์ 7, 10์ 8, 1์ 9
์ต๋๊ฐ์ ์์์ผ๋ฏ๋ก ํด๋น ์กฐ๊ฑด์ผ๋ก while ๋ฐ๋ณต๋ฌธ ์์ฑ
์์ (10์ ์๋ฆฌ๋ผ๋ฉด 100์ ์๋ฆฌ) ์๋ฆฌ ์ซ์๊ฐ 1 ์ฌ๋๋ค๋ฉด 1๋ฒ ๊ท์น์ ๋ฐ๋ผ ์์๊ฐ ์ ์ธ
์ด๋ค ๋ถ์ num[0] = '0'; ์ ์ธ๊ณผ ๋์์ 8, 9๋ ์์ฑํ๋ค. ๋ค๋ง while ๋ฌธ์ ํตํด ์ด๋ฏธ ์ธํ ๊ฐ์ด๋ฏ๋ก ๋ถํ์ํ ์ฝ๋์ง๋ง ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์ํด ๊ทธ๋ฅ ๋๊ธฐ๋ ํ๋ ๊ฒฝ์ฐ๋ ์์๋ค
#include <unistd.h>
void ft_print_comb2(void)
{
char line[5];
int n1;
int n2;
n1 = 0;
while (n1 <= 98)
{
n2 = n1 + 1;
while (n2 <= 99)
{
line[0] = '0' + n1 / 10;
line[1] = '0' + n1 % 10;
line[2] = ' ';
line[3] = '0' + n2 / 10;
line[4] = '0' + n2 % 10;
write(1, &line, 5);
if (n1 != 98)
{
write(1, &", ", 2);
}
n2++;
}
n1++;
}
}
๋ง์ฐฌ๊ฐ์ง๋ก ๊ท์น๋ถํฐ ์ฐพ๊ณ ์์
- ๋๋ฒ์งธ ์ซ์๋ ์ฒซ๋ฒ์งธ ์ซ์๋ณด๋ค ์์ ์ ์์. ์ต์ 1์ด์ ์ปค์ผํจ
- ๋๋ฒ์งธ ๊ฐ์ด ๋ฌด์กฐ๊ฑด 99๋ฅผ ์ฐ์ด์ผ ์ฒซ๋ฒ์งธ ๊ฐ์ด ์นด์ดํ ๋จ
- ์ต๋๊ฐ 98, 99
3๋ฒ ๊ท์น์ผ๋ก while๋ฌธ ์์ฑ
1 2๋ฒ ๊ท์น์ผ๋ก ๊ฐ ์ธํ
๋ค๋ง ๋์ด์ฐ๊ธฐ๊ฐ ์์ด 5์๋ฆฌ์ ๋ฐฐ์ด์ ๊ฐ ์ ์ฅ
๊ตณ์ด ๋์ฒ๋ผ ๊ตฌํํ ํ์๋ ์๋ค. ๋๋ ๊ทธ์ ๋ฌธ์์ด๋ก๋ง ์ถ๋ ฅํด์ผํ๋ write์ ํน์ง์ ์ด๋ฆฌ๊ธฐ ์ํด ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ง line ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ์ ๋ฟ์ด๋ค. ๋ง์ ๋ถ๋ค์ ๊ฐ ์๋ฆฟ์๋ก ์ ๊ทผํ์๋ค.
#include <unistd.h>
void ft_putchar(char c)
{
write(1, &c, 1);
}
void ft_putnbr(int nb)
{
if (nb == -2147483648)
{
write(1, "-2147483648", 11);
return ;
}
if (nb < 0)
{
ft_putchar('-');
nb = -nb;
}
if (nb >= 10)
{
ft_putnbr(nb / 10);
}
ft_putchar('0' + nb % 10);
}
int ๊ฐ์ผ๋ก ์ ๋ ฅ ๋ฐ์ ๊ฐ์ ๊ทธ๋๋ก ์ถ๋ ฅํด์ฃผ๋ ๋ฌธ์
์ฌ์ฉํด์ผํ๋ ํจ์๊ฐ write ๋ก ๊ณ ์ ๋์ด ์๋ ์ ์ด ํฌ์ธํธ. write๋ char ํํ๋ก๋ง ์ถ๋ ฅ์ด ๊ฐ๋ฅํ๋ฉฐ count ์ธ์ ๋ํ ์ ๋ ฅํด์ค์ผ ํจ
๊ฐ ์๋ฆฟ์๋ฅผ ์ฌ๊ทํจ์๋ฅผ ํตํด ์ถ๋ ฅํ๋ ๊ฑธ๋ก ํด๊ฒฐ
ex) 1234 โ 1234 / 10 = 123
123 โ 123 / 10 = 12
12 โ 12 / 10 = 1
print 1
์ฌ๊ทํจ์์ ๊ธฐ์ ๋ถ๋ถ๊น์ง ๋๋ฌํ์ผ๋ฏ๋ก IF๋ฌธ์ ๋ง๋์ง ์์
๋ฐ๋ผ์
12 โ 12%10 = 2
123 โ 123%10 = 3
1234 โ 1234%10 = 4
์ถ๋ ฅ
#include <unistd.h>
void print_char(char c)
{
write(1, &c, 1);
}
void print_combn(int *arr, int n, int is_last)
{
int i;
i = 0;
while (i < n)
{
print_char('0' + arr[i]);
i++;
}
if (!is_last)
{
write(1, ", ", 2);
}
}
void comb_recursive(int *arr, int n, int index, int current)
{
int is_last;
int i;
if (index == n)
{
is_last = (arr[0] == 10 - n);
print_combn(arr, n, is_last);
return ;
}
i = current;
while (i <= 10 - n + index)
{
arr[index] = i;
comb_recursive(arr, n, index + 1, i + 1);
i++;
}
}
void ft_print_combn(int n)
{
int arr[10];
if (n <= 0 || n >= 10)
{
return ;
}
comb_recursive(arr, n, 0, 0);
write(1, "\n", 1);
}
์ด ๋ํ ๊ท์น๋ถํฐ ์ฐพ์
- n ๋ฒ์งธ ์๋ฆฌ ์๋ n + 1 ๋ฒ์งธ ์๋ฆฌ ์๋ณด๋ค ์์ ์ ์์ผ๋ฉฐ ์ต์ + 1์
- 9๋ฅผ ๋ง๋๋ฉด ์์ ์๋ฆฌ ์ + 1
- ์ต๋๊ฐ์ 9 - n + 1
์ฌ๊ท์ ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ
ํ์ฌ index์ ํด๋นํ๋ ์๋ฆฌ๋ฅผ ์ฑ์ฐ๊ณ index+1 ๋ก ๋์ด๊ฐ๋๋ก
์๊ธฐ ์์ ์ ํธ์ถ, ์ด ๊ณผ์ ์ด n ์๋ฆฟ์์ ์กฐํฉ์ด ์์ฑ๋ ๋๊น์ง ๋ฐ๋ณต
์ฒซ ํธ์ถ comb_recursive(arr, 3, 0, 0)
index
๊ฐ 0์ด๊ณ , current
๊ฐ 0์ผ๋ก ์์
๋ฐ๋ณต๋ฌธ์์ i
๋ 0๋ถํฐ ์์ํ์ฌ arr[0] = 0
์ ์ ์ฅํ ํ, comb_recursive(arr, 3, 1, 1)
์ ํธ์ถ
๋ ๋ฒ์งธ ํธ์ถ comb_recursive(arr, 3, 1, 1)
index
๊ฐ 1์ด๊ณ , current
๊ฐ 1๋ก ์ค์
๋ฐ๋ณต๋ฌธ์์ i
๋ 1๋ถํฐ ์์ํ๋ฉฐ arr[1] = 1
์ ์ ์ฅํ๊ณ , comb_recursive(arr, 3, 2, 2)
๋ฅผ ํธ์ถ
์ธ ๋ฒ์งธ ํธ์ถ comb_recursive(arr, 3, 2, 2)
index
๋ 2์ด๊ณ , current
๋ 2
๋ฐ๋ณต๋ฌธ์์ i
๋ 2๋ถํฐ ์์ํ์ฌ arr[2] = 2
๋ฅผ ์ ์ฅํ๊ณ , comb_recursive(arr, 3, 3, 3)
์ ํธ์ถ
๋ค ๋ฒ์งธ ํธ์ถ comb_recursive(arr, 3, 3, 3)
index
๊ฐ n
(3)๊ณผ ๊ฐ์์ง = 3์๋ฆฌ ์ซ์์ ์กฐํฉ์ ์์ฑํ๋ค๋ ์๋ฏธ
โprint_combn
ํจ์๊ฐ ํธ์ถ๋์ด ํ์ฌ์ ์กฐํฉ์ธ 012
๋ฅผ ์ถ๋ ฅ
์ฌ๊ธฐ์ ์ฌ๊ท ์ข ๋ฃ. ํจ์์ข ๋ฃ๋์ด ์ธ ๋ฒ์งธ ํธ์ถ๋ก ๊ทํ
๋ค์ i
๊ฐ์ 3์ผ๋ก ์ค์ ํ๊ณ , arr[2] = 3
์ผ๋ก ๋ณ๊ฒฝ
comb_recursive(arr, 3, 3, 4) ํธ์ถ
013 ํธ์ถ
์ด ๊ณผ์ ์ ๊ฐ๋ฅํ ๋ชจ๋ index
์ current
์กฐํฉ์ด ์์ฑ๋ ๋๊น์ง ๋ฐ๋ณต
789
์ ๋๋ฌํ๋ฉด is_last
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ", "
๋ฅผ ์ถ๋ ฅ