반응형

개념

이진 탐색이란 데이터가 정렬돼 있는 배열에서 특정한 값을 찾아내는 알고리즘이다. 배열의 중간에 있는 임의의 값을 선택하여 찾고자 하는 값 X와 비교한다. X가 중간 값보다 작으면 중간 값을 기준으로 좌측의 데이터들을 대상으로, X가 중간값보다 크면 배열의 우측을 대상으로 다시 탐색한다. 동일한 방법으로 다시 중간의 값을 임의로 선택하고 비교한다. 해당 값을 찾을 때까지 이 과정을 반복한다.

https://blog.hexabrain.net/246 참고

 

알고리즘 2-2강. 탐색 알고리즘 - 이진 탐색(Binary Search)

[탐색 알고리즘 강좌] 데이터를 찾아보자! 이진 탐색(Binary Search) 이번에는 순차 탐색에 이어 이진 탐색(Binary Search)에 대해 알아보도록 할텐데, 이 '이진 탐색(Binary Search)'이 왜 이진인지 짐작이 가

blog.hexabrain.net

조건

  • 수들이 오름차순 또는 내림차순으로 정렬 되어 있어야 한다.
  • 원하는 값을 찾으면 종료한다. (종료 조건1) → 값을 찾음
  • 왼쪽값이 오른쪽 값보다 커지면 종료한다. (종료조건2) → 값이 없음

사용 하면 좋은 경우

  1. 리스트에서 값을 찾을 때 시간을 단축해야 하는 경우
    • list에서 find() 함수를 사용하거나 반목문으로 값을 찾을 시 O(N)의 시간이 필요하기 때문에 이진 탐색을 사용하면 시간 효율성을 증가 시킨다.
  2. 조건에 맞는 최소 또는 최대값을 찾아야 하는 경우
    • 이러한 경우에는 index를 left, right로 두지 않고 left = 가장 작은 값, right = 가장 큰 값 으로 설정하여 배열에서의 위치가 아닌 조건에 맞는 값을 구 할 수 있도록 한다.

구현 방법

기본 이진 탐색

  1. 반복문
#include <iostream>
#include <vector>

using namespace std;

int BinarySearch(vector<int> num, int target) {
    int left = 0, right =(int) num.size(), mid = 0;
    sort(num.begin(), num.end()); //숫자 오름차순 정렬
    //num : {1, 2, 4, 5, 15, 56, 123, 125, 199, 3215}
    while(left <= right) { //종료 조건
        mid = (left + right) / 2;
        if(num[mid] == target) {// target을 찾았을 때
            return mid;
        }
        else if(num[mid] > target) { //target보다 클 때 -> 왼쪽 수들을 확인
            right = mid - 1;
        }
        else { //target보다 작을 때 -> 오른쪽 수들을 확인
            left = mid + 1;
        }
    }
    return -1;
}

  1. 재귀 함수
#include <iostream>
#include <vector>

using namespace std;
//재귀 함수는 num을 정렬 해서 함수 호출
int RecurBinarySearch(vector<int> num, int target, int left, int right) {
    if(left > right) return -1; //종료 조건
    int mid = (left + right) / 2;
    if(num[mid] == target) { //target을 찾았을 때
        return mid;
    }
    else if(num[mid] > target) { // target보다 클 때
        return RecurBinarySearch(num, target, left, mid-1);
    }
    else { //target보다 작을 때
        return RecurBinarySearch(num, target, mid+1, right);
    }
}

int main(int argc, const char * argv[]) {
    vector<int> num {1,5,2,199,56,3215,125,123,15,4};
    sort(num.begin(), num.end());
    int left = 0, right = (int)num.size();
    cout << RecurBinarySearch(num, 199, left, right) << endl;
    return 0;
}

UpperBound

목표값보다 큰 값이 처음 발견되는 곳 찾기

int UpperBound(vector<int> num, int target) {
    int left = 0, right = (int) num.size(), mid = 0;
    sort(num.begin(), num.end());
    int ans = 0;
    while(left <= right) {
        mid = (left + right) / 2;
        if(num[mid] <= target) { // 목표보다 작거나 같으면 오른쪽 보기
            left = mid + 1;
        }
        else { // 목표보다 크면 답의 후보로 두고 왼쪽 보기
            ans = mid;
            right = mid - 1;
        }
    }
    return ans;
}

LowerBound

목표값보다 작은 값이 처음 발견되는 곳 찾기

int LowerBound(vector<int> num, int target) {
    int left = 0, right = (int) num.size(), mid = 0;
    sort(num.begin(), num.end());
    int ans = 0;
    while(left <= right) {
        mid = (left + right) / 2;
        if(num[mid] >= target) { //목표보다 크거나 같으면 왼쪽 보기
            right = mid - 1;
        }
        else { // 목표보다 작으면 답의 후보로 두고 오른 쪽 보기
            ans = mid;
            left = mid + 1;
        }
    }
    return ans;
}

결과

int main(int argc, const char * argv[]) {
    vector<int> num {1,5,2,199,56,3215,125,123,15,4};
    sort(num.begin(), num.end());
    int left = 0, right = (int)num.size();
    for(int i = 0; i < num.size(); i++) {
        cout << num[i] << " ";
    }
    cout << endl;
    cout << "재귀 : " << RecurBinarySearch(num, 199, left, right) << endl;
    cout << "반복문 : " << BinarySearch(num, 199) << endl;
    cout << "UpperBound : " << UpperBound(num, 199) << endl;
    cout << "LowerBound : " << LowerBound(num, 199) << endl;
    return 0;
}
1 2 4 5 15 56 123 125 199 3215
재귀 : 8
반복문 : 8
UpperBound : 9
LowerBound : 9

시간 복잡도

  • O(logN)
반응형

'코딩 낙서' 카테고리의 다른 글

알고리즘 - 크루스칼(Kruskal)  (0) 2023.06.21
알고리즘 - 누적합(Prefix Sum)  (0) 2023.06.21
알고리즘 - Union & Find  (0) 2023.06.21
[LINUX] 기본 명령어 정리  (0) 2023.06.20
Linux  (0) 2023.06.14
반응형

안녕하세요. 이번에는 개발자로 취업하기, 개발자 교육에 대해서 다뤄보겠습니다. 자기소개서를 쓰다보면 교육에 대해 적는 란이 있는데, 해당 부분이 비어 있으면 허전할 수 있으니 방학때 들을 수 있는 교육에 대해서 설명드리겠습니다. 이번 편에서는 삼성 SDS 알고리즘 특강에 대해서 다뤄보겠습니다.

 가장 먼저 해당 교육을 추천하는 이유는, 방학때 진행되고 2주란 시간만 투자하면 되기 때문입니다. 또한 거의 대부분의 개발자 직군은 코딩 테스트를 봐야하는데, 이를 준비하는 김에 스펙 업 까지 할 수 있는 일석 이조의 교육이라고 볼 수 있습니다. 

 

삼성 SDS 알고리즘 특강이란?

해당 교육은 일년에 2번, 하계/ 동계 특강으로 진행되며, 알고리즘의 기초부터 심화까지 진행되는 교육입니다. 물론 내용이 쉽지 않기때문에 기초적인 지식은 필요합니다. 교육 방식은 알고리즘의 개념에 대해서 설명해 준 후, 스스로 문제를 풀 시간을 줍니다. 그 후 해당 문제를 강사님과 같이 풀며 이해하는 방식입니다. 교육은 오전 8시부터 오후 5시까지 진행되었고, 지각하거나 결석을 하면, 수료의 문제가 생기니 2주간은 꼭 집중해서 들어주어야 합니다. 2주만 버티면 저희는 자소서에 쓸 내용도 생기고, 코테도 준비가 되고 스펙업을 할 수 있는 아주 좋은 교육입니다.

 

지원 과정 및 자격

해당 교육은 4학년 또는 졸업 예정자를 대상으로 모집하지만, 졸업을 한 후에도 붙는 분들도 많습니다. 우선 방학할 즈음에 삼성 SDS 홈페이지에 들어가면 지원 공고를 볼 수 있습니다. 저때는 코로나땜에 100% 온라인으로 교육이 진행되었지만, 현재는 온라인/오프라인이 병행되서 진행하고 있다고 합니다.

그 이후 단계는 복잡한 것 없이, 입과테스트만 진행하면 됩니다. 입과테스트는 당연히 코딩테스트이고, 하루의 시간을 주고, 아무때나 문제를 풀 수 있게 사이트를 열어줍니다. 저는 총 5문제가 나왔었는데 저때는 ICPC 대회 문제들이 그대로 나왔었습니다.(시험이 끝난 후에 알았습니다..ㅠㅠ) ICPC 문제는 굉장히 어려운데, 그래도 많은 시간이 주어졌기에 한문제만 집중 공략하여 풀었습니다. ICPC 문제는 백준 사이트에서 확인할 수 있습니다. 

https://www.acmicpc.net/contest/view/947

 

2023 ICPC Sinchon Winter Algorithm Camp Contest - 초급

사용 가능한 언어 C++17 Python 3 PyPy3 Java 11 C++20 Java 15

www.acmicpc.net

저는 총 5문제중에 한문제만 집중 공략하여, 풀었고 당연히 떨어졌다 생각했지만 붙었습니다! 심지어 제 동기중에는 한문제도 풀지 못했었는데 붙은 사람도 있었습니다. 여러분도 포기하지말고 최대한 부분점수를 가져가는 형식이라도 도전해보시길 바랍니다.

 

교육 과정

 우선 교육이 시작되기전에 아주 두꺼운 알고리즘 책 2권을 보내줍니다... 진짜 보기 싫었는데 실제로 안봤습니다 ㅎ 알고리즘은 책으로 볼 필요가 없죠! 교육이 시작되면, 앞서 말씀드린 것처럼 알고리즘 설명 -> 혼자 문제 풀어보기 -> 강사님과 함께 풀기로 진행됩니다. 여기서 진짜 좋은점은 혼자 풀면서 막히는 부분을 게시판에 올리면, 다른 강사님들이 문제점을 파악하여 알려줍니다. 이 부분이 진짜 너무너무 좋았습니다. 그리고 혼자 푸는 시간이 다소 짧을 수도 있으나, 강사님 설명을 들어보고 수업이 끝난 후에 다시 풀어보면 더 깊게 공부 할 수 있을 것이니, 너무 조급해 하지 않아도 됩니다. 저는 첫 1주는 정말 열심히 들었는데.. 어느순간 멍을 한번 때리니 도저히 따라갈 수가 없어서 2주째에는 거의 틀어만 놓고, 강사님이 문제 풀때만 들었었는데, 직접 풀어보는것이 역시 중요합니다.. 머리에 하나도 안남더라구요. 

 교육이 끝난 후에는 삼성 SW Advance 자격증 시험의 기회가 1회 주어집니다. 해당 문제들은 알고리즘 + 구현이라고 보시면 되는데, Segment Tree, Priority Queue 등의 고급 알고리즘을 사용할 줄 알아야 합니다. 해당 자격증을 따면 삼성에 입사할 때도 도움이 되고, 다른 기업 자소서에도 자격증에 입력할 수 있습니다. 특히 삼성은 해당 자격증이 있으면 코딩테스트를 면제 받을 수 있습니다. 자격증까지 따면 아주 1석 3조의 교육이네요! 그리고 Advanced를 따면 Pro 자격증에 도전할 수 있는데 삼성에 입사할때 Pro 자격증이 있으면 S/W직군은 무려 월 20만원이나 월급을 올려줍니다!

 

https://swexpertacademy.com/main/capacityTest/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

해당 사이트에서 삼성 S/W 자격증에 대해 확인해 보시길 바랍니다.

 

마무리

여러분, 어차피 취업을 하려면 코딩테스트를 준비해야합니다. 기왕 할거 수료증을 받을 수 있는 교육을 들으며, 자격증 도전도 하는 1석 3조의 삼성 SDS 알고리즘 특강 강추합니다. 딱 2주만 노력하여 교육을 따라가면, 거의 웬만한 기업 코딩테스트는 다 합격하실 수 있을 것입니다. 해당 교육의 내용이 다소 어렵고 힘들수도 있지만, 수료를 하게 되면, 그런 부분에서 다른분들과의 차별점이 될 수 있고, 훨씬 더 많은 지식을 얻어 갈 수 있으실 겁니다. 오늘도 봐주셔서 정말 감사하고, 개발자, 취준생 여러분 모두 항상 응원하겠습니다! 

 

반응형

+ Recent posts