2013년 9월 9일 월요일

자바 버블, 삽입 정렬, 소트(JAVA SORT) 예제입니다.

자바 버블, 삽입 정렬, 소트(JAVA SORT) 예제입니다. 참고하세요~

import java.util.Random;
class BubbleSort {
 //버블정렬1(좌측부터)
 int[] sort1(int a[])  {
      int  temp, num = a.length;;
   boolean flag=true;
      while(flag) {
                flag = false;
    //i를 미리 증가, 처음것 다음부터 비교
                for(int i=0; i < num-1; ++i) { 
                      if(a[i] > a[i+1]) {    // ascending sort
                          temp = a[i]; a[i] = a[i+1];
                          a[i+1] = temp;
        flag = true;
                      }
                }  
        } 
  return a;
 }
 //버블정렬2(우측부터)
 int[] sort2(int[] a) {
  int temp, num = a.length;
  boolean flag = true; //자료 위치 교환의 발생 여부
  //자료의 위치 교환이 발생하는 동안 반복한다.
  while(flag) {
   // 마지막 포인터를 줄이면서 마지막 포인터까지
   //비교하면서 우측이 작으면 자리를 바꿈...
   num--;
   flag = false;
   for(int i=0; i<num; i++) {
    if (a[i] > a[i+1]){
     temp = a[i];
     a[i] = a[i+1];
     a[i+1] = temp;
     flag = true;
    }
   }
  }
  return a;
 }
 public static void main(String[] args){
  int nansu[] = new int[10000];
  int[] sortedArray = new int[10000];
  int[] halfSortedArray = new int[10000];
  int[] reverseArray = new int[10000];
  int[] temp = new int[10000];
  long startTime, elapsedTime, counter;
  BubbleSort mySort = new BubbleSort(); 
  //----------------- 난수 발생시킴
  Random r = new Random();
  for(int i=0; i<10000; i++) {
   nansu[i] = r.nextInt(10000);
  }
  //-----------------------------------
  //------------------------------------------------------------------------------
  //우선 난수를 정렬하고, 정렬된 상태(최선의상황)을 다시 정렬시킴
  //------------------------------------------------------------------------------
  counter=0;
  sortedArray = mySort.sort2(nansu);
  startTime = System.currentTimeMillis(); 
  do {
     counter++;
     temp = mySort.sort2(sortedArray);
     } while (System.currentTimeMillis() - startTime < 1000);
  elapsedTime = (System.currentTimeMillis()- startTime) / counter;
  System.out.println("[최선의 상황 수행시간] " + elapsedTime + "ms");
  //-------------------------------------------------------------------------------
 
  //-------------------------------------------------------------------------------
  //반쯤 정열후 ...
  //-------------------------------------------------------------------------------
  counter=0;
  halfSortedArray = sortedArray;
  for(int i=0; i<5000; i++) {
   halfSortedArray[i] = r.nextInt()*10000;
  }
  startTime = System.currentTimeMillis(); 
  do {
     counter++;
     temp = mySort.sort2(halfSortedArray);
     } while (System.currentTimeMillis() - startTime < 1000);
  elapsedTime = (System.currentTimeMillis()- startTime) / counter;
  System.out.println("[반쯤 정렬 수행시간] " + elapsedTime + "ms");
  //-------------------------------------------------------------------------------
  //-------------------------------------------------------------------------------
  //역순상태
  //-------------------------------------------------------------------------------
  counter=0; 
  for(int i=0;i<sortedArray.length;i++) {
   reverseArray[sortedArray.length-i-1] = sortedArray[i];
  }
  startTime = System.currentTimeMillis(); 
  do {
     counter++;
     temp = mySort.sort2(reverseArray);
     } while (System.currentTimeMillis() - startTime < 1000);
  elapsedTime = (System.currentTimeMillis()- startTime) / counter;
  System.out.println("[역순 상태 수행시간] " + elapsedTime + "ms");
  //--------------------------------------------------------------------------------
 }
}






>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


class SNode {
 public String key;
 public Object obj;
 public SNode next;
 public SNode (String key) {
  this(key, null, null);
 }
 public SNode (String key, Object obj) {
  this(key, obj, null);
 }
 public SNode (String key, Object obj, SNode next) {
  this.key = key;
  this.obj = obj;
  this.next = next;
 }
 public int compareTo(SNode node) {
  if (key.compareTo(node.key)<0) return -1;
  else if (key.compareTo(node.key)==0) return 0;
  else return 1;
 }
}
class Person {
 String name;
 String tel;
 Person(String name, String tel) {
  this.name = name;
  this.tel = tel;
 }
}

public class InsertionSort {
 static SNode insertionSort(SNode head) { 
  SNode end;
  SNode q;              //삽입되는 카드 1장....(새로 위치를 찾을 데이터를 가리킴)
  SNode prev;         //삽입되는 위치의 앞, 뒤 포인터
  end = head;
  while(end.next!= null) {
   q = end.next;  //새로 비교되는 대상
   //다음것이 작은 경우...위치를 바꾸자
   if (q.compareTo(head)<0){  //새로 비교되는 대상이 head 보다 작은 경우
    //head와 다음 노드의 순서를 바꾼다...
    end.next = q.next;
    q.next = head;
    head = q;
   }
   else {
    prev = head;
    //새로 추가되는 q가 큰 동안에 수행
    //즉 삽입될 위치를 찾음....
    while(q.compareTo(prev.next) > 0) {
     prev =  prev.next;
    }
    //마지막가지 비교한 결과 자기(q)보다 큰것이 없는 경우
    //q를 마지막으로
    if (q == prev.next) end = q;     
    else {  //삽입될 위치를 찾은 경우 prev 뒤에 q를 삽입
     //q가 가운데 들어가므로 q.next를 보관
     end.next = q.next; 
     q.next = prev.next;
     prev.next = q;
    }
   } //end of if
  }//end of while
  return head;
 }
 public static void main(String[] args) {
  SNode node1 = new SNode("바길동", new Person("바길동","666-6666"), null);
  SNode node2 = new SNode("라길동", new Person("라길동","444-4444"), null);
  SNode node3 = new SNode("마길동", new Person("마길동","555-5555"), null);
  SNode node4 = new SNode("가길동", new Person("가길동","111-1111"), null);
  SNode node5 = new SNode("나길동", new Person("나길동","222-2222"), null);
  SNode node6 = new SNode("다길동", new Person("다길동","333-3333"), null);
  node1.next = node2;  node2.next = node3;
  node3.next = node4;  node4.next = node5;
  node5.next = node6;
  SNode head = insertionSort(node1);
  while(head != null) {
   System.out.println(((Person)(head.obj)).name + "::" + ((Person)(head.obj)).tel);
   head = head.next;
  }
 }
}





>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>



import java.util.Random;
class InsertionSort2 {
 int[] sort(int[] a) {
  int temp, j;
  for(int i=0;i<a.length;i++) {
   temp = a[i];
   j = i-1;
   //temp가 작으면 a[]는 -> 방향으로 한칸씩 이동
   while(j>=0 && temp < a[j]) {
    a[j+1] = a[j];
    j--;
   }
   a[j+1] = temp;
  }
  return a;
 }
 public static void main(String[] args){
  int nansu[] = new int[10000];
  int[] sortedArray = new int[10000];
  int[] halfSortedArray = new int[10000];
  int[] reverseArray = new int[10000];
  int[] temp = new int[10000];
  long startTime, elapsedTime, counter;
  InsertionSort2 mySort = new InsertionSort2(); 
  //----------------- 난수 발생시킴
  Random r = new Random();
  for(int i=0; i<10000; i++) {
   nansu[i] = r.nextInt(10000);
  }
  //-----------------------------------
  //------------------------------------------------------------------------------
  //우선 난수를 정렬하고, 정렬된 상태(최선의상황)을 다시 정렬시킴
  //------------------------------------------------------------------------------
  counter=0;
  sortedArray = mySort.sort(nansu);
  startTime = System.currentTimeMillis(); 
  do {
     counter++;
     temp = mySort.sort(sortedArray);
     } while (System.currentTimeMillis() - startTime < 1000);
  elapsedTime = (System.currentTimeMillis()- startTime) / counter;
  System.out.println("[최선의 상황 수행시간] " + elapsedTime + "ms");
  //-------------------------------------------------------------------------------
 
  //-------------------------------------------------------------------------------
  //반쯤 정열후 ...
  //-------------------------------------------------------------------------------
  counter=0;
  halfSortedArray = sortedArray;
  for(int i=0; i<5000; i++) {
   halfSortedArray[i] = r.nextInt()*10000;
  }
  startTime = System.currentTimeMillis(); 
  do {
     counter++;
     temp = mySort.sort(halfSortedArray);
     } while (System.currentTimeMillis() - startTime < 1000);
  elapsedTime = (System.currentTimeMillis()- startTime) / counter;
  System.out.println("[반쯤 정렬 수행시간] " + elapsedTime + "ms");
  //-------------------------------------------------------------------------------
  //-------------------------------------------------------------------------------
  //역순상태
  //-------------------------------------------------------------------------------
  counter=0; 
  for(int i=0;i<sortedArray.length;i++) {
   reverseArray[sortedArray.length-i-1] = sortedArray[i];
  }
  startTime = System.currentTimeMillis(); 
  do {
     counter++;
     temp = mySort.sort(reverseArray);
     } while (System.currentTimeMillis() - startTime < 1000);
  elapsedTime = (System.currentTimeMillis()- startTime) / counter;
  System.out.println("[역순 상태 수행시간] " + elapsedTime + "ms");
  //--------------------------------------------------------------------------------
 }
}


출처 : 오라클자바커뮤니티(www.oraclejavanew.kr)



오라클자바커뮤니티 추천 실전 개발자 과정 - 개인80% 환급



자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지

강좌명 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지(주말주간(토/일))
오라클자바커뮤니티(www.oraclejavanew.kr) 추천 실전강좌
교재 자체교재 or PDF 무료제공
강좌 일정 09월14일(토) ~ 10월20일(일)((주말주간(토/일)) 10:00~18:00, 10일) 총 70시간
강의 장소 [A강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 - 800,000원
[고용주환급]대기업: 35만원 전후, 중소기업:41만원 전 후 환급

[개인수강지원(개인환급)]정규직 640,000 ,비정규직:전액환급
대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.

재직자 내일배움카드 : 정부지원금 80% 자기부담금 20%
(구 능력개발카드 명칭이 내일배움카드로 변경 / 연간 총한도 200만원)

법정공휴일 / 추석연휴 9/17휴강
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 최근 자바 웹 개발은 프레임워크 기반 개발 입니다.(Struts1, Struts2, Spring ...)
이러한 시대의 흐름에 따라가야 하는 것은 어쩌면 당연한 일 일지도 모르겠습니다. 본 과정에서는 이러한 시대의 흐름과 초보 자바 개발자 또는 자바를 처음하시는 분이라도 수강이 가능하도록 자바 언어의 기초부터 자바웹 기본&활용, JDBC기본 맟 활용, Ajax, jQuery 그리고 최근 각광받는 자바 프레임워크 (Struts2, Spring)까지 진행하는 그야말로 자바 웹개발자가 되기 위한 단기 속성 과정 입니다.

모든 교육이 실습위주의 실무 중심교육이 될 것이며 일/주간 단위 과제를 통해 본인의 SKILL이 UP되는 것을 느끼실 겁니다. 자바 웹 개발의 시대에 동참하는 가장 빠른 길이 될 것을 확신 합니다!
교육목표 - Core 자바에 대한 이해 및 활용
- MVC Model의 이해
- Setvlet의 동작원리, Mapping 기법의 이해
- JSP기본 및 활용
- Custom Tag의 이해
- Ajax 및 jQuery에 대한 이해
- 자바기반 프레임워크 개요에 대한 이해
- Spring IoC, AOP에 대한 이해
- Spring Web MVC에 대한 이해
교육대상 - 다른 언어를 사용하다 자바쪽으로 전행을 원하는 개발자
- 자바쪽으로 취업을 원하는 초보 개발자
선수학습 - 프로그래밍 기본
- 데이터베이스 기본
 

JAVA 자바 언어 소개,기본 문법
Virtual Machine 소개/메모리 영역
클래스 패스(Class Path) 개요
Array 이론/실습
클래스와 객체(Class & Object)
Abstarct Data Type, 상속(Inheritance)과 다형성
추상클래스(Abstract Class)와 다형성
인터페이스(Interface)와 다형성
연관(Aggregation & Composition)
오버로딩(OverLoading)과 오버라이딩(Overriding)
this/super/constructor
Package 만들기 이론/실습
Java에서 예외 처리 요령
사용자 예외 처리 방법
JDBC 개요, JDBC Driver 소개
Drivermanager, Connection, Statement, Resultset 개체 소개
DML 실습(Insert, Update, Delete, Select)
Java에서 Oracle Stored Procedure/Function 다루기
PreparedStatement를 이용한 예제 실습
스트림(Stream) 입출력 관련 클래스, InputStream/OutputStream,
FileInputStream/FileOutputStream
Reader/Writer등 입출력 관련 클래스
표준 입출력/FILE 처리, 객체 직렬화 이론/실습
Thread 개요
Java에서의 Process
Thread Joining/Interrupt
Thread 사이의 통신/동기화
JDBC Programming Connection, Statement, ResultSet, PreparedStatement
Oracle의 function, procedure 다루기
DBCP, DataSource, Connection Pool
Servlet/JSP Servlet의 개요
Servlet의 Request, Response
Servlet에서의 Session, Cookie 다루기
Applet과 Servlet의 연동
JDBC Programming(Connection, Statement, PreparedStatement, CallableStatement, ResultSet) JSP 기본문법
JSP 내장 객체,Java Beans
JSP에서의 Session, Cookie 다루기
Custom Tag
MVC Model의 이해
Ajax, jQuery Programming Ajax 개발환경 구축
왜 Ajax 인가?
Ajax의 기본 구성
XMLHttpRequest 객체
innerHTML의 사용
DOM(Document Object Model) 다루기
Ajax MVC

JQuery 개요
JQuery 셀렉터 Element 다루기
Element 조작
DOM 스크립팅
JQuery 이벤트 핸들링
JQuery Utility 함수
JQuery 응용
Spring Framework3.2 J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.2, Tomcat7, Spring3.2 다운로드 및 설치)
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
DL. DI 예제를 통한 이해
Spring 설정 상세
Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean
Annotation기반 AOP(AspectJ)
Spring JDBC
Spring Web MVC
Sprint Web Flow
Spring Controller
Spring MVC TEST Framework
Spring3.2 New Feature
MyBatis [MyBatis]
개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
고급 쿼리 사용방법의 이해와 실습
Spring MyBatis 응용예제 작성
 






SQL초보에서실전전문가까지

강좌명 SQL초보에서실전전문가까지(주말주간(토/일))
오라클자바커뮤니티(www.oraclejavanew.kr) 추천 실전강좌
교재 본원 자체교재 20,000 별도
강좌 일정 09월14일(토) ~ 10월13일(일)((주말주간(토/일)) 10:00~18:00, 8일) 총 56시간
강의 장소 [C강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 - 650,000원
- 고용보험 환급(50~80% 환급)
[고용주환급]대기업:21만원 전후,중소기업:285,254원

[개인수강지원(개인환급)]정규직 520,000원 ,비정규직:전액환급
상시 근로자수 300이상 대기업 재직자는 개인환급 불가.



* 휴강 :법정공휴일 / 추석연휴 휴강
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 본 과정은 프로그램 개발 시 개발자들이 흔히 겪게 되는 SQL 사용법에 중점을 둔 강좌로서 기본적인 SQL을 세분화 서 집중적으로 학습하며 개발하면서 자주 보게되는 Schema Object(Table, Index, View, Sequence, Synonym, Store Procedure/Function)들에 대해 다루며 PL/SQL을 마스터 후 오라클의 힌트(Hint, Oracle Hint를 적절히 구사하면 데이터 검색 시 수분이상 걸리는 SQL문장을 수 초안에 데이터가 검색되도록 SQL튜닝 가능하죠^^, 개발자라면 꼭 알고 있어야 합니다!), 고급 SQL 사용법, 각종 인덱스에 대한 이해, 인덱스 활용법, 조인에 대한 학습을 하게 됩니다.

본 과정을 수료함으로써 개발자로서 SQL 사용에 대한 자신감 및 SQL SKILL을 향상시킬 수 있을 것 입니다.
교육목표 ○ SQL 기본 함수에 대한 이해
○ SQL 고급한수에 대한 이해
○ Join 및 Sub Query에 대한 이해
○ DML, DDL, DCL에 대한 이해
○ Oracle Index에 대한 이해
○ Oracle Schema Object 에 대한 이해(Table, View, Index, Trigger, DataBase Link, Sequence등)
○ Oracle Stored Program에 대한 이해
○ 인덱스를 선정하는 기준에 대한 이해
○ 효율적인 인덱스 운영 및 관리
○ B*Tree 인덱스의 단점을 보완하기 위한 기타 인덱스에 대해서 이해.
○ 대용량 데이터를 효율적으로 저장을 위한 구조에 대한 이해
○ 옵티마이저의 기능과 역할을 실행계획을 통해서 정확히 이해
○ INDEX생성, DRIVING TABLE의 ACCESS 순서 변경 및 HINT, 분석함수 등을 사용하여   SQL QUERY 의 응답 속도를 크게 향상 시킬 수 있다.
○ 조인방식에 대한 이해 및 CASE별 최적의 조인메카니즘을 이해
○ 본인이 작성한 SQL문에 대하여 옵티마이저의 작동 원리를 파악하고 실행계획을 분석 할 수 있다.
○ 현실 실무에서의 튜닝 사례를 설명하고 튜닝을 위한 명확한 실무 활용기준 가이드를 제시
교육대상 초보 개발자
SQL에 관심있는 개발자
DB전문가가 되기 위한 개발자
선수학습 데이터베이스에 대한 이해
 

1. INTRODUCTION 1. 관계형 데이터베이스
2. SQL 개요
3. 객체 관계형 데이터베이스
2. SELECT 기본 1. SELECT 구문의 기본 문형
2. 정렬 순서의 지정
3. 특정행의 조건 검색
3. SQL*PLUS 1. iSQL*Plus란?
2. SQL*Plus 접속
3. SQL*Plus 명령어
4. 변수설정
4. FUNCTION 1. 함수의 종류
2. 문자형 함수
3. 숫자형 함수
4. 날짜형 함수
5. 변환형 함수
6. 기타 함수
7. 그룹 함수
5. DATA GROUPING 1. SELECT 구문의 전체 문형
2. SUBGROUP으로 데이터 분류
3. GROUP된 데이터 조건 검색
4. ROLLUP과 CUBE를 이용한 데이터 집계
6. JOIN 1. Join 이란 ?
2. ANSI Join Syntax
3. 기타 Join
4. SET 연산자
7. SUBQUERY 1. Subquery의 개념
2. Singe Row Subquery
3. Multi Row Subquery
4. Multi Column Subquery
5. Scalar Subquery
6. Correlated Subquery
8. 데이터 조작어 1. 데이터의 조작 명령어
2. DML문에서의 Subquery
3. DML에서의 Transaction 관리
9. 데이터 정의어 1. 테이블 명명 규칙
2. Oracle의 데이터 타입
3. 테이블 생성
4. Constraint 설정
5. 데이터 정의어의 종류
6. 테이블 삭제
7. 테이블 구조 변경
8. 그 외의 DDL
10. 데이터 제어어 1. Database Security
2. Privileges
3. Role
11. VIEW 1. View의 개념
2. View 에 대한 DDL
3. View에 대한 DML
4. View의 활용
12. 기타 OBJECTS 1. Object의 종류
2. Sequence
3. Synonym
4. Index
5. Stored Program
13. 기타 SQL 관련 기능 1. Dictionary
2. Partitioning
3. 객체 개념을 사용한 테이블 생성
14. PL/SQL 개요 1. PL/SQL의 개요
2. 변수 선언
3. PL/SQL에서 SQL문 사용
15. PL/SQL - Programming 1. 제어문의 종류
2. Exception
3. Cursor
16. 고급SQL 1. 집계용 함수사용 ( ROLLUP,CUBE,GROUPINGSET)
2. 분석함수(Analytical Function) 사용
3. 순환관계처리 및 병렬처리
4. Oracle 정규표현식(Regular Expression)
17. 옵티마이저 이해 1. OPTIMIZER 이해
2. OPTIMIZER MODE
3. CBO의 이해
18. SQL 실행계획 분석 1. 실행계획 보기
2. 실행계획의 유형
3. 실행계획의 제어
4. HINT(힌트) 상세 설명
19. B-Tree 인덱스 활용 1. 인덱스 매칭율
2. 옵티마이저의 선택기준
20. 인덱스의 활용 1. B-Tree 인덱스를 사용하지 못하는 경우
2. Bitmap 인덱스의 이해
3. Reverse Key 인덱스
4.Function Based 인덱스(함수기반인덱스)
5.IOT(인덱스 일체형 테이블)
21. 대용량 데이터에 유용한 물리구조 1.CLUSTER
2.PARTITION
3.PARTITION 예제
4.Merge, Multi Table Insert, 외부 테이블
22. 조인에 대한 이해 및 활용 1.조인 원리의 파악 및 활용 비교
2.NESTED LOOP JOIN 원리
3.HASH JOIN 원리
4.SORT MERGE JOIN 원리
23. 조인 드라이빙 테이블의 선정 1.드라이빙 테이블의 중요성
2.조인 실행 경로 고정 사례
24. SQL튜닝 실전사례연구 1. 현장 사례연구
2. 성능에 도움되는 Analytic Function(분석함수) 활용
 








댓글 없음:

댓글 쓰기