알고리즘

1. 기본 알고리즘

masxer 2025. 6. 24. 15:08

 

순차 구조 : 여러 프로세스(문장)가 순차적으로 실행되는 구조

※ if문 : 선택 구조

<순서도 (Flowchart)>

 

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

 

프로그램 순서도

- data : 데이터의 입력과 출력을 나타낸다.

<data>

- 처리 : 여러 종류의 처리 기능을 나타내는데, 정보값, 자료형, 위치를 바꾸도록 정의한 연산의 실행 또는 연속하는 몇 가지 흐름 가운데 하나의 방향을 결정하는 연산의 실행을 나타낸다.

<처리>

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

서브루틴(subroutine): 메인루틴에서 호출되는 함수, 또는 서브루틴에서 호출되는 함수들을 의미한다.

<이미 정의된 처리>

- 판단 : 하나의 입구와 하나를 선택하는 몇 개의 출구가 있고, 기회에서 정의한 조건을 평가해 하나의 출구를 선택하는 판단 기능을 나타낸다.

<판단>

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

<시작 기호>
<종료 기호>

루프의 시작 기호 또는 종료 기호 안에 초기값(초기화), 증가값, 종료값을 표기한다. i가 변수명, 초기값, 증가값, 종료값 순으로 나열

<루프 범위 예시>

- 선 : 제어의 흐름을 나타낸다. 순서도에서 흐름의 방향을 분명히 나타내고 싶을 때, 또는 보기 쉽게 하기 위해 화살표를 붙이기도한다.

<선, 화살표>

- 단말 : 외부 환경으로 나가거나 외부 환경에서 들어오는 것

ex) 프로그램 흐름의 시작과 종료

<단말>

 

 

<'+'와 '-'를 번갈아 실행하는 예제 1>

for(int i = 0; i < n; i++)
	if(i % 2 == 0) // 짝수
    	System.out.print("+");
    else
    	System.out.print("-");

 

위에 코드는 2가지 문제점이 존재하는데, 이 문제점에 대해 살펴보려고 한다.

1. for문을 반복할 때마다 if문을 실행해야 한다.

2. 변경할 때 유연하게 대응하기 어렵다.

    - 만약 i = 0이 아닌 1부터 시작할 경우 for문 전체를 수정해야 한다.

 

위 문제점들을 해결하기 위해 다음과 같은 코드로 변경해서 해결할 수 있다.

for(int i = 0; i < n / 2; i++)
	System.out.print("+-");
if(n % 2 != 0)
	System.out.print("+");

 

위 코드처럼 작성하면 된다.

 

단축 평가 : 왼쪽 피연산자의 평가 결과만으로 결정되는 경우 오른쪽 피연산자를 평가하지 않는다.

 

드모르간 법칙 : 각 조건을 부정하고 논리곱을 논리합으로, 논리합을 논리곱으로 바꾸고 다시 전체를 부정하면 원래의 조건과 같다.

ex1) x && y는 !(!x || !y)와 같다.

ex2) x || y는 !(!x && !y)와 같다.

 

구조적 프로그래밍 : 입력하는 곳 하나, 출력하는 곳 하나를 갖는 구성 요소만을 사용해, 이들을 계층적으로 배치해서 프로그램을 구성하는 방식이다.

※ 지금까지 배운 순차, 선택, 반복이라는 제어 흐름들은 모두 구조적 프로그래밍 개념을 바탕으로 한다.

 

 

직각 이등변 삼각형 출력 예제

import java.util.Scanner;

public class Loop {
	static void triangleLB(int n) {
		for(int i = 1; i <= n; i++) {
			for(int j = 1; j<= i; j++)
				System.out.print('*');
			System.out.println();
		}
	}
	
	static void triangleLU(int n) {
		for(int i = 1; i <= n; i++) {
			for(int j = n; j >= i; j--)
				System.out.print('*');
			System.out.println();
		}
	}
	
	static void triangleRU(int n) {
		   for (int i = 0; i < n; i++) {	          
	            for (int j = 0; j < i; j++) {
	                System.out.print(" ");
	            }
	            for (int j = 0; j < n - i; j++) {
	                System.out.print("*");
	            }
	            System.out.println();
	        }
	}
	static void triangleRB(int n) {
		   for (int i = 1; i <= n; i++) {	          
	            for (int j = 0; j < n - i; j++) {
	                System.out.print(" ");
	            }
	            for (int j = 0; j < i; j++) {
	                System.out.print("*");
	            }
	            System.out.println();
	        }
	}
	
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n;
		
		System.out.println("왼쪽 아래가 직각인 이등변 삼각형을 출력합니다.");
		
		do {
			System.out.print("몇 단 삼각형입니까?: ");
			n = sc.nextInt();
		}while(n <= 0);
		
		triangleLB(n); // 왼쪽 아래가 직각인 이등변삼각형을 출력
		System.out.println();
		triangleLU(n); // 왼쪽 위가 직각인 이등변삼각형을 출력
		System.out.println();
		triangleRU(n); // 오른쪽 위가 직각인 이등변삼각형을 출력
		System.out.println();
		triangleRB(n); // 오른쪽 아래가 직각인 이등변삼각형을 출력
		
		
	}
}

<실행 결과>

이렇게 해서 기본적인 알고리즘에 대해서 배워봤고, 다음 글에서 기본 자료구조인 배열부터 해서 해시 알고리즘까지 순차적으로 포스팅해 볼 예정이다,