본문 바로가기

{Programing}/Algorithm21

알고리즘 - 완전 탐색 응용 1.무식하게 전체 반복 : for 문과 if문을 이용해 전체를 다 훑어보는 방법. 2. 비트마스크 : 이진수의 각 비트를 배열의 요소로 생각해 0은 없는 것, 1은 있는 것으로 판단. 비트연산을 이용해 각 자리를 조작. OR연산을 이용해 켜고 싶은 비트를 켠다. AND와 NOT연산을 이용해 끄고 싶은 비트를 끈다. XOR 연산을 이용해 토글 하고싶은 비트를 토글한다. 최하위 비트부터 i개를 전부 켜기 위해서는 SHIFT와 - 연산을 이용. (mask = (1 2020. 3. 13.
알고리즘 - 비트연산 응용 입력한 수가 2^n 꼴인지 확인하시오 비트연산자를 응용한다. 2^n 꼴의 수는 2진법으로 표현하면 비트에서 무조건 한자리만 1이고 나머지는 전부 0이다. 비트연산자는 이진수에 대해 비트단위로 적용되는 연산이다. NOT : 비트 반전. 0은 1로 1은 0으로 반전한다. OR : 두 이진비트중 하나라도 1이면 1. 둘다 0 이면 0 AND : 두 이진비트 둘다 1이여야 1. 하나라도 0이면 0 XOR : 두 이진비트가 서로 달라야 1. 같으면 0 SHIFT : 입력한 자리수만큼 전체 비트를 좌 or 우로 민다. 단항연산자 - : 부호 반전. 이진수에 NOT 연산을 한뒤 1을 더하는 연산. 2^n 꼴을 판단하기 위해서는 자기 자신의 부호반전 값과 AND 연산을 한 경우를 따진다. ex) 34 의 2진법 표현 .. 2020. 3. 13.
알고리즘 - 퀵 정렬(Quick Sort) 단순 비교를 이용한 정렬을 수행. 분할 정복 알고리즘의 일종으로 엄청 빠름. 이후 나올 합병정렬(Merge Sort)와는 다르게 '비균등'하게 분할한다. 1. 기준점,피벗(Pivot)을 고른다. 2. 피벗을 기준으로 작은건 왼쪽, 큰건 오른쪽으로 전부 옮긴다. 3. 피벗을 제외하고 분할된 왼쪽 리스트, 오른쪽 리스트에 대해 각각 1~2를 반복. 4. 리스트가 더 안쪼개질때까지 반복(리스트 크기가 0이나 1이 될 때) 5. 끝내면 완성! 기본 연산. 분할 : 피벗을 기준으로 입력 배열(리스트)를 2개로 나눔. 정복 : 분할된 배열을 정렬. 배열이 크면 순환호출을 이용해 다시 분할. 결합 : 정렬이 끝난 부분 배열을 하나의 배열로 합친다. 장점 : 속도가 빠름. 정렬 알고리즘 중 최고속. 추가 메모리 공간이.. 2020. 3. 11.
알고리즘 - 버블 정렬(Bubble Sort) 서로 붙은 두 요소를 비교해 정렬. 앞에서부터 순차적으로 비교해서 교환하며 맞는 위치까지 계속 이동. 자연스레 기준에 따라 오름차순이면 큰 수가 끝쪽으로, 작은 수가 앞쪽으로 이동됨. 장점 : 구현이 간단. 비교-교환 만 구현하면 됨. 단점 : 불필요한 교환이 발생함. 이미 맞는 위치임에도 교환되거나, 많은 비교및 교환이 일어남. 성능 구데기 구현때문이면 차라리 삽입정렬이나 선택정렬을 쓰자 2020. 3. 11.