JAVA_선형검색알고리즘

joseon0thing·2022년 11월 12일
0

JAVA

목록 보기
2/5
post-thumbnail

Python에서의 선형검색 알고리즘을 Java로 바꿔봤다.

python에서의 선형검색 알고리즘:

https://velog.io/@whtjsdud54/python%EC%84%A0%ED%98%95%EA%B2%80%EC%83%89%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

선형검색 성질 포인트
-순차적으로 검색
-정렬 x

for문 사용

import java.util.*;

public class 선형알고리즘 {
	/* 선형검색 함수 int형 배열과 int형 key값으로 받는다. */
	public static int seq_search(int[] x, int key) {
		/* for문으로 배열 길이만큼 돌리고 */
		for (int i=0; i<x.length; i++) {
			/* 값이 key와 같다면 */
			if (x[i] == key)
				/* 인덱스 반환 */
				return i;
		}
		/* 같지 않다면 -1반환 */
		return -1;
	}
    
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in); //utill 패키지
		
		/* 원소 수 입력 받기 */
		System.out.println("원소 수 입력: ");
		int num = sc.nextInt(); 
		
		/* 빈 배열 원소 수만큼 선언 */
		int[] x = new int[num]; //num개의 int형으로 갖는 배열 x 선언
		
		/* 배열 값 입력 받기 */
		for (int i=0; i<x.length; i++) { 
			System.out.println("x[" + i + "]: ");
			x[i] = sc.nextInt();
		}
		
		System.out.println("검색 값 입력: ");
		int key = sc.nextInt();
		
		/* 반환되는 인덱스, -1값 find_value에 저장 */
		int find_value = seq_search(x,key);
		/* 검색값 찾지 못하면 */
		if (find_value == -1) {
			System.out.println("검색값을 갖는 원소가 존재하지 않습니다.");
		}
		/* 검색값 찾으면 */
		else
			System.out.println("검색값은 x["+find_value+"]에 있습니다.");
			
	}
}

While문 사용

public static int seq_search(int[] x, int key) {
		int i=0;
		while(true) { //자바는 true 소문자
        /* i가 배열 길이와 같으면 */
			if (i == x.length)
				return -1;
        /* 값이 key와 같으면 */
			if (x[i] == key)
				return i;
			i++;
		}		
}

while문에서 break를 써야하나 고민했는데 return으로도 무한루프를 나올 수 있음을 알 수 있다.
static메소드는 인스턴스를 생성하지 않아도 호출이 가능하다.

[비슷한 함수 알아두기]

nextLine() == 한 줄 통채로 받아오기, buffer라는 변수에 먼저 받아주고 받아야됨
next() == space 기준으로 한 단어 받아오기

[생각해보기]

for (int i=0; i<x.length; i++) { 
	System.out.println("x[" + i + "]: ");
	x[i] = sc.nextInt();
}

부분에서    
i<num으로 설정하면 java.lang.ArrayIndexOutOfBoundsException 에러 발생한다.
(길이 0의 범위를 벗어났다.)

배열x의 길이로 설정하면 오류 안남
num과 x.length의 값은 같기 때문에 썼는데 왜 안되는 지 의문이다.
//순차적으로 검색
//정렬 x
import java.util.*;

public class 선형알고리즘_for문 {
	/* 선형검색 함수 int형 배열과 int형 key값으로 받는다. */
	//public static int seq_search(ArrayList x, int key) {
	public static int seq_search(int[] x, int key) {
		/* for문으로 배열 길이만큼 돌리고 */
		for (int i=0; i<x.length; i++) {
			/* 값이 key와 같다면 */
			if (x[i] == key)
				/* 인덱스 반환 */
				return i;
		}
		/* 같지 않다면 -1반환 */
		return -1;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in); //utill 패키지
		
		/* 원소 수 입력 받기 */
		System.out.println("원소 수 입력: ");
		int num = sc.nextInt(); 
		//nextLine() == 한 줄 통채로 받아오기, buffer라는 변수에 먼저 받아주고 받아야됨
		//next() == space 기준으로 한 단어 받아오기
		
		/* 빈 배열 원소 수만큼 선언 */
		//ArrayList x = new ArrayList(Arrays.asList(null)); //utill 패키지
		int[] x = new int[num]; //num개의 int형으로 갖는 배열 x 선언
		
		/* 배열 값 입력 받기 */
		for (int i=0; i<x.length; i++) { 
			//i<num으로 설정하면 java.lang.ArrayIndexOutOfBoundsException 에러 발생 
			//(길이 0의 범위를 벗어났다.)
			//배열x의 길이로 설정하면 오류 안남
			//이유?
			System.out.println("x[" + i + "]: ");
			//x.add(i, sc.nextInt()); //ArrayList로 받을 떄
			x[i] = sc.nextInt();
		}
		
		System.out.println("검색 값 입력: ");
		int key = sc.nextInt();
		
		/* 반환되는 인덱스 / -1값 find_value에 저장 */
		int find_value = seq_search(x,key);
		/* 검색값 찾지 못하면 */
		if (find_value == -1) {
			System.out.println("검색값을 갖는 원소가 존재하지 않습니다.");
		}
		/* 검색값 찾으면 */
		else
			System.out.println("검색값은 x["+find_value+"]에 있습니다.");
			
	}
}
profile
정리.velog

0개의 댓글