반응형

 

**자바에서의 제어문

1.    분기문: if(조건에 의한 분기 - boolean), switch(값에 의한 분기- 정수, 문자열)

2.    반복문: while, do ~ while, for

3.    규칙

A.     제어문은 하나의 블록이어서 제어문 안에 만든 변수는 제어문 안에서만 사용이 가능

B.     제어문 내의 실행 문장이 하나의 명령어라면 {} 생략 가능

C.     제어문 안에 제어문을 포함할 수 있음

for(int i=0;i<10;i=i+1){

System.out.println(“i:” + i);        

}

               System.out.println(“i:” + i); //이 구문은 에러

 

           for (int i=0;i<10;i=i+1)

                       System.out.println(“i:” + i);

                       //이 경우 실행 명령어가 1개 이므로 {} 를 생략할 수 있음

                       //이 경우 들여쓰기를 정확하게 하지 않으면 코드의 가독성을 떨어뜨릴 수 있기 때문에 권장하지는 않음

 

수집 → 탐색 → 가공 → 알고리즘-모델 → 평가

작업할 때는 블록을 나눈다던가 파일을 나눈다던가 클래스를 나누는 등의 노력이 필요함.

프로그램의 유지보수를 위해서.

 

기타제어문

1.    Break

A.     swtich구문에서 switch 구문을 종료하거나 반복문에서 조건문과 함께 사용되서 반복문을 중단하는 역할을 수행하는 명령어

2.    continue

A.     반복문에서 조건문과 함께 사용돼서 다음 반복으로 넘어가는 역할을 수행하는 명령어

 

                       // 1부터 10까지 출력하는 구문

                       for (int i = 1; i < 11; i = i + 1) {

                                  // 4의 배수가 되면 반복문 중단 - 1, 2, 3 중단

                                  if (i % 4 == 0) {

                                              break;

                                  }

                                  System.out.println("i:" + i);

                       }

                       // 이클립스나 인텔리j를 사용할 땐 if줄만 없을 땐 에러로 표기 - 도달할 수 없는 코드

           System.out.println("=======================================");

                       for (int i = 1; i < 11; i = i + 1) {

                                  // 4의 배수가 되면 다음 반복으로 ㅇ동

                                  // 1, 2, 3, 5, 6, 7, 9, 10

                                  if (i % 4 == 0) {

                                              continue; // ~할 때는 빼고 ->이럴 때 사용할 수 있음

                                  }

                                  System.out.println("i:" + i);

                       }

           }

 

3.    Java에서는 반복문에 레이블을 설정할 수 있고 break continue를 할 때 뒤에 레이블을 붙이면 레이블이 반복문을 빠져나가거나 다음 반복으로 이동할 수 있다.

A.     C언어에는 go to가 있어서 특정한 레이블이 붙은 곳으로 바로 이동이 가능

B.     구조적 프로그래밍 기법에서 go to 사용을 배제하는 것을 권장

C.     java에서는 go to 사용을 배제하기 위해서 예약어지만 사용할 수 없도록 함

D.    여러 개의 반복문에서 break만으로 여러 개의 반복문을 빠져나가는 것이 복잡해졌다.

E.     반복문에 레이블을 붙일 수 있도록 함

 

                      i.        레이블 추가

레이블 : 반복문

                     ii.        레이블 사용

break 레이블;

                    iii.        레이블이 없는 경우는 가장 가까이서 만든 반복문을 중단

 

outer : for(int i=1 ; i<=10 ; i=i+1){

for(int j=1 ; j<=10 ; j=j+1){

if(j%3==0){

break; //바로 위 j 인자 for문만 빠져나온다

break outer; //break outer의 밖으로 나간다.

//여러 개의 반복문을 빠져나올 때 유용한 레이블

}

}

}

 

제어문 연습

1.    교번 처리

A.     일정한 패턴 반복, 나머지 연산자 이용

B.     ON OFF를 교대로 10번 출력

for(int i=0 ; i<10 ; i=i+1){

if(i%2==0){

System.out.println(“ON”);

}

else{

System.out.println(“OFF”);

}

}

2.    #동아일보에서 자바로 검색했을 때 총 데이터 건수는 1164개이고 url은 아래와 같은 형태, 페이지마다 p의 값이 15씩 증가

제어문을 이용해서 전체 데이터를 스크랩할 수 있는 url을 생성

먼저 구해야 하는 것은 전체 데이터 건수를 가지고 몇 번 반복문을 수행해야 하는지 찾아야 하고 반복문 안에서 url을 만들어주어야 한다.

http://www.donga.com/news/search?check_news=1&more=1&sorting=1&range=1&search_date=&query=%EC%9E%90%EB%B0%94

http://www.donga.com/news/search?p=16&query=%EC%9E%90%EB%B0%94&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1

 

http://www.donga.com/news/search?p=1&query=자바

http://www.donga.com/news/search?p=16&query=자바

http://www.donga.com/news/search?p=31&query=자바

 

                       // 첫 번째 페이지 URL

                       // http://www.donga.com/news/search?p=1&query=자바

                       // 각 페이지마다 기사가 15개씩 있어서 p의 값이 15씩 증가

                       // 총 데이터 건수는 1164

                       int total = 1164;

                       // 페이지 개수 만들 때는 나누어 떨어지지 않으면 몫+1

                       int pagesu = 1164 / 15;

                       if (total % 15 != 0) {

                                  pagesu = pagesu + 1;

                       }

                       for (int i = 0; i < pagesu; i = i + 1) {

                                  // 페이지 별 기사의 시작 번호

                                  int p = 15 * i + 1;

                                  // 기사의 url 만들기

                                  System.out.println("http://www.donga.com/news/search?p=" + p + "&query=자바");

 

                       }

 

3.    정수를 입력받아서 소수 판별하기

A.     소수(Prime): 2부터 자신의 절반이 되는 숫자까지 나누어서 한 번도 나누어 떨어지지 않으면 소수

 

                       //하나의 정수 입력받기

                       Scanner sc = new Scanner(System.in);

                       System.out.println("소수 판별할 정수 입력:");

                       int su = sc.nextInt();

                      

                       //소수 판별을 위한 플래그 변수 생성

                       boolean flag = false;

                       for(int i=2 ; i<=su/2 ; i=i+1) {

                                  //이 경우는 소수가 아님

                                  //조건을 만족한 경우 플래그 변수의 값을 변경

                                  if(su%i==0) {

                                              flag = true;

                                              break; //자주 쓰이는 표현 방식

                                  }

                       }

                      

                       //su가 소수인지 출력

                       if(flag == false) {

                                  System.out.println(su + "는 소수");

                       }

                       else {

                                  System.out.println(su + "는 소수가 아님");

                       }

                 sc.close();

 

4.    2-100까지 소수의 개수 구하기

 

                       // 4.2-100까지 소수의 개수 구하기

                       // 하나의 정수 입력받기

                       for (int i = 2; i <= 100; i++) {

                                  //소수 판별을 위한 플래그 변수 생성

                                  boolean flag = false;

                                  for(int j=2 ; j<=i/2 ; j++) {

                                              //이 경우는 소수가 아님

                                              //조건을 만족한 경우 플래그 변수의 값을 변경

                                              if(i%j==0) {

                                                         flag = true;

                                                         break; //자주 쓰이는 표현 방식

                                              }

                                  }

                                 

                                  //su가 소수인지 출력

                                  if(flag == false) {

                                              System.out.println(i + "는 소수");

                                  }

                                  else {

                                              System.out.println(i + "는 소수가 아님");

                                  }

            }

 

5.    반복문 2개를 이용한 별 출력

1개 출력: System.out.print(“*”)

줄바꿈: System.out.print(“\n”);

System.out.println(“”)’

*****

*****

*****

*****

*****

                      

 

           for(int i=0 ; i<5 ; i=i+1){

for(int j=0 ; j<5 ; j=j+1){

                                  System.out.print(“*”);

                       }

                       System.out.print(“\n”);

           }

 

 

 

 

           for(int i=0 ; i<5 ; i=i+1){

for(int j=0 ; j<i+1 ; j=j+1){

                                  System.out.print(“*”);

                       }

                       System.out.print(“\n”);

           }

 

 

 

 

           for(int i=0 ; i<5 ; i=i+1){

for(int j=0 ; j<5-i ; j=j+1){

                                  System.out.print(“*”);

                       }

                       System.out.print(“\n”);

           }

 

 

 

 

           for(int i=0 ; i<5 ; i=i+1){

for(int j=0 ; j<2*i+1 ; j=j+1){

                                  System.out.print(“*”);

                       }

                       System.out.print(“\n”);

           }

 

 

 

 

아래처럼 계속 하나의 패턴이 적용되는 것이 아니고 일정한 패턴이 적용되다가 다른 패턴이 적용되면 분할해서 구현

처음 3줄은 늘어나고 다음 2줄은 줄어드는패턴

 

           for(int i=0 ; i<5 ; i=i+1){

                       if(i<=2){

for(int j=0 ; j<i+1 ; j=j+1){

                                              System.out.print(“*”);

                                  }

}

                       else{

                                  for(int j=0 ; j<5-i ; j=j+1){

                                              System.out.print(“*”);

                                  }

}

System.out.print(“\n”);

           }

 

 

 

for (int i = 0; i < 5; i = i + 1) {

                                  for (int j = 0; j < 5; j = j + 1) {

                                              System.out.print("*");

                                  }

                                  System.out.print("\n");

                       }

 

           System.out.println("====================================");

                       for (int i = 0; i < 5; i = i + 1) {

                                  if (i <= 2) {

                                              for (int j = 0; j < i + 1; j = j + 1) {

                                                         System.out.print("*");

                                              }

                                  } else {

                                              for (int j = 0; j < 5 - i; j = j + 1) {

                                                         System.out.print("*");

                                              }

                                  }

                                  System.out.print("\n");

                       }

 

           }

 

 

하나의 정수를 입력받아서 아래처럼 출력하기

5를 입력한 경우

       0

1 2

     3  4

5     6

789012345

 

과제:

0앞에 공백이 4

1앞에 공백이 3개 그리고 12사이에 공백 1

3앞에 공백이 2개 그리고 3 4사이에 공백이 3

5앞에 공백이 1개 그리고 56사이에 공백이 5

아래쪽에는 숫자가 9개의 숫자를 출력

9다음의 숫자는 다시 0

 

                       /**

                        * 하나의 정수를 입력받아서 아래처럼 출력하기 5를 입력한 경우 0 1 2 3 4 5 6 789012345

                        *

                        * 과제: 0앞에 공백이 4 1앞에 공백이 3개 그리고 1 2사이에 공백 1 3앞에 공백이 2개 그리고 3 4사이에 공백이 3 5앞에

                        * 공백이 1개 그리고 5 6사이에 공백이 5개 아래쪽에는 숫자가 9개의 숫자를 출력 9다음의 숫자는 다시 0

                        */

                       // 키보드로 부터 데이터를 입력받기 위한 객체를 생성

                       Scanner sc = new Scanner(System.in);

                       System.out.println("하나의 정수 입력:");

                       int su = sc.nextInt();

                       int cnt = 0;

                       int max = 0;

                       for (int i = 0; i < su; i++) {

 

                                  // 왼쪽 채우기

                                  cnt = 0;

                                  for (int k = 0; k < su - i - 1; k++) {

                                              System.out.print("*");

                                              cnt = cnt + 1;

                                  }

                                  // 숫자

                                  if(max == 10) {

                                              max = 0;

                                  }

                                  System.out.print(max);

                                  cnt = cnt + 1;

                                  if(i != 0) {

                                              max = max + 1;

                                  }

 

                                  // 오른쪽 빈칸 채우기

                                  for (int j = 0; j < i * 2 - 1; j++) {

                                              if (i < su - 1) {

                                                         System.out.print("*");

                                                         cnt = cnt + 1;

                                              }

                                  }

                                 

                                  // 오른쪽 숫자 계산

                                  if (i != 0) {

                                              if(max == 10) {

                                                         max = 0;

                                              }

                                              System.out.print(max);

                                              cnt = cnt + 1;

                                  }

                                 

                                  //아래 줄 숫자 계산

                                  max = max + 1;

                                  if(cnt != su + i ) {

                                             

                                              outer:for(;;) {

                                                         if(max == 10) {

                                                                     max = 0;

                                                         }

                                                         System.out.print(max);

                                                         max++;

                                                         cnt = cnt + 1;

                                                         if(cnt == su+i) {

                                                                     break outer;

                                                         }

                                              }

                                  }

                                  System.out.println("");

                                 

                       }          

                 sc.close();

 

 

Array(배열)

      동일한 자료형으로 구성된 데이터의 연속적인 집합

      참조형으로 heap(메모리 할당을 하고 프로그래머가 메모리 해제를 할 수 있는 공간)에 생성

      참조형이므로 변수는 데이터의 시작위치를 의미함.

1.     배열을 사용하는 이유: 관리의 편리성 때문

편리한 관리

A.     3명의 점수를 저장해야 하는 경우

B.     이 때 배열이 없다면 3개의 변수를 만들어서 각각 저장

C.     배열을 이용하면 하나의 이름으로 저장해서 관리 가능

2.     배열 생성

A.     처음부터 데이터가 존재하는 경우

배열 요소의 자료형[] 배열이름 = {데이터를 나열};

이 때 []는 배열이름 다음에 입력해도 되는데 대부분 앞에 기재

B.     데이터가 존재하지 않아서 크기만 먼저 만드는 경우

배열 요소의 자료형[] 배열이름 = new 배열 요소의 자료형[개수];

개수만큼 저장할 수 있는 공간을 만들고 기본값으로 채움

Booleanfalse로 숫자 데이터는 0으로 채워지고 참조형은 null로 채워짐.

C.     배열은 한 번 만들면 크기가 변경되지 않는다.

3.     배열 요소의 접근

A.     배열이름[인덱스] 형태로 접근해서 읽고 쓰기를 한다.

B.     인덱스는 0부터 시작한다.

C.     배열이 만들어지지 않은 상태에서 데이터에 접근하면 NullPointerException 발생

D.     배열의 인덱스 범위를 넘어서면 ArrayIndexOutOfBoundsException 발생

E.     배열의 데이터 개수 확인은 .length 를 호출

4.     참조형에서 메모리 해제

A.     가리키고 있는 변수가 없으면 Garbage Collection이 알아서 메모리 해제

B.     보통은 사용이 끝나면 null을 대입해주면 나중에 자동으로 해제된다.

 

//초기 값을 가지고 문자열 배열을 생성

                       String [] strAr = {"발렌수엘라", "클레멘테", "루게릭"};

                      

                       //데이터 1개 출력 - 0번째 데이터 출력

                       System.out.println(strAr[0]);

                      

                      System.out.println("===========================");

                      

                       //데이터 전체 출력

                       //배열이름.length는 배열의 데이터 개수를 정수로 리턴

                       for(int i=0 ; i<strAr.length ; i=i+1) {

                                  System.out.println(strAr[i]);

                      }

                      

                      System.out.println("===========================");

 

                       //배열을 기본값으로 만들고 나중에 데이터를 채우기

                      

                       //참조형 변수가 생성된 것인지 데이터가 만들어진 것은 아니어서 NullPointerException

                       /*

                       String [] homerunHitters = null;

                       System.out.println(homerunHitters[0]);

                       */

                      

                       String [] homerunHitters = new String[3];

                       //공간만 할당받은배열에 데이터 채우기

                       homerunHitters[0] = "김봉연";

                       homerunHitters[1] = "이만수";

                       homerunHitters[2] = "김성한";

                       //ArrayIndexOutOfBoundsException 발생

                       //homerunHitters[3] = "김성래";

                      

                      

                       //반복문 안에서 동일한 참조형 내부 테이터를 접근하는 것은 비효율적

                       for(int i=0 ; i<homerunHitters.length ; i=i+1) {

                                  System.out.println(homerunHitters[i]);

                 }

5.     배열을 생성하고 배열의 데이터를 접근하고 출력한 후 메모리 해제

6.     배열은 빠른 열거(Iterator) 형태로 접근 가능

A.     for(임시변수 : 배열) {

임시변수를 이용하면 배열의 모든 요소를 순서대로 하나씩 접근 가능

}

7.     배열의 데이터를 전부 접근하는 경우에는 빠른 열거가 효율적이고 일반적인 반복문을 이용할 때는 데이터의 개수를 반복문 바깥에서 임시변수에 저장하고 접근하는 것을 고려

 

기본형 – Scala data

참조형 – Vector data

 

 

 

 

 

 

 

기본형   

           scala data

참조형  vector data

기본형 -> data

참조형 ->시작 주소 ->[0]

                          ->이름

li = [10,20]

print(li) -> li.__str__ =>참조형이다.

li.시작위치 가르킨다.

참조형은 데이터 쫓아다닐 때 한 번 더 가야한다.

String[] names= {"지지히","고슬링"}

for (int i = 0;i < names.length; i++){

           System.out.println(names[i])

}

names 시작주소 ---------->0

                       [0] 지지히

                       [1] 고슬링

                       length 2

i : 0 -> i < names.length  i < length 2

           지지히

           고슬링

            다시 for i = 2

                       len ->2

int len = names.length; -> 결과는 같지만 안의 원리는 좀 다르게 한다.

i< len

i - 0 1 2  지지히

            고슬링

length 2

len -> 2바로 접근이 가능하다. 하지만

names.length 참조형으로 가면 한번 더 쫓아가야 한다.

참조형은 한번 더 쫓아야 한다.

반복문에서 참조형으로 간다면 한 번 더 쫓아야 한다.

그래서 빼놓고 참조 한번 덜 해도 된다.

자주 사용 참조형의 내부의 데이터는 기본적으로 내부의 데이터를 저장해두고 사용하는 것이 효율적이다.

자주 넣어서 사용

 

Stirng [] names = {“리치히”, “고슬링”};

for(int i=0 ; i<names.length ; i=i+1){

           System.out.println(names[i]);

}

 

 

바꾸는 것이 좋다. -> 에러가 있어서 바꾸는 것은 아님

int len = names.length;

for(int i=0 ; i<len ; i=i+1){

           System.out.println(names[i]);

}

 

 

len을 기본형 변수에 저장해 놓으면 한 번 저장 후 계속 사용할 수 있지만

참조형으로 가게 되면 반복문 안에서 동일한 참조형의 데이터를 계속 반복한다.

 

기본형에 저장해놓으면 참조를 한 번 덜하게 된다.

자주 사용하는 참조형 내부의 데이터는 기본형으로 저장해두고 사용하는 것이 효율적이다.

 

                      

                       //참조형 내부 데이터를 기본형으로 저장하고 반복문 안에서 기본형의 데이터를 접근

                       //두번째 접근 부터 메모리 접근 횟수가 줄어듬

                       int len = homerunHitters.length;

                       for (int i = 0; i < len; i++) {

                                  System.out.println(homerunHitters[i]);

                       }

                      

                      System.out.println("===========================");

                       //빠른 열거를 이용한 접근

                       //데이터의 시작과 끝을 직접 작성하지 않기 때문에 Index오류를 일으키지 않게 됩니다.

                       for(String temp:homerunHitters) {

                                  System.out.println(temp);

                       }

*불필요한 참조문의 사용은 줄이는 게 좋다.

           public static void main(String[] args) {

                       Scanner sc = new Scanner(System.in);

                       System.out.print("출력할 라인 수:");

                       int line = sc.nextInt();

                      

                       for(int i=0 ; i<line ; i=i+1) {

                                  for(int j=0 ; j<10 ; j=j+1) {

                                              System.out.print(j);

                                  }

                      

                       }

                                             

                       sc.close();

 

           }

 

 

 

 

 

8.다차원 배열

=>배열의 차원이 2개 이상인 배열

=>배열이 모여서 새로운 배열을 만드는 것

1)2차원 배열 생성

=>초기값을 가지고 생성

배열 요소 1개의  자료형 [][] 배열이름 = {{데이터 나열},{데이터 나열}...}

 

=>메모리 할당을 한 후 나중에 데이터를 채우는 방법

모두 도일한 크기로 생성 :모든 행의 열 개수를 동일하게 생성

배열 요소 1개의 자료형 [][] 배열이름 = new 배열 요소의 자료형[행의 개수][];

배열이름[행번호] = new 배열 요소의 자료형[열의 개수];

배열이름[행번호] = new 배열요소의 자료형[열의 개수];

....

 

2)배열의 데이터 접근

2차원 배열의 경우 데이터 1개 접근 :배열이름[행번호][열번호]

행에 해당하는 배열의 접근:배열이름[행번호]

 

3)length

배열이름.length:행 개수

배열이름[행번호].length:행 벚ㄴ호에 해당하는 배열의 열 개수

 

4)빠른 열거 사용 가능

for(배열요소의 자료형 임시변수:이차원배열){

           각 행에 해당하는 배열이 임시변수에 대입

}

 

5)이차원 배열을 생성하고 인덱스를 이용해서 접근해보고 빠른 열거를 이용해서 접근

                       // 초기 데이터를 가지고 이차원 배열 생성

                       //자료형 [][] 배열이름 = {{데이터 나열},{데이터 나열}...}

                       //String [][] 배열이름 = {{"이종범","윤석민","안치흥"},{"박병호","김하성","이정후"}...}

                       //2차원이면 행열이라고 보면된다.

                       String [][] players = {{"이종범","윤석민","안치흥"},{"박병호","김하성","이정후"}};

                      

                       //인덱스를 이용해서 배열의 모든 데이터 접근

                       //행의 개수를 가져오기

                       int rowCnt = players.length;

                       for (int i = 0; i < rowCnt; i++) {

                                  //각 형 별 열의 개수 가져오기

                                  int colCnt = players[i].length;

                                  for (int j = 0; j < colCnt; j++) {

                                              System.out.println(players[i][j]+"\t");

                                  }

                                  System.out.println("\n");

                       }

                      

                       //빠른 열거를 이용한 접근

                       System.out.println("=================");

                       //for(임시변수:Collectioon) {

                       //이차원 배열을 일차원 배열로 접근

                       for(String[] row:players) {

                                  //일차원 배열 내의 데이터를 열 단위로 접근

                                  for(String col : row) {

                                              System.out.println(col+"\t");

                                  }

                                  System.out.println("\n");

                       }

                      

                       //2차원 배열 중에서 모든 행의 열 개수가 동일하다면 하나의 반복문으로 모든 데이터에 접근 가능

                       //players배열 처럼 모든 행의 열 개수가 3개로 동일하다면 하나의 반복문으로 접근에 가능

                      

                       //전체 데이터 개수를 구한 후 열의 개수를 이용하면 됨

                      

                       //전체 데이터 개수

                       int tot = players.length * players[0].length;

                       //하나의 행에 해당하는 열의 갯

                       int colCnt = players[0].length;

                       for(int i = 0; i < tot; i++) {

                                  System.out.println(players[i/colCnt][i%colCnt] +"\t");

                                  if(i %colCnt == colCnt -1) {

                                              System.out.println("\n");

                                  }

                       }

 

 

3배열 연습문제

1)    1-45까지의 서로 다른 정수를 일차원 배열의 저장 6개 입력받아서

 

 

 

 

int[] ar = {40,37,51,65,29}

합계

개수

평균: medain평균 python에서는

 

 

정렬 :데이터를 순서데로 나열하는 것

1).보기좋게 출력하기 위해서

2).검색을 빨리 하기 위해서

 

배열 제어문

평균 mode->대표값

91 90 92 89 88: 평균 90

100 100 100 100 60 : 평균 90으로 할 수 없다.

생활비:

210 190 180 300 2000

평균 1/4 중앙값 3/4 최대값  차이나는 경우 차이가 많이 나면 조건문 써서 빼야 한다.

python은 참조형만 가능 ->null가능

java, c  기본형 ->null이 안된다. null들어가지 못한다.           nullpointerException

           참조형

AverageSum.java

BasicAlgorithm.java

MinMaxProblem.java

 

2)합계 문제:

1.합계를 저장할 변수를 생성하고 합계를 계산하기 전에 가져야 하는 값으로 초기화

0으로 초기화 조심해야 한다.

계산하기 전으로 가서 데이터 확인 하는게 좋다. 0이 아닐 수 도 있다.

2.합계를 저장할 변수에 합을 구할 데이터를 더해주면 됩니다.

int [] ar = {40,37,51, 65, 29}

int sum = 0;

for (int data: ar){

           sum = sum+ data;

}

System.out.println("합계:" +sum )

 

*조건에 맞는 데이터 개수:

1.데이터 개수를 저장할 변수를 초기화

2.조건에 맞는 경우에만 데이터 개수 변수를 1증가

//50이 넘는 데이터의 개수

int cnt = 0;

for(int data:ar){

           if(data > 50){

                       cnt = cnt+1;

           }

}

System.out.println("50이 넘는 데이터 건수:"+cnt);

 

*조건에 맞는 데이터 평균

1.조건에 맞는 데이터의 합계와 개수를 구한다.

2.합계/개수

개수가 0이 나오는것 개수가 0이면 ArithmeticException

10

20

-       ->error

30

정수 /정수는 정수

//30이 넘는 데이터의 평균을 소수 첫째자리에서 반올름

                       //조건에 맞는 데이터 합계

                       cnt = 0;

                       sum = 0;

                       for (int data : ar) {

                                  if (data > 30) {

                                              cnt  = cnt+1;

                                              sum = sum+data;

                                  }

                       }

                      

                       if(cnt ==0) {

                                  System.out.println("조건을 만족하는 데이터 없음");

                       }else {

                                  double avg = (double)sum/cnt;

                                  int result = (int)(avg+0.5);//반올림

                                  System.out.println("평균:"+result);

                       }

 

*최대/최소 ->scalar작업

minmaxScalar standardScalar->표준 정규분포

데이터의 분포가 범위가 다를 경우

최대값으로 데이터를 나누어서 표준화 하기도 함

국어 영우 수학

..............................

이렇게 점수가 있는데 점수분포도가 다를 경우

데이터 표준화 범위 분포 결과는 외곡될 수 있다.

1.최대값

1) 최대값을 저장할 변수를 만들고 배열의 첫번째 데이터나 데이터의 범위 중에서 가장 작은 데이터로 초기화

2) 최대값과 모든 데이터를 비교해서 최대값보다 큰 데이터를 만나면 최대값을 그 데이터로 변경

int max = ar[0]; ->데이터를 모른다면 첫번째 데이터로 초기화한다. 모든 데이터와 비교

                       for (int data : ar) {

                                  if(data > max) {

                                              max = data;

                                  }

                       }

                       System.out.println("최대값:"+max);

 

2.최소값

1) 최소값을 저장할 변수를 만들고 배열의 첫번째 데이터나 데이터의 범위 중에서 가장 큰 데이터로  초기화

2) 최소값과 모든 데이터를 비교해서 최소값보다 작은 데이터를 만나면 최소값을 그 데이터로 변경

문장의 유사도 분석이나 분류및 균집에서 사용 shortest path

거리계산 등 최소값 많이 사용한다.

                       //최소값

                       int min = ar[0];

                       for (int data : ar) {

                                  if(data < min) {

                                              min = data;

                                  }

                       }

                       System.out.println("최소값:"+min);

 

오름차순           내림차순

50에서 가장 가까운 수 찾가

10  13   1  15  21

40  37  51  65  29

{10,30} {20,40} 2차원 배열

{10,10} =>가장 가까운 점

2가지 방법으로 짧은 거리를 찾는다.

1.방법

 

 

 

 

 

 

 

  

 

 

3.배열 연습문제

1)1-45까지의 서로 다른 정수를 6개 입력받아서 일차원 배열에 저장

                       // 키보드로부터 데이터를 입력받기 위한 객체를 생성

                       Scanner sc = new Scanner(System.in);

 

                       // 1-45 까지의 정수 6개를 저장할 자료구조를 생성

                       int[] lotto = new int[6];

 

                       // 6번 반복

                       for (int i = 0; i < 6; i = i + 1) {

                                  // 정수를 입력받아서 su에 저장

                                  System.out.print(i + "번째 숫자:");

                                  int su = sc.nextInt();

                                  // 1부터 45까지의 숫자만 저장하고 그 이외의 경우는 다시 입력하도록 하기

                                  if (su < 1 || su > 45) {

                                              System.out.print("1-45 사이만 입력하세요\n");

                                              // 이번 입력은 무효

                                              i = i - 1;

                                              // 아래로 내려가지 않고 다음 반복으로 넘어가기

                                              continue;

                                  }

 

                                  // 데이터 중복 검사

                                  if (i > 0) {

                                              boolean flag = false;

 

                                              // 첫번째 데이터부터 현재 입력할 데이터 앞 까지 비교

                                              for (int j = 0; j < i; j = j + 1) {

                                                         // 현재 입력받은 데이터와 이전에 입력 받은 데이터가 같은지 비교

                                                         if (lotto[j] == su) {

                                                                     flag = true;

                                                                    System.out.print("중복된 데이터입니다. 다시 입력해주세요\n");

                                                                     // 더 이상 비교할 필요가 없음

                                                                     break;

                                                         }

                                              }

 

                                              // 이전 데이터와 동일한 데이터를 만나면 다시 입력받도록 작성

                                              if (flag == true) {

                                                         i = i - 1;

                                                         continue;

                                              }

                                  }

 

                                  // 입력받은 데이터를 배열에 저장

                                  lotto[i] = su;

                       }

 

                       // 입력받은 데이터 출력

                       for (int temp : lotto) {

                                  System.out.print(temp + "\t");

                       }

 

                       sc.close();

 

2)합계 문제

                       //합계를 구할 때 합을 저장할 변수를 규칙이 성립되기 전 또는 합을 구하기 전까지의 값으로 초기화

                      

                       int [] ar = {30, 47, 51, 27, 38};

                       int sum = 0;

                       for(int data : ar) {

                                  sum = sum + data;

                       }

                       System.out.print("합계:" + sum);

                      

                       //피보나치 수열

                       //1,1,2,3,5,8,13,21,34,55,89,....

                       //피보나치 수열은 첫번째 와 두번째는 무조건 1 세번째 부터는 이전 2개 항의 합

                       //입력받은 정수의 항 까지 피보나치 수열의 합을 구하시오.

                      

                       Scanner sc = new Scanner(System.in);

                      

                       System.out.print("합을 구할 항의 번호:");

                       int su = sc.nextInt();

                       if(su == 1) {

                                  System.out.print("합은 1\n");

                       }else if(su == 2) {

                                  System.out.print("합은 2\n");

                       }else {

                                  //두번째 항 까지는 규칙이 적용되지 않기 때문에 미리 합계를 구해놓아야 합니다.

                                  sum = 2;

                                  //현재 항의 두번째 이전 데이터를 저장할 변수

                                  int f2 = 1;

                                  //현재 항의 첫번째 이전 데이터를 저장할 변수

                                  int f1 = 1;

                                  //현재 계산될 항

                                  int f = 2;

                                  for(int i=3; i<=su; i=i+1) {

                                              sum = sum + f;

                                             

                                              //현재 피보나치 수열의 값을 계산하는 방법

                                              f2 = f1;

                                              f1 = f;

                                              f = f1 + f2;

                                  }

                                  System.out.print("합은 " + sum);

                       }

                      

                      

                       sc.close();

 

3)최대 최소 문제

                       int [] ar = {30, 47, 51, 27, 38};

                       //위 배열에서 최대값 구하기

                       int max = ar[0];

                       for(int data : ar) {

                                  if(max < data) {

                                              max = data;

                                  }

                       }

                       System.out.print("최대값:" + max + "\n");

                      

                       //위의 데이터 배열에서 40과 가장 가까운 수 찾기

                       //40과의 차이가 최소인 데이터 찾기

                      

                       //첫번째 데이터와 40이 차이 계산하기

                       //차이는 음수가 나올 수 없으므로 음수가 나오면 -1을 곱해서 양수로 만들기

                       int chaMin = ar[0] - 40;

                       if(chaMin < 0) {

                                  chaMin = chaMin * -1;

                       }

                       //차이가 가장 작은 데이터의 값을 저장할 변수

                       int first = ar[0];

                      

                       //데이터 순회

                       for(int data : ar) {

                                  //40과의 차이 계산

                                  int cha = data - 40;

                                  if(cha < 0) {

                                              cha = cha * -1;

                                  }

                                  //차이가 최소인 데이터 찾기

                                  if(chaMin > cha) {

                                              //차이의 최소를 chaMin에 저장

                                              chaMin = cha;

                                              //차이가 최소인 데이터를 fisrt에 저장

                                              first = data;

                                  }

                       }

                      

                       System.out.print("40과 가까운 수:" + first + "\n");

                       /*

                       //두 점 사이의 거리 계산

                       (x1, y1), (x2, y2)

                       =>(x1 - x2)제곱 + (y1-y2)제곱 의 제곱근을 구하는 거리 계산 방법이 있는데 유클리디안 거리

                       =>(x1 - x2)절대값 + (y1 - y2)절대값 의 형태로 거리 계산하는 방법을 맨하탄 거리라고 합니다.

                       */

 

git이용방법

 

**github url

https://github.com/아이디/레포지토리이름

 

github에서 java applicatiaon project가져오기

=>[url]을 복사

=>[File]->[Import]-[git]-[clone a Uri]를 선택

반응형

'Study > Java' 카테고리의 다른 글

java-6  (0) 2020.09.26
java-5  (0) 2020.09.24
java-4  (0) 2020.09.22
java-2  (0) 2020.09.20
java-1  (0) 2020.09.19
반응형

03-1 검색 알고리즘 

검색과 키

그 주목하는 항목을 키(key)라고 하겠습니다.

 

배열에서 검색 

1. 선형 검색: 무작위로 늘어놓은 데이터 모임에서 검색을 수행합니다.

2. 이직 검색: 일정한 규칙으로 늘어놓은 데이터 모임에서 아주 빠른 검색을 수행합니다.

3. 해시법: 추가 , 삭제가 자주 일어나는 데이터 모임에서 아주 빠른 검색을 수행합니다.

  체인법: 같은 해시 값의 데이터를 선형 리스트로 연결하는 방법

  오픈 주소법: 데이터를 위한 해시 값이 충돌할 때 재해시하는 방법

 

03-2 선형 검색 linear search sequential search

요소가 직선 모양으로 늘어선 배열에서의 검색은 원하는 키 값을 갖는 요소를 만날 때 까지 맨앞부터 순서대로

요소를 검색하는 것

static int seqSearch(int[] a, int n , int key){

  int i = 0

  while(true){

    if(i == n)

      return -1;

    if (a[i] == key)

      return i;

    i++;

  } 

}

 

int[] x = new int[num];

 

무한 루프의 구현 

while(true){
}
for(;;){
}
do{
}

보초 sentinel method

이 비용을 반으로 줄이는 방법 

static int seqSearch(int[] a, int n , int key){

  int i = 0

  a[n] = key;

  while(true){

    if (a[i] == key)

      break;

    i++;

  } 

  return i == n ? -1 : i ;

}

 

int[] x = new int[num+1];

 

03-3 이진검색 binary search

요소가 오름차순 또는 내림차순으로 정렬된 배열에서 검색하는 알고리즘입니다.

맨 앞 인데스를 pl , 맨 끝 인덱슬르 pr, 중앙 인덱스를 pc

초기화 pl = 0, pr = n-1, pc = (n-1)/2

1. a[pc] < key 

a[pl] ~ a[pc]는 제외 , 검색 범위는 중앙요소 a[pc]보다 뒤쪽의 a[pc+1] ~ a[pr]

pl값을 pc+1로 업데이트 한다.

2. a[pc] > key 

a[pc] ~ a[pr]는 제외 , 검색 범위는 중앙요소 a[pc]보다 뒤쪽의 a[pl] ~ a[pc-1]

pr값을 pc-1로 업데이트 한다.

이진 검색은 검색을 반복할 때 마다 검색 범위가 절반이 되므로 검색에 필요한 비교 횟수의 

평균값은 log n이다.

이진 검색 알고리즘은 검색 대상(배열)되어 있음을 가정합니다.

 

static int binSearch(int[] a, int n , int key){

  int pl = 0

  int pr = n-1;

  do{

    int pc = (pl+pr)/2;

    if (a[pc] == key)

      return pc;

    else if(a[pc] < key)

      pl = pc+1;

    else 

      pr = pc -1 

  }while(pl <= pr);

  return -1;

}

 

복잡도 

알고리즘의 성능을 객관적으로 평가하는 기준을 복잡도 (complexity)라고 합니다.

1. 시간 복잡도 time complexity: 실행에 필요한 시간을 평가하는 것

2. 공간 복잡도 space complexity : 기억 영역과 파일 공간이 얼마나 필요한가를 평가 하는 것 

 

선형 검색의 시간 복잡도  O(n)

평균 실행 횟수는 n/2입니다.

 

 이진 검색의 시간 복잡도 

static int binSearch(int[] a, int n , int key){

  int pl = 0

  int pr = n-1;

  do{

    int pc = (pl+pr)/2;

    if (a[pc] == key)

      return pc;

    else if(a[pc] < key)

      pl = pc+1;

    else 

      pr = pc -1 

  }while(pl <= pr);

  return -1;

}=>O(log n)

 

Arrays.binarySearch에 의한 이진 검색 

binarySearch

장점 1 . 이진 검색 메소드를 직접 코딩할 필요가 없다.

장점 2 . 모든 자료형 배열에서 검색 할 수 있다.

 

검색에 성공한 경우 : key와 일치하는 요소의 인덱스를 반환

검색에 실패한 경우 x라고 할 떄 -x-1

 

기본 자료형 배열에서 binarySearch메소드로 검색하기

 

 

클래스 메서드와 인트턴스 메서드

인스턴스 메서드 (비정적 메서드) static붙이지 않고 선언한 메소드

클래스 메서드(정적 메서드) static 을 붙여 선언한 메소드

둘의 차이점은 메서드가 인스턴스에 포함되는지'의 여부에 있습니다.

 

자연 정렬 : 사람에게는 오른쪽 형태의 정렬이 더 자연스럽습니다. 바로 이 정렬을 자연 정렬 이라고 한다.

 

 

파라미터 이름 작성 :

1. 1개의 대문자를 사용합니다.(소문자는 가급적 사용하지 않습니다.)

2. 컬렉션의 자료형은 element의 앞글자인 E를 사용합니다.

3. 맵의 키 , 값은 key와 value의 앞글자인 K와 V를 사용합니다.

4. 일반적으로는 T를 사용합니다.

 

 

출처 : Do it ! 자료구조와 함께 배우는 알고리즘 입문 자바편

 

반응형
반응형

02-1 배열

자료구조 data structure : 데이터 단위와 데이터 사이의 물리적 또는 논리적인 관계

 

배열 array 

배열은 같은 자료형의 변수로 이루어진 구성요소component가 모인 것입니다.

 

구성요소

구성 요솟수(길이)

 

배열의 구성 요소는 자동으로 0으로 초기화 되는 규칙이 있습니다.

 

배열의 복제 

a.clone()

 

주사traverse: 배열의 요소를 하나씩 차례로 살펴보는 과정을 알고리즘 용어 

 

Random클래스의 인스턴스는 일련의 의사 난수를 생성합니다.

난수는 무에서 생성되는 것이 아니라 seed이라는 수의 값을 바탕으로 여러 연산을 수행하여 얻습니다

 

배열 a의 최댓값 구하기

static int maxOf(int[] a){

  int max = a[0];

  for (int i = 1; i < a.length;i++)

    if (a[i] > max)

      max = a[i];

  return max;

}

 

배열 요소를 역순으로 정렬하기 

 

static void swap(int[] a, int idx1, int idx2){

  int t = a[idx1];

  a[idx1] = a[idx2];

  a[idx2] = t;

}

 

static void reverse(int[] a){

  for(int i = 0; i <a.length/2; i++)

    swap(a, i, a.alength-i-1);

}

 

두 배열의 비교

static boolean equals(int[] a, int[] b){

  if(a.length != b.length)

    return false;

  for (int i = 0; i < a.length;i++)

    if(a[i] != b[i])

      return false;

 

  return true;

}

 

기수 변환

정수값을 임의의 기수로 변환하는 알고리즘 

기수: 수를 나타내는데 기초가 되는 수

서수 사물의 순서를 나타내는 수 

static int cardConvR(int x, int r, char[] d){

  int digits = 0;

  String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

 

  do {

    d[digists++] = dchar.charAt(x%r);

    x /= r;

   }while(x != 0);

   return digits;

}

 

전위형 증가 연산자 ++a

++를 앞에 놓으면 식 전체를 평가하기 전에 피 연산자의 값을 증가시킵니다.

후위형 증가 연산자 a++

++를 뒤에 놓으면 식 전체를 평가한 후에 피연산자의 값을 증가시킵니다.

 

다차원 배열: 

int[][] x = new int[2][4]

2행 4열

 

서기 year년은 윤년인가?

static int isLeap(int year){

  return (year % 4 == 0 && year $ 100 != 0 || year % 400 == 0 ) ? 1:0;

}

 

02-2클래스

클래스: 여러 형의 요소를 조합하여 만든 자료구조 

필드 filed데이터 요소

 

공개클래스 : 클래스 접근 제한자 public을 붙여 선언한 클래스로 , 다른 패키지에서 사용할 수 있는 것

final 클래스 : 클래스 접근 제한자 final을 붙여 선언한 클래스로 , 서브 클래스를 가질 수 없습니다. 

(새로운 클래스를 상속할 수 없습니다.)

파생클래스 :

  direct superclass

  direct subclass

 

추상클래스 : abstract

 

중첩클래스 : nested class

 

 

출처 : Do it ! 자료구조와 함께 배우는 알고리즘 입문 자바편

 

반응형

' > Do it! 자료구조와 함께 배우는 알고리즘 입문 자바편' 카테고리의 다른 글

07. 집합 08. 문자열 검색  (0) 2020.09.13
06. 정렬  (0) 2020.08.30
04. 스택과 큐 05. 재귀 알고리즘  (0) 2020.08.27
03. 검색  (0) 2020.08.25
01. 기본 알고리즘  (0) 2020.08.22

+ Recent posts