1. 기본 알고리즘
순차 구조 : 여러 프로세스(문장)가 순차적으로 실행되는 구조
※ if문 : 선택 구조

알고리즘이란? : '어떤 문제를 해결하기 위한 절차'로 명확하게 정의되고 순서가 있는 유한 개의 규칙으로 이루어진 집합
프로그램 순서도
- 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); // 오른쪽 아래가 직각인 이등변삼각형을 출력
}
}

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