코드트리 조별과제 5회차 (8.12 ~ 8.18)

2024. 8. 12. 11:13·알고리즘 (with JAVA)/코드트리 조별과제

Binary Search

 

[ 문제 ]

[4, 2, 1, 5, 7, 3] 와 같이 숫자들이 주어졌을 때, 숫자 2가 위치하는 인덱스 값을 찾는

프로그램을 작성하시오.

 

 

 

[ 해결책(1) - O(N) ]

무작정 코드를 작성한다면, 아래 코드처럼 처음부터 끝까지 O(N)만큼 해당 숫자가 나올때까지 검색

해야 할 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Main {
    public static void main(String[] args) {
        int n = 6, target = 2;
        int[] arr = new int[]{0, 4, 2, 1, 5, 7, 3};
 
        int idx = -1;
 
        for(int i=1; i<=n; i++){
            if(arr[i] == target) {
                idx = i;
                break;
            }
        }
 
        System.out.print(idx); // 2가 있는 인덱스인 2가 답이 됩니다.
    }
}
 
Colored by Color Scripter
cs

 

 

 

[ 해결책(2) - O(LogN) ]

O(logN) 방법은 업/다운 게임처럼 찾아야 하는 수의 범위를 줄이는 방법이다.
중앙(mid)부터 검색하여 찾는 target 값이 크다면 위로 검색하고 작다면 아래로 검색하는 것이다.
단, 위 조건을 성립하기 위해서는 정렬이 필요하다.

여기서 While 문을 통해 원소의 갯수가 1일 때 까지 계속 탐색하여 left와 right 변수를

사용하여
움직임으로써 해당 target 값을 찾을 수 있다. 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Main {
    public static void main(String[] args) {
        int n = 6, target = 2;
        int[] arr = new int[]{0, 4, 2, 1, 5, 7, 3};
 
        int idx = -1;
 
        // 이진탐색을 진행합니다.
        int left = 0, right = n - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if(arr[mid] == target) { // 찾았다면 해당 index를 반환합니다.
                idx = mid;
                break;
            }
 
            if(arr[mid] > target) // 찾으려는 숫자가 더 작다면
                right = mid - 1;  // 왼쪽 구간으로 이동해야 합니다.
            else                  // 찾으려는 숫자가 더 크다면
                left = mid + 1;   // 오른쪽 구간으로 이동해야 합니다.
        }
 
        System.out.print(idx); // 2가 있는 인덱스인 2가 답이 됩니다.
    }
}
 
Colored by Color Scripter
cs

 

 

 

연습문제 - (코드트리) 숫자 빠르게 찾기

 

https://www.codetree.ai/missions/8/problems/find-number-fast?&utm_source=clipboard&utm_medium=text

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, M, arr[], ans;
 
    static StringBuilder sb = new StringBuilder();
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
 
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
 
        arr = new int[N+1];
 
        st = new StringTokenizer(br.readLine());
        for(int i=1; i<=N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
 
        for(int i=1; i<=M; i++){
            int target = Integer.parseInt(br.readLine());
 
            solve(target);
        }
 
        System.out.print(sb);
    }
 
    static void solve(int target){
        int left = 1, right = N, idx = -1;
 
        while (left <= right) {
            int mid = (left + right) / 2;
            if(arr[mid] == target) { // 찾았다면 해당 index를 반환합니다.
                idx = mid;
                break;
            }
 
            if(arr[mid] > target) // 찾으려는 숫자가 더 작다면
                right = mid - 1;  // 왼쪽 구간으로 이동해야 합니다.
            else                  // 찾으려는 숫자가 더 크다면
                left = mid + 1;   // 오른쪽 구간으로 이동해야 합니다.
        }
 
        sb.append(idx + "\n");
    }
}
 
Colored by Color Scripter
cs

 

저작자표시 (새창열림)

'알고리즘 (with JAVA) > 코드트리 조별과제' 카테고리의 다른 글

코드트리 조별과제 6회차 (8.19 ~ 8.25)  (0) 2024.08.19
코드트리 조별과제 4회차 (8.05 ~ 8.11)  (0) 2024.08.06
코드트리 조별과제 3회차(7.29 ~ 8.04)  (1) 2024.08.03
코드트리 조별과제 2회차(7.22 ~ 7.28)  (1) 2024.07.28
'알고리즘 (with JAVA)/코드트리 조별과제' 카테고리의 다른 글
  • 코드트리 조별과제 6회차 (8.19 ~ 8.25)
  • 코드트리 조별과제 4회차 (8.05 ~ 8.11)
  • 코드트리 조별과제 3회차(7.29 ~ 8.04)
  • 코드트리 조별과제 2회차(7.22 ~ 7.28)
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      java.lang패키지
      snail
      선택 정렬
      불안정 정렬
      소켓 프로그래밍
      코드트리
      serializable
      ServerSocket
      알고스팟
      map()
      안드로이드 스튜디오
      제자리 정렬
      역직렬화
      다형성
      java.time 패키지
      람다식
      스트림
      안정 정렬
      Arrays
      Collections Framework
      자바 개념
      TCP 소켓 프로그래밍
      코딩트리조별과제
      outputstream
      중간연산
      코딩테스트
      file
      문자 기반 스트림
      InputStream
      유용한 클래스
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    코드트리 조별과제 5회차 (8.12 ~ 8.18)
    상단으로

    티스토리툴바