알고리즘의 효율성

  • 시간 복잡도(time complexity) : 알고리즘 수행 시간 ( 즉, 실행에 필요한 CPU 시간 )
  • 공간 복잡도(space complexity) : 알고리즘이 수행하는 동안 사용되는 메모리 공간의 크기 ( 즉, 알고리즘 수행에 필요한 변수나 자료의 크기 )
  • 여러가지의 변수 (  하드웨어, 운영체제, 컴파일러, 사용언어 등 )로 인해 알고리즘의 효울성을 객관적으로 평가하기 어려우기 때문에 시간복잡도와, 공간복잡도 등을 사용

 

알고리즘의 복잡도 분석 방법

  • 최악 경우 분석 (Worst-case analysis): 최악의 상황에서 알고리즘의 성능이나 동작 방식을 분석하는 것
  • 평균 경우 분석 (Average-case analysis): 일반적인 상황에서 알고리즘의 성능이나 동작 방식을 분석하는 것
  • 최선 경우 분석 (Best-case analysis): 가장 이상적인 상황에서 알고리즘의 성능이나 동작 방식을 분석하는 것

복잡도의 점근적 표기

  • 시간(공간) 복잡도는 입력 크기에 대한 함수로 표기, 이 함수는 주로 여러개의 항을 가지는 다항식
  • 함수를 단순한 함수로 표기하기 위해 점근적 표기(anymptotic notation)을 사용
  • 오메가 표기법 (Big - Ω notation) : 최선 경우의 분석, 하한 점근

Big - Ω notation

  • 정의 : 두 개의 함수 이 주어졌을 때 모든 0에 대해 을 만족하는 상수 c'와 n0가 존재하면 이다.
  • 설명 : 알고리즘이 가장 효율적으로 동작하는 경우를 고려하여 성능을 평가, 이는 알고리즘이 이상적인 상황에서 얼마나 빠르게 동작하는지를 파악 가능 

  • 세타 표기법 ( θ notation) : 평균 경우 분석, Big - Ω과 Big - θ의 평균

θ notation

  • 정의 : 두 개의 함수 이 주어졌을 때 모든 0에 대해 을 만족하는 상수 c와 c', n0가 존재하면 이다.
  • 설명 : 모든 가능한 입력에 대해 알고리즘이 평균적으로 어느 정도의 자원을 소비하는지를 평가, 이는 알고리즘이 실제 사용 환경에서 어느 정도의 성능을 보일지를 파악 가능

 

  • 빅오 표기법 (Big - O notation) : 최악 경우의 분석, 상한 점근

Big - O notation

  • 정의 : 두 개의 함수 이 주어졌을 때 모든 0에 대해 을 만족하는 상수 c와 n0가 존재하면 
  • 설명 : 모든 가능한 입력 중에서 가장 비효율적이고 가장 긴 시간이 걸리는 경우를 고려하여 알고리즘의 성능을 평가, 이는 알고리즘이 가장 나쁜 상황에서도 얼마나 잘 동작하는지를 파악하기 위해 중요

Big - O 표기법 (Big - O notation)

1 < lg n < n < n lg n < n^2 < n^3 < 2^n
1 < lg n < n < n lg n < n^2 < n^3 < 2^n

 

1. O(1) : 상수 시간 복잡도(constant time complexity)

O(1)

// 입력값의 크기에 상관없이 실행시간이 일정한 경우 O(1), 상수는 무시
F(arr[]){
	print(a[0]);
}

2. O(n) : 선형 시간 복잡도(linear time Complexity)

O(n)

// O(n)은 입력 데이터의 크기에 비례해서 처리 시간이 걸리는 알고리즘
// n이 1번 늘어날 때마다 처리시간이 1 증가하여 선형적으로 증가
// i의 출력을 n번 반복하기 때문에 O(n)

F(int[] n){
	for (int i = 0; i < n; i++){
    		print(i);
}
더보기

* Big - O 표기법 (Big - O notation)은 상한 점근적이기 때문에 앞의 상수는 무시

// 아래의 코드는 i와 j가 n씩 반복하므로 O(2n)이지만,
//	Big - O 표기법은 상한 점근적 표현법이므로 앞의 상수의 크기는 무의미
// 때문에 O(n)으로 표기하는 것이 올바름
F(n){
	for i to n{
    	print(i);
     }
     
     for j to n{
     	print(j);
     }
}

3. O(n^2) : 제곱 시간 복잡도(quardratic time complexity)

O(n^2)

// (O^2)의 대표적 예시는 2중 for문
// i 기준의 for문 반복이 j 기준의 for문을 또 돌리기 때문에 두 for문의 반복 수를 곱한 것과
// 	같은 시간 복잡도가 나옴
F(int[] n){
	for(int i = 0; i < n; i++){
    		for(int j = 0; j < n; j++){
        		print (i + j);
         	}
	}
}
더보기

* O(n*m)

// 아래의 코드는 i가 n번 반복, j가 m번 반복 하므로 O(n*m)으로 표기

F(n, m){
	for(int i = 0; i < n; i++){
    		for(int j = 0; j < m; j++)
        		print0 (i * j);
         	}
	}
}

4. O(n^3) : 세제곱 시간 복잡도 (cubic time complexity)

O(n^3)

// 삼중 for문의 경우 O(n^3)
// 이중 for문으로 n^2번 반복하면서, 크기가 n인 배열에서 n/2개를 뽑으면서 이들 중 최대값을
//	구하는 것은 n/2에 비례하는 시간이 소요되므로 n에 비례하는 시간 따라서 총 O(n^3)

F(A[], n){
	sum = 0;
    
    for(int i = 0; i < n; i++){
    	for(j = 0; j < n; j++){
        	k = A[1...n]에서 임의로 n/2개로 뽑을 대 이들 중 최댓값;
            	sum = sum + k;
		}
        
        return sum;
	}
}

5. O(2^n) : 지수 시간 복잡도(exponential time complexity)

O(2^n)

// O(n^2)은 n번 반복할 수록 2의 n제곱만큼 시간이 증가함을 의미
// 재귀함수를 이용하여 피보나치를 구현하면 함수를 두번 호출하는 중복호출이 생겨 O(n^2)

F(n, r){
	if (n <= 0) return 0;
    	else if (n == 1) return r[n] = 1;
    return r[n] = F(n-1, r) + F(n-2, r);
  }

6. O(log n) : 로그(대수) 시간 복잡도(logarithmic  time complexity)

 

O(log n)

// O(log n)은 밑이 2인 log2 n을 일반적으로 나타냄
// 그러나, Big-O는 상한 점근적 표기이기 때문에 log 밑의 의미에 크게 영향을 주지 않음
// 아래의 코드 while(i<n)만 보면 n번 반복할 것 같지만, i = i * 2로 인해 숫자는
//	1 > 2 > 4 > 8 > 16 ... 16인 2의 거듭제곱으로 커지기 때문에 log2n만큼 반복

F(c){
	i = 1;
    
    while(i >= 1){
    	print(i);
        
        i = i * 2;
	}
}

7. O(n log n)  : 로그-선형 시간 복잡도 (log-linear time complexity )

O(n log n)

// for문과 while문이 중첩되어 while문은 logn에 곱하기 n번 한 만큼의 반복이 될 것
// for문이 while 내에 중첩되든, while문이 for문 내에 중첩되든 상관없이 반복횟수는
//	각각 반복문의 곱셈
F(n){
	for(int i=1;i<n;i++){
    	j=1;
        while(j<n){
        	print(i,j);
            j = j * 2;
        }
    }
}

효율적인 알고리즘이 필요한 이유

  • O(n^2)과 O(n log n) 비교
O(n^2) 1,000 1 백만 10 억
PC < 1초 2시간 300년
슈퍼컴 < 1초 < 1초  
O(n log n) 1,000 1 백만 10 억
PC < 1초 < 1초 5분
슈퍼컴 < 1초 < 1초 < 1초
  • 입력의 크기가 작으면 어느 알고리즘을 사용해도 비슷한 수행시간이 걸리나, 입력이 커지면 커질수록 그 차이는 커짐
  • 효율적인 알고리즘은 슈퍼 컴퓨터보다 더 큰 차이가 있다고 말할 수 있음 (즉, 값 비싼 하드웨어의 기술 개발보다 효율적인 알고리즘 개발이 훨씬 더 경제적)

기능적 요구사항


[사용자]

> 회원

  • 로그인
    • 로그인
      1. 아이디와 비밀번호가 일치하면 로그인을 허용한다.
      2. 로그인이 되면 병원정보찾기, 병원예약하기, 개인(and 피보호자) 진료기록 열람 기능을 허용한다.
  • 회원가입
    • 회원가입 
      1. 회원가입시 입력 정보 목록 (* : 필수 입력사항)
        1. *회원아이디
        2. *비밀번호
        3. *이름
        4. *나이
        5. *주소
        6. *전화번호
        7. 보호자
        8. 피보호자
        9. 기저질환
        10. 복용중인 
      2. 아이디는 중복되지 않아야 한다.
      3. 회원은 중복되지 않은 회원번호가 부여되고, 회원번호로 식별된다
    • 회원탈퇴
      1. 회원탈퇴는 회원 본인만이 탈퇴가 가능하다.
      2. 회원이 탈퇴할경우 해당 회원의 정보는 모두 삭제해야한다.
        • ) 계정을 즉시 삭제하지 않고 6개월 뒤에 삭제
  • 개인정보
    • 개인정보수정
      1.  개인정보 수정은 해당 본인이거나, 보호자일 경우에만 수정이 가능하다
    • 진료기록
      1. 진료기록은 본인이거나, 보호자, 혹은 해당 병원만이 열람할 수 있다.
  • 병원검색 (리스트업을 해줄 것인지?  --- 페이징 고려)
    • 위치기반
      1. 사용자의 현위치를 gps를 통해 입력받아 반경(설정가능?) n km 이내 병원의 정보를 찾을 수 있다.
      2. 사용자가 확인할 수 있는 정보는 진료과, 영업시간, 응급실 여부, 병원위치, 병원명, 연락처, 의사정보가 있다.
    • 검색어 기반 > 다양한 필터 사용
      1. 사용자는 주소 검색을 통해 병원의 정보를 찾을 수 있다.
      2. 사용자는 확인할 수 있는 정보는 진료과, 영업시간, 응급실 여부, 병원위치, 병원명, 연락처, 의사정보가 있다.
    • 병원검색시 정보 조회 목록
      • 기본정보
        1. 병원이름
        2. 텍스트주소
        3. 상세정보
          1. 병원이름
          2. 진료과목
          3. 텍스트주소
          4. 병원정보
          5. 시설
          6. 병원번호
          7. 병원소개
          8. 진료시간
            • 점심시간
            • 요일별진료시간
            • 공휴일
          9. 공지사항
          10. 진료항목
          11. 의사정보
      • 필터
        1. 주차장 여부
        2. 전문의 여부
        3. 병원 정보
          1. 영유아검진
          2. 여의사
          3. 종합병원
          4. 전문병원
          5. 예방접종
          6. 건강검진
        4. 병원시설
          1. 일반/중환자실
          2. 일반병실
          3. 상급병실
          4. 신생아중환자실
          5. 분만실
          6. 수술실
          7. 응급실
          8. 물리치료실
        5. 병원장비
          1. CT
          2. MRI
          3. 골밀도검사기
          4. 양전자단층촬영기
          5. 유방촬영장치
          6. 종양치료
          7. 체외충격기/파쇄석기
          8. 초음파영상진단기
          9. 콘빔CT
          10. 혈액투석을위한인공신장기
        6. 진료과목
          1. 소아청소년과
          2. 내과
          3. 이비인후과
          4. 정형의과
          5. 가정의학과
          6. 외과
          7. 피부과
          8. 산부인과
          9. 비뇨기과
          10. 안과
          11. 마취통증의학과
          12. 정신건강의학과
          13. 성형외과
          14. 재활의학과
          15. 신경외과
          16. 일반의원
          17. 신경과
          18. 영상의학과
          19. 흉부외과
          20. 직업환경의학과
          21. 치과
          22. 결핵과
          23. 예방의학과
          24. 방사선종양학과
          25. 종합병원
          26. 핵의학과
          27. 진단검사의학과
          28. 보건소
          29. 조산원
      • 의사정보
        1. 이름
        2. 성별
        3. 진료과
        4. 근무일
        5. 양력
  • 병원 예약
    • 예약
      1. 사용자는 동일한 시간에 여러개의 병원을 예약할 수 없다.
      2. 사용자는 해당 병원 예약 가능한 시간대에만 예약을 할 수 있다.
      3. 사용자는 예약을 할 때 예약시간, 증상, 담당의사선택 을 입력해야한다.
        1. 사용자가 필요로하는 진료과를 선택한다.
        2. 일주일 이내 예약 시간을 선택(30분 단위로 시간이 존재) 
        3. 불가능한 예약 시간(휴무, 이미 예약된 시간)은 선택이 불가능하다.
        4. 예약 시간을 선택했다면 그 시간대에 가능한 의사를 선택할 수 있도록 한다.
        5. 간단히 증상을 입력한다.
        6. 모든 정보가 입력이 되었다면 병원으로 예약 신청이 전송된다.
        7. 병원은 사용자로 부터 받은 예약 신청을 확정 or 반려할 수 있다.
        8. 병원 예약 신청을 확정하면 사용자로에게 알림과 예약정보를 전달한다.
      4. 보호자가 피보호자의 진료를 예약할때에는 피보호자ID와 피보호자ID를 예약정보에 기록해야한다.
      5. 사용자는 예약한 병원이 자신의 정보를 열람할 수 있도록 해야한다.
      6. 예약 정보는 보호자, 본인, 병원만이 열람할 수 있다.
      7. 사용자가 병원을 예약하면 예약번호, 예약 정보를 유지해야한다.
    • 취소
      1. 예약 취소는 예약한 본인이나 보호자, 해당 병원만이 가능하다.
      2. 예약 취소를 할때에는 예약번호, 회원아이디, 비밀번호가 필요하다.
      3. 보호자가 피보호자의 진료를 예약했을때에는 피보호자 또한 취소가 가능하다.
      4. 취소할경우에 병원과 본인, 보호자 모두에게 알림이 간다. > 트리거 사용
      5. 사용자가 예약을 취소하면 해당 예약번호의 정보들을 삭제해야한다. > 예약 status(신청, 확정, 예약반려, 진료완료, 취소)
    •  변경
      1. 예약 변경은 예약한 본인이나 보호자만이 가능하다
      2. 예약을 변경할때에는 예약번호, 회원아이디, 비밀번호가 필요하다.
      3. 보호자가 피보호자의 진료를 예약했을때에는 피보호자 또한 변경이 가능하다.
      4. 변경할 경우 병원과 본인, 보호자 모두에게 알림이 간다.  > 트리거 사용
      5. 사용자가 예약을 변경할 경우에는 해당 예약 정보를 변경해야한다. > 어떻게 바꿀지 찾아보기
  • 보호자 기능
    • 유저는 보호자, 피보호자(회원일 경우) 관계설정을 통해 보호자 서비스를 이용할 수 있다.
    • 보호자와 피보호자의 관계설정은 보호자가 피보호자의 정보를 등록하는걸로 한다.
    • 피보호자는 아내, 남편, 아이, 부모 모두 가능하나, 피보호자가 회원인 경우로 제한한다.

[병원]

  • 로그인
    • 로그인
      1. 이이디와 비밀번호가 일치하면 로그인을 허용한다.
      2. 로그인이 되면 예약자의 정보, 병원정보수정이 가능하다.
  • 회원가입
    • 회원가입
      1. 회원가입시 입력 정보 목록 (* : 필수 입력사항)
        1. *회원아이디
        2. *비밀번호
        3. *병원이름
        4. *병원주소
        5. *병원 연락처
        6. *병원 정보
        7. *병원 시설
        8. *병원 장비
        9. 진료시간
        10. 공지사항
        11. *진료과목
        12. *의사정보
        13. 병원소개
      2. 아이디는 중복되지 않아야 한다.
      3. 병원은 중복되지 않은 병원번호가 부여되고, 병원번호로 식별된다
  • 정보 열람 및 수정
    • 병원정보수정
      1.  병원정보 수정은 해당 병원만 수정이 가능하다.
      2.  병원정보 수정은 해당 병원의 아이디와 비밀번호가 필요로한다.
    • 환자정보
      1. 병원은 해당 병원을 이용했던 사용자의 정보(이름, 진료날짜, 증상)를 유지해야한다.
    • 병원 삭제
      1. 등록된 병원을 삭제하는 것은 해당 병원만이 가능하다.
      2. 등록된 병원을 삭제할 시에는 해당 병원의 아이디와 비밀번호가 필요하다.
  • 예약
    • 예약일정관리
      1. 영업시간에 회원으로부터 오직 영업시간에만 예약을 받을 수 있다.
      2. 병원은 회원으로부터 아직 예약되지 않은 시간에만 예약을 받을 수 있다. 
        • 예약정보관리
          1. 병원은 예약받은 환자의 정보(예약날짜/시간, 증상, 예약자 정보)를 유지해야한다.
          2. 예약정보는 해당 환자와 보호자, 병원만이 연람이 가능하다.

비기능적 요구사항


  • 보안
    • 시스템은 사용자 정보와 예약 데이터를 안전하게 처리하고 보호해야 한다.
  • 접근성
    • 시스템은 다양한 디바이스(스마스폰, 태플릿, PC)에서 접근이 가능해야 한다.
  • 신뢰성
    • 시스템은 고가용성을 보장하며, 데이터 오류 없이 정확하게 운영되어야 한다.
  • 사용성
    • 시스템 인터페이스는 직관적이고 사용하기 쉬어야 한다.

 

 

추가 고려사항


  • 병원 검색은 회원가입을 하지 않은 유저도 병원 검색 기능은 사용이 가능하다.
  • 보호자, 피보호자 관계 설정은 누가 어떤식으로 할 것인지 > 보호자가 피보호자(상관없음)
  • 진료예약 > 보호자가 피호자에 대해 예약을 했다면 보호자ID와 피보호자ID 기록

+ Recent posts