[acmicpc] upper bound (feat. 이진 검색 알고리즘) / C++

2020. 6. 8. 02:00·🖥️ 컴퓨터공학 🖥️/알고리즘
반응형

출처 => [알고리즘 해결을 위한 창의적 알고리즘 해결 (중급)]

 

문제

두 번째 예시에서의 출력은 6아닌 7이다 (오타)

문제 분석

문제의 의도 : k를 초과하는 가장 첫 번째 원소의 위치를 구하는 것

① 먼저 구간을 설정한다. ([s, e])

② 이 구간의 중간위치의 값을 m이라고 하면, A[m-1]<=k 이면서 A[m]>k 인 최소 m을 찾아야 한다.

 

풀이

=> 예시로 주어진 배열 A는 1,2,7,7,7,7,11,15이다. k의 값은 7이다. 따라서 출력값은 7이 나와야 한다.

 

=> 주어진 배열은 [0,8]이고 이에 따라 중간값의 위치인 m은 4이다. 우리가 원하는 것은 찾으려는 값의 위치가 아니라 k값보다 큰 수가 처음으로 등장하는 위치이다. A[4]=7이므로 우리의 위치와 일치하지 않다. 

=> A[6]>7 이므로 그보다 아래로 범위를 설정하여 재탐색

=>A[5]=7이므로 범위를 재설정하여 탐색

=> 범위가 6에서 6으로 좁혀졌으므로 A[6]이 k보다 큰 수가 처음으로 등장하는 위치의 숫자이다.

 

소스 코드 & 결과

#include<iostream>
using namespace std;

int n, k, A[10000001];
//배열의 수, 찾고자 하는 수, 배열을 선언해줌 (public)

int solve(int s, int e) {
	while (e - s > 0) {
		int m;
		m = (e + s) / 2;
		if (A[m] <= k) s = m + 1;
		else e = m;
	}
	return e + 1;
//이런식으로 가다보면 A[m]<=k, A[m+1]>k인 경우가 나올 것이다. 
//이 때는 m=e이므로 출력값은 e+1이 된다.
}
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> A[i];
	}
	cin >> k;
	cout << solve(0, n) << endl;
}

▶ 결과는 다음과 같게 나온다. 

 

추가사항(about upper_bound)

▶ algorithm 해더함수를 include하여 STL을 활용할 수 있다. 

S라는 배열의 처음부터 n-1까지의 원소들 중, k의 upper bound에 해당하는 원소의 주소를 반환하는 std::upper_bound()를 이용할 수 있다.

std::upper_bound(S,S+n,k,[compare]);

compare을 생략할 경우에는 오름차순이라고 가정한다. 

upper_bound를 이용하면 k의 lower bound위치의 주소를 알려준다. 

따라서 그 주소에서 A를 빼면 k가 존재하는 배열 A의 인덱스가 되며, 배열의  인덱스는 0부터 시작하므로 1을 더해주면 우리가 원하는 해를 구할 수 있다. 

#include<iostream>
#include<algorithm>
//upper_bound를 활용
using namespace std;

int n, k, A[100001];
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> A[i];
	}
	cin >> k;
	cout << upper_bound(A, A + n, k) - A + 1 << endl;
}

728x90
반응형

'🖥️ 컴퓨터공학 🖥️ > 알고리즘' 카테고리의 다른 글

[백준 - 2267] 단지번호붙이기 (feat. 깊이우선탐색) / C++  (0) 2020.07.03
[acmicpc] 두더지 굴 (feat. 깊이우선탐색 알고리즘) / C++  (0) 2020.06.09
백준) 2 x n 타일링 (재귀함수) / JAVA  (0) 2020.04.17
백준) - 1로 만들기(재귀함수) / C++  (0) 2020.04.13
백준) - 1로 만들기 (재귀함수) / JAVA  (0) 2020.04.13
'🖥️ 컴퓨터공학 🖥️/알고리즘' 카테고리의 다른 글
  • [백준 - 2267] 단지번호붙이기 (feat. 깊이우선탐색) / C++
  • [acmicpc] 두더지 굴 (feat. 깊이우선탐색 알고리즘) / C++
  • 백준) 2 x n 타일링 (재귀함수) / JAVA
  • 백준) - 1로 만들기(재귀함수) / C++
공대생 배기웅
공대생 배기웅
군노답 미필 공대생 배기웅의 대학생활을 갈아 넣은 블로그
    반응형
  • 공대생 배기웅
    글쓰는공대생의 IT블로그
    공대생 배기웅
  • 전체
    오늘
    어제
    • 분류 전체보기 (166)
      • 🖊️ 공대생 글쓰기 🖊️ (17)
        • 공대생 회고록 (4)
        • 공대생의 끄적끄적 (4)
        • 슬기로운 공대생활 (9)
        • 무한도전 대학원생 (0)
      • 📈 산업공학 📈 (14)
        • 금융, 파생상품 (13)
        • 통계 (0)
        • 선형대수 (0)
        • 보험, 리스크관리 (0)
        • 재무회계 (1)
      • 🖥️ 컴퓨터공학 🖥️ (92)
        • 머신러닝, 딥러닝 (12)
        • 텐서플로우, 케라스 (1)
        • 알고리즘 (24)
        • 웹 (5)
        • Python (3)
        • C | C++ (23)
        • Java (15)
        • 코드 에러 모음집 (9)
      • 😙 취미, 교양 😙 (2)
        • 영어공부 (1)
        • 일본어회화 공부 (1)
      • 🔍 정보 공유 🔍 (38)
        • 대학생 외부활동 정보 (2)
        • 개발자관련 정보 (3)
        • 대입 논술 입시자료 정보 (22)
        • 프로그램 세팅 (11)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • [공지] 글쓰는 공대생입니다 😃
  • 인기 글

  • 태그

    경제성공학
    이클립스
    조작자
    객체지향
    데이터베이스
    acmicpc
    백준
    재귀함수
    프로그래머스
    예외
    equals프레임워크
    C++
    Operator
    자바
    알고리즘
    OOP
    스캐너
    프랜드함수
    Java
    무작위 변수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
공대생 배기웅
[acmicpc] upper bound (feat. 이진 검색 알고리즘) / C++
상단으로

티스토리툴바