나의 IT일지
알고리즘 본문
컴퓨터는 프로그램의 명령에 따라 순서대로 일을 처리하고, 그에 따른 결과를 얻는다. 이러한 과정중에서 우리는 알고리즘이라는 것을 사용한다. 알고리즘이란 문제를 해결하기 위한 명확하게 정의되고 순서가 있는 규칙으로 이루어진 과정을 말한다. 즉, 우리가 어떤 문제에 대한 코딩을 할 때, 코딩에 대한 틀을 만드는 것을 알고리즘이라고 할 수 있다.
알고리즘 과정
알고리즘의 과정은 어떤 문제를 다루느냐에 따라 설계 방법이 달라지지만, 알고리즘을 설계하는 큰 틀은 바뀌지 않는다.
- 문제를 해결하기 위해서는 구현해야 하는 내용
- 프로그램의 기능을 구현하기 위한 사용 변수
- 프로그램의 기능을 구현하기 위한 상세 내용
예시로, "*"을 통해 직각 삼각형을 출력한다고 하자. 그렇다면 위의 틀에 따라 설계를 하면 다음과 같다.
- 구현 내용: 특수한 조건에 따라 반복적으로 "*"을 출력
- 사용 변수 : i ← 세로반복 , j ← 가로반복
- 상세 내용
- 수직적으로는 5번 반복해서 출력
- 수직으로 1번째 출력하면 수평적으로 1번 반복
- 수직으로 2번째 출력하면 수평적으로 2번 반복
- 수직으로 3번째 출력하면 수평적으로 3번 반복
- 수직으로 4번째 출력하면 수평적으로 4번 반복
- 수직으로 5번째 출력하면 수평적으로 5번 반복
즉, 수직 출력 횟수와 수평반복 횟수가 같을 때까지 "*"출력하게 된다. 그리고 틀에 따라 순서도를 설계하면 다음과 같으며, 순서도를 통해 코딩을 하면 다음과 같은 코드가 나온다.
//Java
package pack0331;
public class Tri {
public static void main(String[] args) {
for(int i=0;i<5;i++) {
for(int j=0;i>=j;j++) {
System.out.print("*");
}
System.out.println();
}
}
}
알고리즘 예시 : 카페 프로그램 만들기
- 구현 내용 : 주문하기, 취소하기, 결제하기
- 사용 변수 : orderlist[ ] ← 주문리스트 배열, count ← 주문 횟수, menuPrice ← 결제금액, ordernum ← 주문량
- 상세 내용
- 주문하기
1-1 현재 주문 내역, 결제금액 출력
1-2 주문가능한 메뉴를 출력
1-3 주문받을 메뉴를 입력
1-4 주문한 메뉴의 전체 메뉴리스트에 추가
1-5 주문한 메뉴를 가격을 총 금액에 누적
1-6 주문한 개수를 한 개 증가 - 취소하기
2-1 주문한 메뉴리스트, 결제금액 출력
2-2 취소할 메뉴를 입력
2-3 입력받은 메뉴를 주문리스트에서 제거
2-4 입력받은 메뉴의 금액을 총 금액에서 차감
2-5 주문한 개수를 한개 감소 - 결제하기
3-1 결제해야할 총 금액을 출력
3-2 사용자에게 지불할 금액을 입력
3-3 지불한 금액과 총 금액을 비교해서 지불한 금액이 총 금액보다 작으면 결제 취소 후 주문,취소,결제창으로 이동
3-4 지불한 금액과 총 금액을 비교해서 지불한 금액이 총 금액보다 크거나 같으면 잔돈과 함께 계산완료 출력 후 총 금액은 0원으로 주문리스트 리셋
3-5 전체 개수를 0개 초기화
- 주문하기
//Java
package pack0331;
import java.util.*;
public class Cafe {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String orderlist[] = new String[5]; //주문리스트 5개까지
int count = 0;//주문 횟수
int menuPrice = 0; //결제금액
int ordernum = 0; //주문량
System.out.println("Java Cafe");
userlist: while(true) {
//사용자 선택 리스트
System.out.println("1.주문하기");
System.out.println("2.취소하기");
System.out.println("3.결제하기");
System.out.println("4.종료하기");
System.out.print("입력(1~4):");
int picklist = sc.nextInt();
Menu: switch(picklist){
case 1 : //주문하기
while(count <= 5) {
System.out.println("현재 주문 내역 :"+Arrays.toString(orderlist));
System.out.println("결제금액"+ menuPrice);
if(count == 5) {
break Menu;
}
System.out.println("1.에스프레소\t1000원");
System.out.println("2.아메리카노\t1500원");
System.out.println("3.카페라떼\t\t2400원");
System.out.println("4.카푸치노\t\t2600원");
System.out.println("5.레몬에이드\t3000원");
System.out.println("6.흑당버블티\t3500원");
System.out.println("7.종료하기");
System.out.print("주문하기(1~7):");
int picknum = sc.nextInt();
switch(picknum) {//주문한 메뉴 배열에 추가
case 1:
orderlist[count] = "에스프레소";
menuPrice += 1000;
count++;
continue;
case 2:
orderlist[count] = "아메리카노";
menuPrice += 1500;
count++;
continue;
case 3:
orderlist[count] = "카페라떼";
menuPrice += 2400;
count++;
continue;
case 4:
orderlist[count] = "카푸치노";
menuPrice += 2600;
count++;
continue;
case 5:
orderlist[count] = "레몬에이드";
menuPrice += 3000;
count++;
continue;
case 6:
orderlist[count] = "흑당버블티";
menuPrice += 3500;
count++;
continue;
case 7:
break Menu;
default :
System.out.println("재입력해주시기 바랍니다.");
continue;
}
}
case 2: //취소하기
for(int i = 0; i<count;) {
System.out.println("현재 주문 내역 :"+Arrays.toString(orderlist));
System.out.println("결제금액"+ menuPrice);
System.out.print("메뉴 취소하기(나가기:0):");
int cancelnum = sc.nextInt();
if(cancelnum>=1&&cancelnum<=count) {
String menucancel = orderlist[cancelnum-1];
System.out.println(menucancel+"메뉴가 취소되었습니다.");
for(int j=cancelnum-1;j<count;j++){
orderlist[j] = orderlist[j+1];
}
if(menucancel.equals("에스프레소")){
menuPrice -= 1000;
}
else if(menucancel.equals("아메리카노")){
menuPrice -= 1500;
}
else if(menucancel.equals("카페라떼")){
menuPrice -= 2400;
}
else if(menucancel.equals("카푸치노")){
menuPrice -= 2600;
}
else if(menucancel.equals("레몬에이드")){
menuPrice -= 3000;
}
else if(menucancel.equals("흑당버블티")){
menuPrice -= 3500;
}
}
else if(cancelnum ==0) {
break Menu;
}
else {
System.out.println("잘못 입력하셨습니다.");
continue;
}
count--;
}
break Menu;
case 3: //결제하기
System.out.println("결제금액:"+ menuPrice);
System.out.print("지불할 금액:");
int payPrice = sc.nextInt();
if(payPrice>menuPrice) {
System.out.println("결제 취소되었습니다.");
break;
}
else {
System.out.println("결제 진행중입니다.");
System.out.printf("잔돈:%d",menuPrice-payPrice);
System.out.println("결제가 완료되었습니다.\n");
menuPrice = 0;
for(int i=0;i<5;i++) {
orderlist[i]="";
}
count=0;
}
case 4: //종료하기
System.out.println("시스템 종료");
break userlist;
default://잘못입력시
System.out.println("재입력해주시기 바랍니다.");
}
}
}
}
Comments