개발자로 가는 길(국비지원과정)/1. Java

[210422목] 2차원 배열 + 거품정렬 알고리즘

레아Leah 2021. 4. 22. 08:35
반응형

[자바실행 순서]

자바 구동 → JVM(자바구동머신 Java Virtual Machine, 자바가 구동되기 위한 가상의 컴퓨터)

 

☆★메모리 

메소드(Method) 스택(Stack) 힙(Heap)

·스택(메모리 공간): 지역변수(Local Variable)가 저장되는 공간(일반적 변수)

  int a = 10;에서 a = 10;은 스택, int[][] ary = new int[5];에서 ary는 스택

-스택 영역의 지역변수는 초기화가 되지 않기 때문에 초기화를 안하면 에러가 난다. = 초기화를 해야 한다. 

-기초자료형들이 저장된다. 

-참조자료형 : 주소값을 가지고 있는 데이터는 스택에 ex) String, Array/ 값은 힙에 저장된다. 

 

·힙(Heap): 동적으로 할당되는 메모리 공간

- new를 가지고 만든 것들 int[] ary = new int[10];에서new int[10];부분 이부분은 초기화를 안해도 0으로 출력됨. 

-배열 ary는 스택 영역에 저장된다. 

- int[][] ary = new int[5];에서 new int[5]는 힙 영역

 

 

[2차원 배열] : 행 X 열 

- int[][] arr = new int[3][4]; 

0행 0열  0행 1열  0행 2열  0행 1열 
1행 0열  1행 1열  1행 2열  1행 3열 
2행 0열 2행 1열 2행 2열 2행 3열

int 데이터가 이 안에 들어감. 

int[][] a = new int[][];의 형태로 0행 0열, [0][0]부터 시작된다. 

 

 

 

[배열의 주소]

초록색이 의미하는 것은 주소값 

ar1의 주소가 알고 싶은 경우? System.out.println(ar1);

진짜 주소가 아닌 변형된 주소, 해시주소(해시코드: 형체를 알 수 없도록)를 알려줌. 

System.out.println(ar2[0][0]); 실제 데이터의 값 

배열의 경우, 값이 초기화되어 있지 않아도 기본값이 0으로 출력된다.  

 

 

 

 

[2차원 배열의 초기화]

int[][] ar2 = {{1,2,3,4},{5,6,7,8,},{9,10,11,12}};

행 3개, 열 4개 

{1,2,3,4}는 하나의 행 (방향→)

1행 1열의 값: 6

왜냐하면 첨자(인덱스)가 0행 0열부터 시작하기 때문! 

인덱스의 시작은 0부터인 것 잊지말기!

행과 열의 개수를 구할 때

행 개수 : ar2.length

열 개수 : ar2[i].length (왜 그런지 따질 것 없이 그냥 이게 이차원 배열의 열의 개수를 구하는 방법임.) 

 

2차원 배열에서 이중for문을 사용 가능! 

 

 

 

[2차원 배열을 이용해 전체 데이터 출력]

1,2차원 배열 모두 for문을 통해 전체 데이터를 출력할 수 있다. 

[printf와 "%d"를 이용해 예쁘게 정렬]

"%d" 사이의 숫자는 칸을 뜻함

"%4d " : 앞으로 4칸, 뒤로 한 칸 총 5칸 

 

 

 

[2차원 배열의 열의 개수가 같지 않을 경우]

잘 사용하지 않기 때문에 "가능하구나" 정도로 알고 가는게 좋다!

 

 

 

[문제. 출력결과과 다음과 같이 나오도록 for문과 이차원 배열을 이용하여 만들어라]

 

<내가 한 거>

배열에서 ++count를 어떻게 출력하는지 모르겠다. 

 

 

<깔끔 코드>

arr[i][j] = ++count;

 

바깥 쪽의 for문도 안쪽의 for문 명령문 하나, 안쪽의 for문도 명령문 하나이기때문에 {} 생략가능 

★이중 for문에서는 초기화와 출력 작업을 따로 하는 것을 추천한다.

 

(근데 내가 아직 for문을 이해못했나봄..)

이차원 배열을 값을 출력하고 싶을 때는 ary[i][j]라는 것 잊지 말기! 

 

 

 

 

[문제. 대각선, 행과 열의 첨자가 같을 경우에만 값 증가]

생각보다 어렵지 않으니 문제에서 주는 힌트를 잘 생각해보기!

내가 한거.. 너무 초라해ㅎㅎ

아하! 초기화와 출력을 따로~! 

0행 0열일 경우 ary[0][1] = ++count;로 +1

0행 0열 count= +1 =1 0행 1열 0행 2열 0행 3열 0행 4열
1행 0열 1행 1열 count = +1 +1=2 1행 2열 1행 3열 1행 4열
2행 0열 2행 1열 2행 2열 count = +1 +1 +1= 3 2행 3열 2행 4열
3행 0열 3행 1열 3행 2열 3행 3열 count = +1 +1 +1 +1 =4 3행 4열
4행 0열 4행 1열 4행 2열 4행 3열 4행 4열 count = +1 +1 +1 +1 +1 = 5

 

if(i=j)가 아니라 if(i==j)라고! 해야함. "="과 "=="의 차이를 잊지마세요~! 

 

 

 

[Random]랜덤하게 숫자를 발생시켜 넣는 방법 

더보기

import java.util.Random;

 

public class Prac0422 {

 

      public static void main(String[] args) {

 

           Random rand = new Random();

           int[] ary= new int[5];

 

          System.out.println(rand.nextInt());

       }

}

 

Scanner와 달리 new Random();의 괄호가 비어도 된다. 

출력할 때: System.out.println(rand.nextInt());

rand.nextInt(): 발생시킨 숫자, 정수 하나가 되돌아 옴. 

 

랜덤인 정수를 나타내지만 범위를 설정할 수 있다.

Random rand = new Random(); : 0을 포함한 자연수 

rand.nextInt(10): 조건인 10을 포함하지 않은 0~10까지! 

내가 발생시키고 싶은 숫자보다 하나 더 크게 범위 설정

 

 

 

[ary 0~99 사이의 값을 난수로 발생시켜 초기화]

☆난수: 특정한 순서나 규칙을 가지지 않은 수.

 

<내가 한 거>

(복습중.. 내가 도대체 왜 이중for문을 쓴거지?)

 

 

<깔끔 코드>

 

<따라해 본 거>

-초기화와 출력을 따로 한 것. 

-초기화와 출력을 같이한 것

Random rand = new Random();

ary[i] = rand.nextInt();를 사용한 거라 값이 같진 않지만 출력은 문제없이 두 경우 모두 됨! 

 

 

 

 

[Bubble Sort,  거품정렬]

특징 :

-데이터가 많아지면 많아질수록 성능이 안좋아진다. 

-뽀글뽀글 올라와서 뒤로 가는 정렬 

-정렬을 하는 이유: 검색할 때 빠르게 찾기 위해. 

 

int[] ary = new int[10];일 경우 거품정렬이 일어나면, 

1차 비교시 9번(인덱스 0~9까지)의 비교가 일어나고 오름차순으로 정렬이 되지 않았지만 맨 뒤(9번방)에 가장 큰 값이 있음. 

 

오름차순 : ASC

내림차수 : DESC

 

<혼자해본거>

어떤 값을 출력해야 하는 지 모르겠음;; 

 

 

1회차 비교: 양 옆의 값을 비교하는 것

 

이해 안되는 부분.. ↓ 열어보기 

더보기

int temp;

for(int j=0; j <ary.length-1; ++j) {

     if(ary[j] > ary[j+1]) 

         temp= ary[j];

         ary[j]= ary[j+1];

         ary[j+1] = ary[j];

}

* ary[j+1] = ary[j];가 왜 temp;가 아니고 ary[j]; 이게 오는 거지? 

 

 

 

밑으로 내려갈 수록 점점 오른쪽에 큰 값이 쌓임. 

0: 0~8

1 : 0~7

2 : 0~6

3 : 0~5

4 : 0~4

5 : 0~3

6 : 0~2

7 : 0~1

 

 

<깔끔한 코드>

밑으로는 과정임 

ary.length -1 -i  : 맨 앞의 인덱스가 늘어날 때, 뒤의 인덱스가 줄어들 때 사용

for(int i =0; i < ary.length-1; ++i)가 더 정확 

 

 

 

[얕은 복사]

temp = ary; //int[] 타입이 같기때문에 오른쪽의 값을 왼쪽으로 넘길 수 있음. 얕은 복사는 주소가 복사되는 것이다. 

ary의 주소와 temp의 주소가 같다는 말. 주소만 넘기는 것을 얕은 복사라고 한다.

int[] temp;

int[] ary; 

이렇게 데이터타입이 같을 경우, temp= ary; 얕은 복사를 하면 ary의 주소값이 temp로 넘어가는 것.

즉 temp가 ary과 같은 주소를 같는 것.  

 

[깊은 복사]는 다음 시간에 배울 거예요~! 

 

 

 

[오후 수업] 복습 겸 연습

[2차원 배열을 이용한 문제]

-값이 늘어나는 것 ++count 이용 

-한번은 정방향, 역방향 번갈아 가며 진행. 

 

 

<내가 짠 코드> (복습중인데 초기화랑 출력을 따로 하는 게 좋다고 함.)  

이것도 뭔가 이상함. 출력값은 저렇게 나왔지만 배열의 값을 출력하면 0으로 나옴.. 

아무튼 노력은 해보았다^^ 

 

if절만 써도 됨. i가 음수일 경우 값이 반대로 증가하는데 if(i%2 !=0)까지 하고 모르겠다. else는 안써도 될듯;;

for(int j=0; j < ary[j].length/2; j++) 이렇게 반복하려했는데 j가 위에 있어서 오류가 뜨는데 어떻게 하지? 

행은 고정인 상태에서 열만 변한다는 사실!  

 

 

문제 풀이팁 

0행 오른쪽, 1행 왼쪽, 2행 오른쪽, 3행 왼쪽, 4행 오른쪽  

행번호가 홀수일 경우 감소하도록

짝수일 경우 증가하도록

 

 

<깔끔 코드>

 

<카피>

과연 다시 할 수 있을까? 

행  i가 음수일 경우, 역방향으로 감. 

 

더보기

for(int j=ary[i].length-1; j>=0; --j) {

   ary[i][j]= ++count;

}

 

ary[1][0]

ary[1][1]

ary[1][2]

ary[1][3]

ary[1][4]

 

for(int j=ary[i].length-1; j>=0; --j)

j는 4부터 시작해 0까지

 

 

♠복습

-4월 25일 일요일 3시간 

반응형