Python에서의 선형검색 알고리즘을 Java로 바꿔봤다.
python에서의 선형검색 알고리즘:
선형검색 성질 포인트
-순차적으로 검색
-정렬 x
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+"]에 있습니다.");
}
}
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+"]에 있습니다.");
}
}