<DIP, Intensity Transform and Spatial Filtering> Background

 - Spatial Filtering의 Intensity Transformation

   영상은 기본적으로 2차원으로 x, y좌표는 실제 픽셀의 위치관계를 나타냄.

    g(x,y) = T[f(x,y)] //g() = 출력영상, f() = 입력영상
    
    식을 통해 T를 적용하면 밝기값만 달라진 영상이 나오게 됨.

 

 

1. Intensity Transformation의 function

 

  >>공간 도메인에서 필터링을 하는이유

    : 특정 영상에서 내가 원하는 정보를 추출하는데 그 밝기값이 좋지 않을 때 더 좋은 결과를 얻기 위함.

 

  >>공간 도메인에서 필터링의 목적

    : 사람의 눈으로 봤을 때, 추출 가능한 정보가 얼마나 많고 얼마나 잘 구분할 수 있을지 개선하는 것이 가장 큰 목적.

 

     (a) Image Negative 함수 (ex. 유방암 검진)

       - 구체적인 혈관 위치를 보기 어려운 경우 밝기값을 반전시켜 혈관의 위치를 더 디테일하게 볼 수 있음.

 

     (b) Log Transformations 함수

       - 주로 scale이 몰려있는 경우 사용.

       - 확대와 같은 역할.

       - log를 취해 range를 변환하여 더 많은 정보를 추출함.

 

     (c) Power-law(Gamma) Transformation 함수

       - Gamma 값에 따라 mapping함수의 커브가 변함. 

       - Gamma 값이 하나의 값이 아닌 여러가지 값을 사용하며 실제 영상의 밝기 값이 그대로 나올 수 있도록 보정적용.

       ex) TV 브라운관 사용시 의도한 전파 강도와 다른 전파가 전달됨. 의도한 결과를 위해 커브를 다르게 해서 매핑.

       - Gamma 값이 작을 수록 밝게 나오는데 원하지 않는 부분도 밝아질 수 있음.

         => 특정 밝기 값이 좋은게 아님.

         => 사람이 눈으로 봤을 때 없던 정보를 찾을 수 있거나 비교할 수 있게 하는 것이 목적.

 

     (d) Piecewise-Linear Transformation Functions [Contrast stretching]

        - 적용가능하기 위해선, 밝기 값을 변화하고자 하는 영상에서 어느 특정 부위에 밝기값이 몰려있는지 알아야 함.

          ex) contrast stretching 함수 적용 => 열매에 있는 점들을 더 잘 볼 수 있게 됨.

               + thresholding function 적용 => 한 기준점을 중심으로 어두운 부분은 완전 어둡게, 밝은 부분은 완전 밝게.

     - Contrast-stretching

        : 특정 구간안에 있는 밝기 값의 범위를 넓혀줌. 특정 구간에서는 급속도로 밝기 값이 변화하고 특정 밝기 값을 넘어가면 그대로 유지됨.

     - Thresholding function

        : 특정 구잔을 넘어야 최대 밝기값이 나옴.

     (e) Piecewise-Linear Transformation Functions [Intensity-level slicing]

        - 먼저 밝기 정보를 알고 있던 경우 가능

        - 밝기 정보를 안다면 특정 정보를 추출해 낼 수 있는데, 변환함수를 적용해서 특정 구간을 추출함.

        - 다른 부분은 똑같이 하고 원하는 부분만 밝기를 높이는 것도 가능.

        - 사람이 인지하기 힘든 특정 Gap에 있던 부분들을 확 높여줌으로써 구분할 경우 유용하게 사용됨.

 

     (f) Piecewise-Linear Transformation Functions [Bit-plane slicing]

        - 영상의 한 화소당 8bit이므로 8bit plane으로 나눔.

        - 가장 높은 구간 = MSB(Bit plane 8), 가장 낮은 구간 = LSB(Bit plane 1)

        - bit plane이 낮을수록 변화의 범위가 좁음.

        - bit plane이 MSB에 가까워질수록 다른 정보가 없어도 원본 영상과 가장 유사함.

        - 7, 8 bit plane구간만 합쳐져도 충분히 좋은 영상이며 5,6,7,8이 있다면 거의 원본과 유사.

         => 실제 전체 정보를 사용하지 못하는 경우나, 빠른 처리를 원하는 경우 유용함.

react란, 사용자 태그 기술을 만들어 준다.

이런 기술을 component라 부름.

 

<component 기능>

1. 가독성을 높일 수 있음.

2. 재사용성이 높아짐.

3. 유지보수가 편리해짐.

 

npm이용 -> 홈페이지 다운로드

 - npm을 이용하여 create react app 설치

npm install -g create-react-app

(-g : 컴퓨터 어디서든 사용 가능)

 

 - 버전확인

 create-react-app -V

 

 ! 공식 : npx(create-react-app 설치 시 설치한 당시에만 사용할 수 있고 지워짐. 공간낭비를 안함. 항상 최신상태를 사용)

        npm은 공식은 아니지만 한번 설치하면 계속 사용이 가능.

 

 * 폴더 생성 시 react라 하면 안됨! 거절함.

 * 폴더 안에서 create-react-app .을 쳐주면 개발환경 설치가 완료됨.

 

 

실행 : npm run start

종료 : ctrl + c

 

public - index.html

index.html을 실행하면 위의 웹 페이지를 실행한 결과가 나옴.

 

 

id가 root인 곳에 들어가는 파일들에는 react에서 만든 component들이 들어가게 되는데, src안에 component들을 넣어둠.

 

여기에 있는 root라는 이름 설정을 통해 소통하므로, 여기의 root의 이름을 바꾼다면 위의 root도 이름을 바꿔주면 됨.

 

<APP />이 react를 통해 만든 component app이다.

component의 실제 구현은 위의 import를 통해서 './App(.js생략)'파일안에 있음.

 

App.js파일 안의 함수에서 <div className="App>과 </div> 사이의 내용을 지우고 원하는 글자를 입력하면 해당 실행 화면이 바뀌게 됨.

 

 

index.css파일을 수정하면 디자인을 바꿀 수 있음.

 

ex)

boy{

background-color : 원하는색;

}

이 index.css파일에 들어있다면, 배경 색이 지정한 색으로 변경이 됨.

 

import App from './App'

ReactDOM.render(<App />, 어쩌고);

에서 import 바로 옆의 App과 밑에줄의 App만 이름을 갖게 해주면 어떤 이름이든 상관 없음!

만약 from 오른쪽의 App을 갖게 바꿔주면 문제가 될 수 있는데, 이 부분은 그냥 파일 이름이기 때문에 파일 이름에 맞춰서 해주면 됨! 만일 파일 이름이 바꾼 이름이랑 같다면 문제 안됨.

 

빌드 : npm run build

->build 디렉토리가 추가

자동으로 용량을 줄이고 불필요한 메세지를 지워줌.

그래서 배포 시에는 build안의 파일들을 사용하면 됨.

 

npm install -g serve : 컴퓨터 어디서나 server명령어를 통해 웹서버를 실행할 수 있음.

또는 한번 실행은 npx serve -s build. -s는 실행할 때 build를 document root로 하겠다는 명령어.

-> 주소를 알려주고 그 주소로 들어가면 뜨는데, 용량이 확 줄어든 페이지가 뜨는 것을 볼 수 있음.

 

 

 

정리 예쁘게 바꾸는건 나중에,,,ㅎㅎ~

'공부' 카테고리의 다른 글

< Toss face > 귀여운 토스 이모지  (0) 2022.02.28
github 예쁘게 꾸미기  (0) 2022.02.15
DP 공부  (0) 2022.02.14
List, 연결List, 단순연결List  (0) 2022.02.13

 

안녕하세요!!🥳

이번에 토스에서 너무 귀여운 이모지가 나와서 안가지고 올 수 없겠더라구요!!ㅎㅎ

 

그래서 오늘 가져온 주제는~~

토스페이스 살펴보기

 

기본 이모지들에서 다른 느낌의 표정을 가진 토스페이스가 출시되었습니다:)

일단 사이트부터가 너무 예뻐서 계속 머물고 싶은 느낌이었어요!!

 

 

사이트 들어가시면 360도로 회전, 확대축소가 가능한 귀요미들이 쭉 나오게 됩니다!!

거기서 신나게 놀다가 이제 이모지를 사용해보러 고고~~

 

 

토스페이스 다운로드하기


 

무료로 배포한다니 정말 좋지 않나요??

감사합니다ㅠㅠ

 

먼저 다운로드를 클릭하게 되면

 

tff파일이 하나 저장됩니다

 

 

tff파일을 install하게 되면

 

 

폰트 관리하는 창이 뜨게되는데...!!

여기에 없더라구요ㅠㅠ

다운로드가 잘 안되나

 

아직 불안정한건지 제가 잘 못하는 건지 모르겠어요

혹시 방법을 아시는 분은 댓글남겨주시면 감사드리겠습니다🌹

 

결국 오늘 사용은 실패!

다음에는 한번 가져와 보도록 하겠습니다😘

 

 

제일 중요한 저작권!!


 

토스페이스 저작권은 위와 같다니 조심해서 사용하시기를 바랍니다!!

이용하실 경우에는

이 페이지에는 토스팀에서 제공한 토스페이스가 적용되어 있습니다

를 꼭 표시해 달라고 합니다!!☺️

 

 

 

그럼 다음으로는 나만의 이모지 만들기를 살펴보겠습니다

 

이곳은 나만의 이모지를 만드는 곳입니다ㅎㅎ

결과를 먼저 알려드리자면 저 유령이 나왔어요!

 

간단하게 어떤 방식인지 살펴보고 오겠습니다:)

 

 

이렇게 원하는 이름으로 설정이 가능합니다

 

 

오늘의 기분을 선택해 주시고,

 

 

끌리는 이모지까지 선택해 주면!!

 

 

우헤헤

어때요 너무 귀엽죠??

저만의 이모지가 완성됩니다!~!

 

선택한 기분과 이모지를 합친 귀요미가 나오게 되는방식💜

그럼 이 이모지가 왜 나오게 되었는지 알아볼까요??

이모지는 일본에서 처음 만들어져서 일본의 문화가 짙게 잠겨있다고 합니다.

그 스타일을 한국 스타일대로 재해석해서 탄생한게 바로 토스페이스!!

또한 예전에 있다가 지금은 사라진 친구들도 지금에 맞게 변경이 되었다구 합니다

 

정말 좋은 의도인 것 같아요!:)

 

 

 

사용방법을 빨리 알아봐야지~~

 

https://toss.im/tossface#hero

 

토스의 이모지 폰트, 토스페이스

3,600개의 새로운 표정을 만나보세요.

toss.im

 

    다들 한번 방문하러 고고~~!!

 

 

 

 

사진출처 : 토스페이스 홈페이지

'공부' 카테고리의 다른 글

react 공부하기 - 1  (0) 2022.03.17
github 예쁘게 꾸미기  (0) 2022.02.15
DP 공부  (0) 2022.02.14
List, 연결List, 단순연결List  (0) 2022.02.13

안녕하세요!!

오늘은 조금 말썽부리는 함수 친구를 데려왔습니다:)

 

 

1. ft_atoi

 🍀 문자열을 정수로 변환하는 함수

     

    📌 함수원형 (man atoi 기준)

int atoi(const char* nptr)

        ✏️ 받아온 인자를 정수로 변환하여 return   

        ✏️ 맨 앞의 공백문자들은 무시

        ✏️ 부호기호는 한 개만 있어야 인정!

        ✏️ '0~9' 사이의 문자가 아닌 경우 중단!

        ✏️ 만일 long long형의 범위를 넘는 경우 별도의 예외처리❗ 

            ✔ 음수일 때 넘은 경우

               ▪ return (0);

            ✔ 양수일 때 넘은 경우

               ▪ return (-1);

            ✔ int형의 범위를 넘은 경우

               ▪ 그냥 overflow 상태 return

 

        🐣 long long형은 int형 연산할 때 초과되는 범위를 다루는 경우 자주 사용!~!

 

✅ 코드 구현

#include "libft.h"
static long long	ft_over(long long flag, long long tmp, long long num);

int	ft_atoi(const char *str)
{
	size_t		i;
	long long	num;
	int			flag;
	long long	tmp;

	i = 0;
	num = 0;
	flag = 1;
	while (str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))
		i++;
	if (str[i] == '-')
		flag = -1;
	if (str[i] == '-' || str[i] == '+')
		i++;
	while (str[i] >= '0' && str[i] <= '9')
	{
		tmp = num;
		num = num * 10;
		num += str[i++] - '0';
		num = ft_over(flag, tmp, num);
		if ((tmp > 0) && (num <= 0))
			break ;
	}
	return (num * flag);
}

static long long	ft_over(long long flag, long long tmp, long long num)
{
	if ((flag == -1) && (tmp > num)) // tmp > num인 경우는 오버플로우인 경우 뿐!
		return (0);
	else if ((flag != -1) && (tmp > num))
		return (-1);
	else
		return (num);
}

 

'42서울' 카테고리의 다른 글

[libft] tolower & toupper  (0) 2022.02.17
libft - mem시리즈  (0) 2022.02.08
Libft - is시리즈  (1) 2022.01.05
42서울 라피신 후기  (0) 2022.01.05

오늘은 아주 간단한 tolower와 toupper을 가지고 왔습니다!:)

최근에 깃허브 꾸미기를 하면서 잠시 마크다운 언어를 써 보았기 때문에,
오늘은 특별히 마크다운으로 글을 작성해 보려구 합니다!
그럼 시작~🚗

1. ft_tolower


📌 tolower란, int c를 통해 c가 대문자인 경우 소문자로 바꿔주는 함수입니다.
🍀 함수 원형


    int tolower(int c)

✔ 해당 함수는 소문자로 변경을 해주어야 하기 때문에 둘의 차이인 ''a' - 'A''를 더해 줌으로써, 대문자를 소문자로 만들어 줍니다.

🍀 코드보기


#include "libft.h"
int    ft_tolower(int c)
{
    if (c >= 'A' && c <= 'Z')
    {
        c = c + ('a' - 'A');
    }
    return (c);
}




2. ft_toupper


📌 tolower란, 위와 반대로 int c를 통해 c가 소문자인 경우 대문자로 바꿔주는 함수입니다.
🍀 함수 원형


    int toupper(int c)

✔ 해당 함수는 대문자로 변경을 해주어야 하기 때문에 'a'를 빼고 'A'를 더해주어, 'A'+1 = 'B'와 같은 형식으로 다룰 수 있게 바꿔줌으로써 원하는 문자로 만들어 줍니다.

🍀 코드보기


#include "libft.h"
int    ft_toupper(int c)
{
    if (c >= 'a' && c <= 'z')
    {
        c = c - 'a' + 'A';
    }
    return (c);
}

'42서울' 카테고리의 다른 글

[libft] ft_atoi  (0) 2022.02.18
libft - mem시리즈  (0) 2022.02.08
Libft - is시리즈  (1) 2022.01.05
42서울 라피신 후기  (0) 2022.01.05

 

 

안녕하세요!!

오늘은 github 예쁘게 꾸미는 방법을 들고 왔습니다!!:)

 

따끈따끈하게 오늘 꾸며서 가지고 와봤는데요,

먼저 최종 결과가 어떻게 되었는지부터 맛보기로 보고 가보시죠!!

 

 

짜란~~~~

그냥 썰렁했던 github 프로필이 이렇게 변했습니다!!😎

 

그러면 어떤 것들을 어떻게 적용시켰는지에 대한 방법을 알려드리도록 하겠습니다~!

 

 

1. 새 repository 생성

 

github를 꾸미기 위해서는 자신의 이름으로 된 repository가 필요합니다!

현재 저는 만든 상태에서 예시를 들기 위해 찍어 빨간경고가 떠있지만,

처음 만들게 되면 파란색으로 정상적인 create이 됩니다.

 

 ❗ 꼭 자신의 이름으로 된 repository를 생성해야합니다

 ❗ Add a README file을 클릭해주세요

 

 

이렇게 자신의 이름으로 된 repository가 완성이 됐습니다!

그러면 Hi there이라는 내용이 담긴 readme가 담겨있게 됩니다🤗

 

 

 

 

 

2. 뱃지 넣기

https://simpleicons.org/?q=python 

 

Simple Icons

2172 Free SVG icons for popular brands.

simpleicons.org

https://shields.io/

 

Shields.io: Quality metadata badges for open source projects

Love Shields? Please consider donating to sustain our activitiesYour BadgeStaticUsing dash "-" separator/badge/ - - Dashes --→- DashUnderscores __→_ Underscore_ or Space  →  SpaceUsing query string parameters/static/v1?label= &message= &color= Colo

shields.io

 

꾸미기에 들어가기 앞서, 가장 많이 사용되는 사이트입니다!

git을 꾸미는 분들이라면 무조건 하나쯤은 있다는 이 뱃지 많이 보셨었죠??

이 뱃지를 위의 사이트를 이용해서 만들 수 있습니다:)

 

✔ C언어 아이콘 예시

<img src="https://img.shields.io/badge/C-A8B9CC?style=flat-square&logo=C&logoColor=black"/>

 

  •  자세한 설명
더보기
<img src="https://img.shields.io/badge/

이 부분까지는 동일하고,

C-A8B9CC

여기서 '아이콘에서 오른쪽에 적힐 내용 - 색깔'을 지정해 주면 됩니다!

색은 위에 사이트가면 다양한 색들이 있으니 참고해서 사용해주세요:)

 

ex)

 

🍀 simple icons 사이트는 이러한 형식으로 되어있습니다.

여기서 밑에 #에 해당하는 부분이 색을 의미합니다.

만약 저 파란색을 그대로 사용하고 싶다면,

C-3776AB를 적어주면 됩니다

 

 

 

🍀Shields.io 사이트에는 colors를 이렇게 모아 적어준 부분이 있습니다!

핑크색을 사용하고 싶다면, C-ff69b4를 입력해주면 됩니다.

 

 

?style=flat-square

다음은 스타일입니다. 해당 블럭의 모양을 결정할 수 있는데, 이 부분도 위의 사이트에 종류들이 나와있으니 해당 종류들을 참고하여 바꿔주면 됩니다. 현재 flat-square는 제가 사용한 네모가 나오게 됩니다.

 

&logo=C&logoColor=black"/>

 마지막으로 logo입니다! logo=C부분은 위의 python사진으로 예시를 들었을 때, 왼쪽 밑에 크게 검정색으로 Python이라 적힌 글씨가 보일 것입니다! 그 부분이 해당 아이콘의 이름이고, 그걸 logo='아이콘이름'에 적어주면 해당 아이콘이 나오게 됩니다. logoColor는 해당 로고의 색을 지정해 주는 것입니다:)

 

간단하죠??

 

 

 

3. 글씨 꾸미기

 

글씨의 크기나 밑줄 같은 여러 가지는

https://gist.github.com/ihoneymon/652be052a0727ad59601

 

마크다운(Markdown) 사용법

마크다운(Markdown) 사용법. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

마크다운 사용법에 자세히 나와 있습니다!

저도 이걸 참고하여 작성하였습니다:)

 

 

 

4. Stat 표시하기

 

 이제 깃허브를 막 시작하여 많이 적은 Commit을 보유하고 있지만, 그래도 예시를 들기 위해 가져온 사진입니다!!

이 스탯을 넣는 방법은 아주 간단합니다.

 

 

✔ Stat예시

 ![Seoyeon's GitHub stats](https://github-readme-stats.vercel.app/api?username=dkjefilsjl&show_icons=true&theme=radical)

 

여기서 username만 자신의 이름으로 바꿔주면 되는데요! 저는 앞에 00's GitHub stats가 표시되는 이름일 것이라 생각하고 제 이름으로 바꿨지만, 원래 정해져있는 제 이름으로 자동으로 표시되더라구요ㅎㅎ

 

 

 

 

5. Pinned 통계 노출

 

이제 제일 복잡했던 부분이 나왔습니다!

 

자신이 언제 가장 많은 커밋을 하는지 볼 수 있는 부분인데요,

저는 오전에 많은 커밋을 해서 귀여운 병아리🐣가 나왔습니다:)

저녁에 많은 커밋을 하게되면 귀여운 부엉이🦉를 만나볼 수 있어요!!

 

 

  • 그러면 이러한 창이 뜨는데, 제목과 내용은 상관없으니 아무거나 적어주고, 밑에 초록색을 클릭하여 public으로 바꿔준 후 초록색 버튼을 눌러 생성합니다.

 

 

  • 생성 후 이제 위에 주소창을 보시면 'https://gist.github.com/사용자아이디/어쩌고저쩌고'라고 적혀있을 겁니다!
  • 여기서 어쩌고저쩌고부분을 복사해서 저장해 둡니다. 이 부분은 후에 GIST_ID로 들어가게 됩니다.
  • 이제는 https://github.com/settings/tokens/new 여기로 들어가서 토큰을 생성할 차례입니다.

 

 

 

✔ Note 부분은 그냥 이 토큰이 무엇인지 적은 다음, 밑에 repo와 gist를 클릭해 주셔야합니다.

 

✔ 그 후 토큰 생성을 클릭하면 토큰이 생성됩니다.

 

❗ 토큰을 생성하면 해당 페이지에 토큰이 나오게되는데, 그 토큰을 꼭!! 복사해주셔야 합니다.

 

✔그 창을 나가시면 다시 찾을 수가 없다구 합니다😥

 

 

 

 

 

  • 토큰까지 복사해 두셨으면, fork한 레포로 돌아가서 Schedule.yml파일에 Setting으로 들어가야합니다.

 

✔ 상세설명

더보기

 

fork한 productive-box로 들어가줍니다.

 

 

이 위치에는 schedule.yml이 존재하는데, 오른쪽 위에 위치한 Settings를 클릭해줍니다.

 

 

왼쪽 밑에 보시면 Secrets가 존재하는데, 여기에는 Actions와 Dependabot이 있습니다.

저는 처음에 Dependabot에 설정을 해 두었다가 제대로 작동하지 않았는데,

꼭 Actions에 설정을 해 주셔야 합니다!

 

 

위 사진이 잘 된 예시입니다.

아직 밑에 저 두개는 만들지 않아 비어있을텐데 이제 저 두개를 만들도록 하겠습니다:)

 

  • Settings의 Secrets에서 Actions로 들어가게 되면 New repository secret 버튼이 있습니다.
  • 그 버튼을 클릭하여 GH_TOKEN과 GIST_ID에 아까 복사해둔 토큰과 gist id를 넣어서 생성해줍니다.

 

 

이제 이렇게 되면 setting이 완료됩니다.

❗ secrets의 이름을 틀리면 제대로 동작하지 않기 때문에 주의깊게 확인해 주세요!!

 

  • 이제 정말 마지막으로 프로필에서 gist를 고정해주는 일만 남았습니다.
  • 프로필을 내리다 보시면 'Customize your pins'라는 부분이 보이실 겁니다.

 

 

  • 저 부분을 클릭하게 되면, 자신이 아까 만들었던 gist와 여러 레포들을 볼 수 있습니다.

 

 

  • 해당 pin부분에 고정시켜 둘 아이들을 고르는 곳인데 최대 6개까지 선택이 가능합니다. 그 중 저는 gist만 일단 선택하였습니다. (Tip. 아직 갱신이 되지 않아 gist는 자신이 만들 때 적어두었던 제목으로 되어있을 가능성이 높습니다! 해당 이름을 클릭해주시면 됩니다.ㅎㅎ)
  • 그러면 이제 자신의 stat이 뜨게 됩니다. 하지만 1시간 주기로 갱신되기 때문에 아직 우리의 결과물이 제대로 안떴다면 바로 적용해 주는 방법이 있습니다.
  • 저희가 fork했던 레포로 다시 돌아가서 이번엔 Actions를 클릭해 줍니다. 그러면 위에 파란글씨가 보일 것입니다.

 

 

이 상황이라면 파란글씨를 눌러주세요!!

  • 다음은 readme를 편집해줍니다. 어떤 편집이든 상관없고 엔터 한번 누르고 수정을 누르셔도 됩니다.
  • 그 다음 actions로 돌아가게 되면 update부분이 뜨게 됩니다.

 

  • 이 update부분 앞에가 초록색 체크표시로 바뀌게 된다면 성공입니다.
  • 이제 다시 자신의 프로필로 돌아가서 확인해보세요!!

이게 떠있으면 성공입니다!! 수고하셨어요:)

 

 

 

 

이렇게 저의 github 꾸민 법을 함께 보셨습니다~!!

혹시 저 위의 seoyeon's github를 설정한 부분이 궁금하다면

 

https://github.com/kyechan99/capsule-render

 

GitHub - kyechan99/capsule-render: Dynamic Coloful Image Render

:rainbow: Dynamic Coloful Image Render. Contribute to kyechan99/capsule-render development by creating an account on GitHub.

github.com

 

여기를 들어가 주세요!!

이 오픈소스를 사용하여 만들었습니다:)

 

예쁜 디자인 잘 선택해서 자신만의 git을 만들어보아요💝

 

 

제 깃허브에도 놀러오세요~~!!

https://github.com/dkjefilsjl

 

dkjefilsjl - Overview

dkjefilsjl has 15 repositories available. Follow their code on GitHub.

github.com

아직은 애기github지만, 점점 초록색으로 채워나갈 예정입니다!!

'공부' 카테고리의 다른 글

react 공부하기 - 1  (0) 2022.03.17
< Toss face > 귀여운 토스 이모지  (0) 2022.02.28
DP 공부  (0) 2022.02.14
List, 연결List, 단순연결List  (0) 2022.02.13

1. DP(동적계획 알고리즘)

 🍀 그리디 알고리즘과 같이, 최적화 문제를 해결하는 알고리즘.

    ✏️ 최적화 문제 : 여러 해 중에서 최적(최대나 최소같은) 값을 구하는 문제

    ✏️ 최적 부분문제 구조

      📌 동적 계획법이 최적화에 대한 어느 문제나 적용될 수 있는 것은 아님!!

           ✔ 최적화의 원칙이 성립해야만 적용이 가능.

               ▪ 최적화의 원칙이란, 어떤 문제에 대한 해가 최적일 때 그 해를 구성하는 작은 문제들도 해가 최적이어야 함.

    ✏️ 중복 부분문제 구조

      📌 DP는 큰 문제를 이루는 작은 문제들을 먼저 해결하고, 작은 문제들의 최적 해를 이용하여 순환적으로 큰 문제를 해결함.

           ✔ 순환적인 성질로 인해, 이전에 계산되었던 작은 문제의 해가 다른 곳에서 필요하게 되는데 DP는 이미 해결된 작은 문제들의 해를 어떤 저장 공간(table)에 저장하면서 중복 계산을 피할 수 있게 함.

 

 

+2022.02.16 추가

 

2. DP(동적계획 알고리즘) vs 분할정복

 🍀 DP (상향식 - 의존적 관계) 

    ✔ 부분문제들이 연관이 없으면 적용할 수 없음. (부분문제들은 더 작은 부분문제들을 공유한다.)

    ✔ 모든 부분문제를 한번만 계산하고 결과를 저장하고 재사용.

    ✔ 분할 정복은 같은 부분문제가 나타나는 경우 다시 계산.

 

 🍀 분할정복 (하향식)

    ✔ 연관이 없는 부분문제로 분할.

    ✔ 부분문제를 독립적, 재귀적으로 해결.

    ✔ 부분문제의 해를 결합.

    ✔ ex) 병합정렬, 퀵정렬.

 

  📌 DP의 의존적 관계들은 문제에 따라 다르고, 대부분 뚜렷하게 보이지 않아 함축적인 순서라 함.

  📌 재귀 DP가 구현이 더 쉽기 때문에 하향식도 많이 사용함.

 

 

 

3. DP 적용 접근

  • 최적해 구조의 특성을 파악

     ✔ 문제를 부분문제로 나눔.

  • 최적해의 값을 재귀적으로 정의

     ✔ 부분 문제의 최적해 값에 기반하여 문제의 최적해 값을 정의.

  • 상향식 방법으로 최적해의 값을 계산

     ✔ 가장 작은 부분문제부터 해를 구하고 테이블에 저장.

     ✔ 테이블에 저장되어있는 부분 문제의 해를 이용하여 점차적으로 상위 부분문제의 최적해를 구함.

 

 

 

4. DP 적용

 🍀 피보나치 수 DP적용

 

   ✔ DP알고리즘이 수행속도가 더 빠름.

      - 재귀 알고리즘과는 달리 중복 계산이 없음.

      - 반복문을 사용하기 때문에 함수 호출이 발생하지 않음.

 

   ✔ 계산하는 항의 총 개수

      - T(n) = n + 1

      - 단 한번씩만 계산.

 

 🐣 간단히 보는 코드 🐣

 

   ✔ DP 피보나치

fibo_dp(n)
{
	f[0] = 0;
	f[1] = 1;
	for(int i = 2; i <= n; i++)
	{
		f[i] = f[i - 1] + f[i - 2];
	}
	return f(n);
}

 

   ✔ memo를 이용한 재귀 피보나치

memo[] = {-1,};
memo[0] = 0;
memo[1] = 1;


fibo(n)
{
	if((n>2) && (memo[n] == -1))
		memo[n] = fibo(n-1) + fibo(n-2);
	return memo[n];
}

 

'공부' 카테고리의 다른 글

react 공부하기 - 1  (0) 2022.03.17
< Toss face > 귀여운 토스 이모지  (0) 2022.02.28
github 예쁘게 꾸미기  (0) 2022.02.15
List, 연결List, 단순연결List  (0) 2022.02.13

1. List

 🍀 순서를 가진 데이터의 집합을 가리키는 추상 자료형

    ✏️ 동일한 데이터를 가지고 있어도 상관 없음.

    ✏️ 구현 방법에 따라 크게 두 가지로 나뉨.

      ▪ 순차 List : 배열을 기반으로 구현된 List

      ▪ 연결 List : 메모리의 동적할당을 기반으로 구현된 List

    ✏️ 주요 함수

      ▪ addtoFirst()

      ▪ addtoLast()

      ▪ add()

      ▪ delete()

      ▪ get() : 특정 위치 원소를 return

 

 

2. 연결 List

 🍀 단순 배열을 이용한 순차 List의 단점을 보완한 자료구조

    ✏️ 개별적으로 위치하고있는 원소의 주소를 연결하여 하나의 전체적인 자료구조를 이룸

    ✏️ 순차 List에서 물리적인 순서를 맞추기 위한 작업이 필요하지 않음.

    ✏️ 자료구조의 크기를 동적으로 조정할 수 있어, 메모리의 효율적인 사용이 가능.

    ✏️ 단점 : 구현이 배열 List보다 복잡함.

      📌 노드 : 연결 List에서 하나의 우너소에 필요한 data를 갖고 있는 자료의 단위.

        ▪ 데이터 필드 : 원소의 값을 저장하는 자료구조. 저장할 원소의 종류나 크기에 따라 구조를 정의하여 사용

        ▪ 링크 필드 : 다음 노드의 주소를 저장하는 자료구조

      📌 헤드 : List의 처음 노드를 가리키는 자료구조

 

 

3. 단순 연결 List

 🍀 처음 위치에 node를 삽입하기

addtoFirst(L, i)
	new <- createNode();
	new.data = i;
	new.link = L;
  	L = new;
end addtoFirst()

 

 🍀 임의의 위치에 node를 삽입하기

add(L, pre, i)
	new <- createNode()
	new.data = i;
	if (L=NULL) then {
		L = new;
		new.link = NULL;
	}
	else {
		new.link = pre.link;
		pre.link = new;
	}
end add()

 

 🍀 마지막 위치에 node를 삽입하기

addtoLast(L, i)
	new <- createNode()
	new.data = i;
	new.link = NULL;
	if (L=NULL) then {
		L = new;
		return;
	}
	temp = L;
	while (temp.link != NULL) do
		temp = temp.link;
	temp.link = new;
end.addtoLast()

 

 🍀 노드 삭제 알고리즘

delete(L, pre)
	if (L==NULL) then error;
	else {
		target = pre.link;
		if (target == NULL) then return;
		pre.link = target.link;
	}
	freeNode(target)
end delete()

 

 ✔ c++ 코드 구현 ✔

#define MAX_NODE 10000

struct Node {
	int data;
	Node* next;
};

Node node[MAX_NODE];
int nodeCnt = 0;
Node* head;

Node* getNode(int data) {
	node[nodeCnt].data = data;
	node[nodeCnt].next = nullptr;
	return &node[nodeCnt++];
}

void init() // 초기화
{
	head = getNode(-1);
	//nodeCnt = 0;
}

void addNode2Head(int data) // 앞에 넣기
{
	Node *newone;

    newone = getNode(data);
	newone->next = head->next;
	head->next = newone;
}

void addNode2Tail(int data) // 마지막에 넣기
{
	Node* ptr = head;
	while (ptr->next)
	{
		ptr = ptr->next;
	}
	ptr->next = getNode(data);
}

void addNode2Num(int data, int num) // 원하는 위치에 넣기
{
	int n = 1;
	Node* ptr = head;
	Node* curr;
	while (n < num)
	{
		if ((ptr->next) == nullptr)
			ptr->next = getNode(0);
		ptr = ptr->next;
		n++;
	}
	curr = ptr->next;
	ptr->next = getNode(data);
	ptr = ptr->next;
	ptr->next = curr;
}

void removeNode(int data) // 삭제
{
	Node* ptr = head;
	Node* curr;
    
	while (ptr->next)
	{
        if (ptr->next->data == data)
        {
            curr = ptr->next;
        	ptr->next = curr->next;
            break;
        }
		ptr = ptr->next;
	}
}


int getList(int output[MAX_NODE]) // 원하는 Node찾기
{
	Node* ptr = head->next;
	int cnt = 0;
	while (ptr)
	{
		output[cnt] = ptr->data;
		cnt++;
		ptr = ptr->next;
	}
	return (cnt);
}

 

'공부' 카테고리의 다른 글

react 공부하기 - 1  (0) 2022.03.17
< Toss face > 귀여운 토스 이모지  (0) 2022.02.28
github 예쁘게 꾸미기  (0) 2022.02.15
DP 공부  (0) 2022.02.14

+ Recent posts