1. 기본 알고리즘

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); // 오른쪽 아래가 직각인 이등변삼각형을 출력
		
		
	}
}

<실행 결과>

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

'알고리즘' 카테고리의 다른 글

6. 정렬 알고리즘 - 1  (0) 2025.07.10
5. 재귀 알고리즘  (0) 2025.07.06
4. 스택과 큐  (0) 2025.07.02
3. 검색 알고리즘  (0) 2025.06.29
2. 기본 자료구조  (0) 2025.06.26
'알고리즘' 카테고리의 다른 글
  • 5. 재귀 알고리즘
  • 4. 스택과 큐
  • 3. 검색 알고리즘
  • 2. 기본 자료구조
masxer
masxer
masxer 님의 블로그 입니다.
  • masxer
    masxer 님의 블로그
    masxer
  • 전체
    오늘
    어제
    • 분류 전체보기 (54)
      • 알고리즘 (7)
      • 코딩 테스트 준비 (34)
        • 문제 (28)
        • 개념 (6)
      • 25-1 여름방학 공모전 프로젝트 (0)
      • 스프링부트 (6)
      • 도커 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
masxer
1. 기본 알고리즘
상단으로

티스토리툴바