티스토리 뷰

※ [JAVA로 배우는 자료구조] (1) 알고리즘이란



많은 초보개발자들은 현재 개발자로 일하고 있는 선배들 또 학원에서의 강사님 등 개발을 조금은 해봤을 사람들에게 개발자가 되려면 자료구조와 알고리즘이 정말 중요해! 라는 말을 많이들 들어보셨을 것입니다. 그래서 제가 초보개발자의 입장에서 자료구와 알고리즘에 대해 공부하면서 정리와 함께 조금이라도 도움이되고자 글을 써보려고 합니다. 먼저 제가 보고 공부하고 있는 책은 "Do it! 자료구조와 함께 배우는 알고리즘 입문(자바편)"으로 책과 내용이 비슷할 수 있다는 점 이해 부탁드립니다.


먼저 알고리즘(algorithm)은 무엇일까요? 사전적의미로 수학과 컴퓨터 과학, 언어학 또는 관련 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것이라고 합니다... 사전적 의미만 보게 되면 잘 모르겠네요.. 그래서 저는 코딩을 하면서 알고리즘이란 무엇인가 알아보려고 합니다.


1. 첫 코드로 변수 num1, num2, num3을 키보드로 입력받고, 입력받은 수 중 가장 최대값을 찾는 코드를 짜보겠습니다.


import java.util.Scanner;

public class Test01
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);	// 스캐너 인스턴스 생성
		int num1,num2,num3;						// 비교할 세개의 숫자

		System.out.println("세 정수의 최댓값은?");
		System.out.print("첫 번째 값 : ");
		num1 = sc.nextInt();
		System.out.print("두 번째 값 : ");
		num2 = sc.nextInt();
		System.out.print("세 번째 값 : ");
		num3 = sc.nextInt();

		int max = num1;
		if(num2>max)
			max = num2;
		if(num3>max)
			max = num3;

		System.out.printf("세 정수 중 최대값은 : %d 입니다.\n",max); 
	}
}

코드는 가볍게 짯기에 여기에 해당하는 과정만 설명해드리겠습니다.

① max변수에 num1값을 담는다.

② num2값이 max값보다 크면 max에 num2값을 담는다.

③ num3값이 max 값보다 크면 max에 num3값을 담는다.

과정은 코드의 if조건문 부터 어떤 값이 바뀌고 이런식으로 이루어집니다. 결론적으로 3개의 숫자를 입력을 받았을 때 최댓값이 잘 출력되는 것을 코드를 실행시켜 보면 확인하실 수 있습니다.


이 코드를 짠 이유는 문제를 풀려고 짠 코드가 아닙니다. 알고리즘을 설명하기 위해 짠 코드입니다. 즉 알고리즘이란 (이러한 문제를 해결하기 위한 것으로, 명확하게 정의되고 순서가 있는 유한 개의 규칙으로 이루어지는 집합) 많은 문제 상황(예외상황)에서의 올바른 결과물, 해결방법을 만들어내는 것이라고 생각합니다. 


알고리즘에 대한 정의 설명은 이정도로 하고 결론은 문제를 해결하기 위한 코드를 작성하는 것이 좋은 것이므로 


2. 최댓값 다음으로 세 값의 중앙값을 구하는 코드를 짜보겠습니다.


import java.util.Scanner;

public class Test02
{
	public static int medium(int num1, int num2, int num3)
	{
		if(num1 >= num2)
			if(num2>=num3)
				return num2;
			else if(num1<=num3)
				return num1;
			else
				return num3;
		else if(num1>num3)
			return num1;
		else if(num2>num3)
			return num3;
		else
			return num2;
	}

	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int num1, num2, num3;

		System.out.println("★중앙값구하기★");
		System.out.print("첫번째 값 : ");
		num1 = sc.nextInt();
		System.out.print("두번째 값 : ");
		num2 = sc.nextInt();
		System.out.print("세번째 값 : ");
		num3 = sc.nextInt();

		int m = medium(num1,num2,num3);

		System.out.println("중앙값 : "+m);
	}
}

코드를 보면 if문이 많고 최댓값을 구하는 것에 비해 굉장히 복잡해 보입니다. 하지만 이해 못할 정도는 아니죠? 이 코드와 비교하기 위한 다음 코드를 볼까요?


public static int medium(int num1, int num2, int num3)
{
	if((num2>=num1)&&(num3<=num1)||(num2<=num1&&num3>=num1))
		return num1;
	else if ((num1>num2&&num3<num2)||(num1<num2&&num3>num2))
		return num2;
	else
		return num3;
}

이 코드를 보게 되면 아까 위에 코드보다 더 간결한데? 더 좋은 알고리즘인가 쉽게들 생각할 수 있습니다. 많은 컴공친구들에게 물어봤는데도 그렇게 생각하더군요... 하지만 결과는 코드는 짧아졌지만 효율적인 코드는 첫번째의 코드가 더 효율적입니다. 이유는 간단합니다. if문이 많을 수록 비효율적이다 라고 생각하시는데 밑의 코드는 굉장히 많은 연산자가 들어가있습니다. 크기비교연산자, 논리연산자 등 많은 연산자등이 존재합니다. 결론으로 효율적인 알고리즘이란 짧다고 효율적인 것이 아닙니다. 메모리낭비가 적은 코드를 짜는것이 효율적인 알고리즘입니다. 



오늘은 첫 초보개발자와 함께하는 자료구조 첫번째 시간을 설명드렸습니다. 학교에서 또 학원에서 배우는 입장에서 알고리즘이란 무엇일까? 초보자가 공부하면서 쓰는 글이었구요. 알고리즘이라는 단어를 처음에 듣기만 한다면 딱딱해서 거부감을 느끼기 굉장히 좋습니다. 하지만 프로그래밍을 배우면서 문제해결능력을 기르는 것이 곧 효율적인 알고리즘을 짤수 있는 능력을 기르고 배우고 있다는 것으로 생각합니다. 또 알고리즘 자료구조는 멀지 않은 곳에 있다는 것을 저와 같은 초보개발자 분들이 아셨으면 좋겠습니다~^^ 수학적 문제 해결능력처럼 코딩에서의 문제 해결능력을 길러 저와 같이 자료구조 알고리즘 마스터가 됩시다!!! 다음 포스팅에서 찾아뵙겠습니다. 이상 초보개발자 갓준이었습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함