알고리즘(Algorithm)
알고리즘(algorithm)은 어떠한 문제를 해결하기 위해 정해진 일련의 절차이다.
즉, 문제 해결에 필요한 처리과정의 순서를 의미한다. 컴퓨팅사고의 일부분이다.
계산 절차를 뜻하는 ‘algorithm’ 알고리즘의 어원은 아랍의 수학자인 알콰리즈미(Abu 'Abd Allah Muhammad ibn Musa al-Khwarizm) 이름에서 유래하였다.
무하마드 알 콰리즈미(780?~850?)는 중세 이슬람의 가장 중요한 수학자로 인정받고 있으며 '대수학(algebra)의 아버지'로 불린다.
알 콰리즈미의 저서 중 가장 유명한 것은 《완성과 균형에 의한 계산 개론(Kitab al-mukhasar fi hisab al-jabra wa’l muqabala)》으로,
이 책의 제목에서 용어 ‘algebra’가 유래했다. 그는 ‘상속, 유산, 분배, 소송, 교섭 등의 상황과 상거래의 모든 상황에서 반드시 필요한
산술을 가장 간결하면서도 매우 유용하게 하거나 또는 토지의 측량, 수로 건설, 기하학적 계산, 그 밖의 유사한 매우 다양한 분야’를
가르치기 위해 이 책을 저술했다. 《Al-Jabr》는 알 콰리즈미가 일차방정식과 이차방정식을 체계적으로 푸는 방법을 보여주는 교과서다.
알고리즘 조건
알고리즘(algorithm)은 문제를 해결하기 위해 추상화된 핵심 원리를 일련의 절차로 표현하는 과정이다.
프로그램작성의 관점에서 보면 알고리즘은 문제해결을 추상화한 것이다.
잘 정의된 알고리즘을 보고 다양한 프로그램 언어로 이를 구현할 수 있다.
알고리즘은 특허의 대상이 될수있다.
알고리즘 표현방법(다양함)
- flow chart(순서도/흐름도)
- Pseudo Code (의사 코드)
- 자연어
Amazon 추천 알고리즘(특허)
넷플릭스와 함께 유명한 추천 시스템을 가진 회사가 아마존이다.
아마존은 회원들의 소비 패턴을 분석해 구매 가능한 상품을 추천하는데, 아마존 성장의 일등 공신으로 매출의 35%가 추천 상품에서 발생한다.
아마존은 자사의 추천 시스템을 ‘A9'이라 부르고 특허로 등록했다.
아마존은 고유의 Item-to-item collaborative filtering을 사용한다.
(참고 : Amazon Recommandation Item-to-item Collaboration Filtering, Greg Linden, Brent Smith, and Jeremy York, Amazon, 2005 논문)
상품 간의 상관관계를 결정하는 아이템 매트릭스를 만든 후 고객의 최신 입력 데이터를 기반으로
고객의 기호를 유추해서 상품을 추천한다. 즉 기존의 온라인 쇼핑몰에서 자주 활용하던 소비자의 패턴 분석에 의한 추천 방식이 아닌
구매한 물건 혹은 검색한 물건을 중심으로 추천하는 방식이다.
유튜브(YouTube)의 추천 알고리즘
유튜브 추천 알고리즘의 목표는 사람들이 마음에 드는 동영상을 잘 찾아주고(Find) 더 많이 시청하도록(keep watching) 해서 유튜브가 성장하는 것입니다.
구글은 유튜브 추천 알고리즘에 대해 2010년 , 2016년 , 2019년, 세 번에 걸쳐 공개하였다.
2010년의 알고리즘은 Candidate Generation과 Ranking이라는 2-stage로 나누어진 기본적인 시스템을 제안하였고,
2016년과 2019년에는 그 시스템을 기반으로 딥러닝(인공지능)을 적용한 기술을 발표하였다.
유튜브 알고리즘의 영상 추천 원리를 요약하면
▲ 개인 사용자의 시청 이력 ▲ 채널 영상의 실적 ▲ 채널 영상 주제에 대한 사용자의 관심도와 규모, 계절성 요인, 코로나19 등
외부적 요인을 복합적으로 검토해 각 시청자별 맞춤형 추천을 하게 된다.
사용자에 노출된 영상 클릭률이 높을 수록, 사용자의 평균 시청 조회율이 높을 수록, 좋아요가 많을수록 더 많은 시청자에 영상이 추천될 수 있다.
또한 외부 요인 중 내 채널과 비슷한 영상을 업로드한 다른 채널과의 경쟁요소에 따라 내 영상의 추천 노출 수가 늘어나거나 줄어들 수 있다.
첫째, 직접 제작한 썸네일이 성과가 높다.
둘째, 제목과 설명문이 겹쳐야 최적화에 유리하다.
셋째, 채널의 첫 영상은 안내 영상으로, 1~3분 정도 분량이 좋다.
넷째, 태그는 토픽과 관련 있는 인기 키워드로, 최대 10개를 넘기지 않는다.
다섯째, 라이브의 경우 종료 후 하이라이트를 제공해야 한다.
정렬(Sorting) 알고리즘
정렬은 특정한 기준에 따라 데이터를 늘어놓는 알고리즘입니다.
정렬을 위한 알고리즘도 매우 다양하게 제시되고 있다.
다음의 내용은 자세히 이해하는 목적이 아니라 단순히 다양한 방법이 있음을 보여주기 위함이다.
관심있는 사람만 자세히 공부하고 대략 다양하게 많다는 정도만 알면 될듯하다.
전체적인 큰 틀에서 개념을 이해하면 됩니다.
(1) 버블 정렬(Bubble Sort)
버블 정렬은 바로 옆에 있는 것과 비교해서 정렬하는 것입니다. 구현은 쉽지만 효율성이 매우 낮다고 알려져 있습니다.
(2) 선택 정렬(Selection Sort)
데이터를 선택 정렬은 배열에서 작은 데이터를 선별하여서 데이터를 앞으로 보내는 정렬의 일종입니다. 이 정렬도 효율은 낮습니다.
(3) 삽입 정렬(Insertion Sort)
삽입 정렬은 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써
정렬을 완성하는 알고리즘입니다.
(4) 퀵 정렬(Quick Sort)
퀵 정렬은 찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘이다. 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다.
퀵 정렬은 n개의 데이터를 정렬할 때, 최악의 경우에는 O(n²)번의 비교를 수행하고, 평균적으로 O(n log n)번의 비교를 수행합니다.
(5) 병합 정렬(Merge Sort)
합병 정렬 또는 병합 정렬은 O(n log n) 비교 기반 정렬 알고리즘이다. 일반적인 방법으로 구현했을 때 이 정렬은 안정 정렬에 속하며,
분할 정복 알고리즘의 하나 입니다.
(6) 힙 정렬(Heap Sort)
힙 정렬이란 최대 힙 트리나 최소 힙 트리를 구성해 정렬을 하는 방법으로서, 내림차순 정렬을 위해서는 최소 힙을 구성하고 오름차순 정렬을
위해서는
최대 힙을 구성하면 됩니다.
(7) 기수 정렬(Radix Sort)
기수 정렬은 기수 별로 비교 없이 수행하는 정렬 알고리즘이다. 기수로는 정수, 낱말, 천공카드 등 다양한 자료를 사용할 수 있으나 크기가 유한하고
사전순으로 정렬할 수 있어야 한다. 버킷 정렬의 일종으로 취급되기도 합니다.
(8) 계수 정렬(Count Sort)
계수 정렬 또는 카운팅 소트는 컴퓨터 과학에서 정렬 알고리즘의 하나로서, 작은 양의 정수들인 키에 따라 객체를 수집하는 것,
즉 정수 정렬 알고리즘의 하나 입니다.
버블정렬 의사코드
알고리즘의 구현
알고리즘은 다양한 프로그램 언어로 구현될 수있다. 아래는 파이썬 코드의 예이다.
프로그램이란 결국 알고리즘을 구현한 것이고 역으로 모든 프로그램은 어떤 형태로든 알고리즘으로 표현할 수 있다.
아래 코드를 이해할 필요는 없다. 전체적인 큰 틀에서 개념을 이해하면 됩니다.
개발자가 알고리즘을 배워야 하는 이유 (ChatGPT의 대답)
1. 효율적인 코드 작성: 알고리즘을 이해하고 사용하면 코드를 보다 효율적으로 작성할 수 있습니다.
좋은 알고리즘을 사용하면 시간과 공간 복잡도를 최적화하고 실행 속도를 향상시킬 수 있습니다.
2. 문제 해결 능력 개발: 알고리즘을 배우면 문제를 해결하는 데 필요한 기술과 접근 방법을 배울 수 있습니다.
이를 통해 새로운 문제를 효과적으로 해결할 수 있는 능력을 키울 수 있습니다.
3. 코딩 인터뷰 대비: 알고리즘은 코딩 인터뷰에서 중요한 주제 중 하나입니다.
기술 면접을 준비하는 개발자라면 알고리즘을 배우고 연습하는 것이 필수적입니다.
4. 다양한 분야에서 사용됨: 알고리즘은 다양한 분야에서 사용됩니다.
예를 들어, 컴퓨터 그래픽스, 인공지능, 데이터 분석 등에서 매우 중요합니다.
따라서 알고리즘을 이해하면 다양한 분야에서 능력을 발휘할 수 있습니다.
5. 프로그래밍 지식의 핵심: 알고리즘은 프로그래밍 지식의 핵심 중 하나입니다.
개발자로서 이해하고 구현할 수 있는 능력은 필수적입니다.
따라서, 개발자가 알고리즘을 배우고 연습하는 것은 매우 중요합니다. 이를 통해 효율적이고 효과적인
코드를 작성하고 문제 해결 능력을 키울 수 있습니다.
프런트 개발자도 알고리즘을 배워야 하는가(ChatGPT의 대답)
네, 프런트엔드 개발자도 알고리즘을 배워야 합니다. 프런트엔드 개발자는 웹 애플리케이션의 사용자 인터페이스를 구현하고
브라우저에서 실행되는 코드를 작성한다. 이를 위해 HTML, CSS, JavaScript 등의 기술을 사용합니다. 프런트엔드 개발자는 알고리즘을
사용하여 웹 애플리케이션의 효율성을 높일 수 있습니다.
예를 들어, 프런트엔드 개발자는 웹 페이지의 성능을 향상시키기 위해 이미지, 스크립트 및 스타일 시트를 압축하고 최적화하는
등의 작업을 수행합니다. 이때 알고리즘을 사용하면 이미지와 같은 리소스를 최적의 방식으로 압축하고 최소한의 데이터로
더 빠르게 로드할 수 있습니다.
또한, 프런트엔드 개발자는 웹 애플리케이션의 사용자 인터페이스를 개선하기 위해 애니메이션, 이벤트 처리 및
자동 완성과 같은 기능을 구현해야 합니다. 이때 알고리즘을 사용하면 보다 효율적으로 사용자 경험을 개선할 수 있습니다.
또한, 알고리즘은 자료구조와 관련이 있습니다. 프런트엔드 개발자는 자료구조와 관련된 문제를 다루는 경우가 많습니다.
예를 들어, 큰 데이터 세트를 처리하거나 정렬, 검색 및 필터링과 같은 작업을 수행해야 할 수 있습니다.
이러한 작업에서 알고리즘을 사용하면 빠르고 효율적인 처리가 가능합니다.
따라서, 프런트엔드 개발자도 알고리즘을 배워서 웹 애플리케이션의 효율성을 높이고 사용자 경험을 개선할 수 있습니다.
알고리즘을 단계적 배우는 방법(ChatGPT의 대답)
1. 기초 학습: 알고리즘을 배우기 전에, 컴퓨터 프로그래밍 기초와 자료구조와 같은 기본 개념을 먼저 배우는 것이 좋습니다.
2. 언어 선택: 알고리즘을 구현하는 데 가장 적합한 언어를 선택하고 해당 언어의 문법과 구문을 학습합니다.
대표적으로 C, C++, Python, Java 등이 있습니다.
3. 알고리즘 이론 학습: 알고리즘의 기본 개념과 분석 방법을 학습합니다. 알고리즘 분석을 통해 시간 복잡도와 공간 복잡도를
이해하고 알고리즘의 성능을 측정합니다.
4. 알고리즘 구현: 알고리즘을 선택하고 선택한 언어로 구현합니다. 알고리즘 문제 풀이 플랫폼을 사용하여
알고리즘 문제를 풀면서 실력을 향상시킬 수 있습니다.
5. 코드 리뷰: 다른 사람의 코드를 읽고 이해하면서 다양한 방법으로 알고리즘을 구현하는 방법을 배울 수 있습니다.
6. 실제 적용: 알고리즘을 실제 문제에 적용하여 효율적인 해결 방법을 찾는 것이 중요합니다. 이를 통해 문제 해결 능력을 향상시킬 수 있습니다.
7. 지속적인 학습: 알고리즘은 계속해서 발전하고 변화하므로, 지속적인 학습이 필요합니다.
새로운 알고리즘 및 기술을 배우면서 학습 내용을 확장해나가는 것이 중요합니다.
이러한 방법으로 단계적으로 알고리즘을 배우면서, 다양한 알고리즘과 문제 해결 기술을 습득하고 개발자로서의 능력을 향상시킬 수 있습니다.
프로그램밍 언어
다음은 대표적인 프로그래밍 언어들입니다.
(1) C언어 : 시스템 프로그래밍, 임베디드 시스템, 네트워크 프로그래밍 등 다양한 분야에서 사용되며, 다른 언어의 기반이 되는 언어입니다.
(2) Java : 객체 지향 프로그래밍 언어로, 안드로이드 앱 개발, 서버 개발, 게임 개발 등 다양한 분야에서 사용됩니다.
(3) Python : 쉬운 문법과 다양한 라이브러리로 인기가 많은 프로그래밍 언어로, 데이터 분석, 인공지능, 웹 개발, 게임 개발 등에 사용됩니다.
(4) JavaScript : 웹 프론트엔드 개발에서 필수적인 언어로, 웹 애플리케이션, 게임 개발, 모바일 앱 개발 등에 사용됩니다.
(5) PHP : 서버 사이드 웹 개발 언어로, WordPress, Facebook 등의 웹사이트 개발에 사용됩니다.
(6) Swift : iOS 앱 개발을 위한 언어로, Apple에서 만든 언어입니다.
(7) C++ : C언어의 확장판으로, 게임 개발, 운영체제 개발 등에 사용됩니다.
(8) Ruby : 간결한 문법과 다양한 라이브러리로 인기가 있는 언어로, 웹 개발, 데이터 분석, 인공지능 등에 사용됩니다.
(9) Go : Google에서 개발한 언어로, 분산 시스템, 웹 서버 등에 사용됩니다.
(10) Kotlin : 안드로이드 앱 개발에 사용되는 언어로, Java와 호환성이 좋습니다.