본문 바로가기

알고리즘/Do it 알고리즘

알고리즘이란

세 값의 최댓값 구하기

3개 의 정숫값 중 '최댓값'을 구하는 프로그램을 만들어보자. 변수 a, b, c에 들어가는 값은 키보드에서 입력한 값이며, 이 중 최댓값을 변수 max로 찾을 수 있다.

위 코드에서 17행부터 21행까지의 문장은 순서대로 실행된다. 이처럼 여러 문장(프로세스)이 순차적으로 실행되는 구조를 순차(sequential) 구조라 한다. 또, 18, 20행은 if문이다. ( ) 안에 있는 식을 평가한 결과에 따라 프로그램의 실행 흐름을 변경하는 if문을 선택(selection) 구조라 한다.

 

위 코드에서 사용한 Scanner stdIn = new Scanner(System.in)은 main 메서드 앞(키보드 값을 입력 받는 메서드)에 작성한다. System.in은 키보드와 연결된 표준 입력 스트림(standard input stream)이다. nextInt( ) 메서드를 호출하면 키보드로 입력한 정수값을 얻을 수 있다.

c가 최댓값일 경우
a가 최댓값일 경우
b가 최댓값일 경우

이 프로그램은 변수와 Scanner 클래스의 메서드를 int형으로 선언해서 int형 범위에서만 연산할 수 있다. 자료형을 long이나 double로 하면 그에 맞는 범위의 숫자도 사용할 수 있다.

 

메서드로 정의하기

한 번에 여러 값에 대해서도 최댓값을 구해보자. 이런 경우 일일이 값을 입력하며 작성하는 것보다 메서드로 작성하는 것이 편리하다.

출력 결과

 

책에서 설명하는 '알고리즘'이란 아래처럼 정의되어 있다.

어떤 문제를 해결하기 위한 절차로, 명확하게 정의되고 순서가 있는 유한 개의 규칙으로 이루어진 집합

물론 알고리즘을 아무리 명확하게 정의해도 변숫값에 따라 결과가 참, 거짓이 된다면 올바른 알고리즘이라 할 수 없다. 그래서 여기서는 세 값의 최댓값을 구하는 알고리즘이 올바른지 확인하기 위해 값을 여러 개 입력해 프로그램의 결괏값을 확인했다.

 

세 값의 중앙값

최댓값, 최솟값과 달리 중앙값을 구하는 절차는 매우 복잡하다. 하여 수많은 알고리즘을 떠올릴 수 있다. 입력받은 세 정수 중 중앙값을 찾는 프로그램을 코드로 구현해보자.

실행 결과

 

조건 판단과 분기

아래는 입력한 정숫값의 부호(양수/음수/0)를 판단하는 프로그램이다. 이를 통해 프로그램 흐름의 분기를 살펴보자.

변수 n 값이 양수면 if문을, 음수면 else if문을 0이라면 else문을 실행한다. 즉 실행되는 부분은 if, else if, else 중 한 가지뿐이며, 두 가지가 동시에 실행되거나 하나도 실행되지 않는 경우는 없다.

 

순서도의 기호

문제의 정의, 분석, 해법을 그리으로 표현하는 순서도(flow chart)의 대표 용어와 기호를 살펴보자.

 

프로그램 순서도

프로그램 순서도에서 사용하는 기호는 아래와 같다.

실제로 실행할 연산을 나타내는 기호
제어 흐름을 나타내는 선 기호
프로그램 순서도를 이해하거나 작성하는 데 편리한 특수 기호

 

데이터

데이터(data)의 입력과 출력을 나타낸다.

 

처리

처리(process)는 여러 종류의 처리 기능을 나타낸다. 

 

미리 정의된 처리

미리 정의된 처리(predefined process)는 서브루틴 및 모듈 등 다른 곳에서 이미 정의된 하나 이상의 연산 또는 여러 개의 명령어로 이루어진 처리를 나타낸다.

 

판단

판단(decision)은 하나의 입구와 하나를 선택하는 몇 개의 출구가 있고, 기호에서 정의한 조건을 평가해 하나의 출구를 선택하는 판단 기능(스위치형 기능)을 나타낸다.

 

루프 범위

루프 범위(loop limit)는 두 부분으로 구성되어 루프의 시작과 종료를 나타낸다. 기호의 두 부분에는 같은 이름(루프 이름)을 사용한다.

 

선(line)은 제어의 흐름을 나타낸다. 순서도에서 흐름의 방향을 분명히 하고자 할 때 화살표를 붙이기도 한다.

 

단말

단말(terminator)은 외부 환경으로 나가거나 외부 환경에서 들어오는 것을 나타낸다.

 

참고 서적 :

'알고리즘 > Do it 알고리즘' 카테고리의 다른 글

선형 검색  (0) 2022.06.25
검색 알고리즘  (0) 2022.06.25
클래스  (0) 2022.06.25
배열  (0) 2022.06.24
반복  (0) 2022.06.23