본문 바로가기

Programming/Java

[JAVA 스터디] 250117 2차원배열

 

- 오늘의 학습 키워드

  • 2차원 배열, 배열 초기화 

 

2차원 배열을 실제로 사용하는 방법에 대해서 알아보도록 하자.

여기에서는 다른 방식으로 선언하는 방법과

2차원 배열에 값을 저장하고 출력하는 방법에 대해서 알아보려고 한다.

 

목표 : 2차원 배열에 값을 저장하고 출력하는 방법을 이해하고 사용할 수 있다.

 

1. 2차원 배열에 값을 저장

 

2차원 배열을 선언도 해봤고 구조도 어떻게 되어 있는지 알아봤으니

이제 값을 저장하고 가져오는 방법에 대해서 알아보도록 하자.

먼저 저장하는 방법이다.

예시를 위해 2차원 배열을 만들어보자.

 

예시1)

char[][] charArr = new char[4][2];

 

이번에는 char타입의 2차원 배열을 선언해 보았다.

구조는 앞에서 살펴봤던 2차원 배열의 구조와 거의 흡사하니 이 전의 글을 참고하길 바란다.

이제 선언을 했으니 이 배열에 값을 저장해보자.

 

1차원 배열에서도 알아봤지만

배열에 값을 저장하기 위해선 인덱스가 필요하다.

방 번호가 필요하다는 것이다.

그런데 1차원 배열과 조금 다른 점이 있다면

2차원 배열은 인덱스가 2개가 필요하다.

코드부터 살펴보자

 

예시2)

charArr[0][0] = 'c';

charArr[1][2] = 'd';

charArr[3][0] = 65;

 

이러한 형태로 2차원 배열에 값을 저장할 수 있다.

물론

 

charArr[0] = 'c';

 

이나

 

charArr = 'e';

 

와 같이는 사용할 수 없다.

이는 주소를 저장하고 있는 장소이기 때문에 실제 값을 저장할 수는 없다.

1차원 배열과 마찬가지로 [ ] 안에 인덱스 번호를 적는데

2차원 배열 [ ]가 하나 더 늘어났을 뿐이다.

그런데 이런식으로 하나하나 입력해도 되지만 여기에서 반복문을 사용해서

값을 저장할 수 있고 또 그렇게 하는 것이 편리하다.

그런데 2차원 배열에서는 일반 반복문이 아니라 중첩 반복문을 사용해야한다.

즉, 배열이 늘어날 수록 반복문도 그만큼 중첩해서 사용해야 한다는 뜻이다.

반복문을 사용해서 값을 저장하는 예시를 살펴보자.

 

예시3)

int ascii = 65; 			//아스키코드 65 => 'A'로 자동캐스팅
char[][] charArr = new char[4][2];	//4행 2열의 2차원 배열 생성
for(int i = 0; i < 4; i++) {		//4행만큼 반복
	for(int j = 0; j < 2; j++) {	//2열만큼 반복
    	charArr[i][j] = ascii++;	//'A'부터 시작해 B, C, D,... 순서로 저장
    }
}

위의 코드는 중첩 반복문을 사용해서 2차원 배열에 값을 저장하는 방법이다.

그런데 1차원 배열에서도 살펴봤듯이 반복하는 횟수를 수정해보자.

 

예시3_수정)

int ascii = 65;
char[][] charArr = new char[4][2];
for(int i = 0; i < charArr.length; i++) {
	for(int j = 0; j < charArr[i].length; j++) {
    	charArr[i][j] = ascii++;
    }
}

이렇게 charArr.length charArr[i].length를 이용해서

배열의 인덱스만큼 반복할 수 있도록 작성했다.

물론 꼭 이렇게 작성하지 않고 임의의 숫자로 작성하거나 반복 횟수의 순서를 바꿔서

값이 저장되는 순서를 바꿀 수도 있다.

그 것은 본인의 자유지만 여기에서는 그렇게 복잡한 내용보다는

일단 기본적인 내용을 알아가도록 하자.

이렇게 저장된 배열을 행렬인 표로 그려보자면 다음과 같이 그릴 수 있다.

 

그림1)

 

2차원 배열 중첩 반복문을 사용하기 때문에 우리가 이전에 배웠던

중첩 반복문을 내 마음대로 주무를 수 있다면

2차원 배열에 값을 저장하거나 값을 가져올 때 임의의 순서대로 지정하는 것도 가능하다.

그런데 반복횟수를 지정하는데 charArr.length는 뭐고 charArr[i].length는 무엇을 의미하는 것일까?

2차원 배열 1차원 배열에 또다른 1차원 배열을 연결한 모습을 띄고 있다는 것을

알고 있을 것이다.

 

그렇기 때문에 바깥쪽 반복문에 있는 charArr.length

2차원 배열인 charArr의 앞에 있는 [ ]의 인덱스 길이를 의미하고

안쪽 반복문에 있는 charArr[i].length

charArr의 뒤에 있는 [ ]의 인덱스 길이를 의미하는 것이다.

말로 풀어서 설명했기 때문에 조금은 헷갈릴지도 모르겠지만

가능하다면 제대로 이해하는 것이 중요하다.

 

2. 2차원 배열에서 값을 출력하는 방법

 

저장하는 방법을 알아봤으니 이제 저장한 값들을 가져와서

변수에 저장하거나 출력하는 방법에 대해서 살펴보자.

방법은 저장하는 것과 동일하다.

인덱스 2개를 지정해줘야하는 것은 물론이고

반복문을 사용한다면 중첩 반복문을 사용하는 것도 동일하다.

물론 인덱스를 사용하지 않거나 인덱스를 하나만 사용한다면

값이 아닌 주소가 출력되니 주의하도록 하자.

예시를 살펴보자.

 

예시4)

for(int i = 0; i < charArr.length; i++) {
	for(int j = 0; j < charArr[i].length; j++) {
    	char c = charArr[i][j];
        System.out.print(c + " ");
    }
    System.out.println();		//줄바꿈용
}

위의 예시3 2차원 배열을 사용해서 값을 출력하는 코드를 작성했다.

역시 중첩 반복문을 사용해 인덱스 2개를 지정했고

[0][0]부터 시작해 [3][1]까지의 값을 출력했다.

물론 특정 위치의 값을 가져오겠다면

 

char c = charArr[2][2];

 

와 같이 값을 가져오면 된다.

개념차체는 1차원 배열과 크게 다를게 없기 때문에 이해하는데 어려움은 없을 것이라 생각한다.

 

 

 

 - 어떤 문제가 있었고, 나는 어떤 시도를 했는지

10798번  백준 


문제 링크 : https://www.acmicpc.net/problem/10798

 

 

 

 문제풀이 : 

import java.util.Scanner;

public class Main {

    public String solution (int max, char[][] arr) {
        StringBuilder answer = new StringBuilder();

        for (int i = 0 ; i < max; i++) {
            for (int j = 0 ; j < 5 ; j++) {
                if(arr[j][i] == '\0') continue;
                answer.append(arr[j][i]);
            }
        }

        return answer.toString();
    }

    public static void main(String[] args) {
        int n = 5;
        Main mt = new Main();
        char[][] arr = new char[5][15];
        Scanner sc = new Scanner(System.in);
        int max = 0;
        for (int i = 0; i < n; i++) {
            String line = sc.nextLine(); // 한 줄 입력받기
            if(max < line.length()) max = line.length();
            for (int j = 0; j < line.length(); j++) {
                arr[i][j] = line.charAt(j); // 입력된 줄에서 한 글자씩 배열에 담기
            }
        }
        System.out.println(mt.solution(max, arr));

    }
}

 

- 어떻게 해결했는지

'\0'는 ASCII 코드 0에 해당하는 **널 문자(null character)**입니다.

주요 특징:

  • 문자 의미: 널 문자(null character)는 텍스트 문자열의 끝을 나타내는 데 자주 사용됩니다.
  • ASCII 코드 값: 0
  • 표현: Java에서 '\0' 또는 (char) 0으로 표현합니다.
  • 기본값: Java에서 char 배열의 초기화 값은 '\0'입니다. 따라서 명시적으로 값을 할당하지 않은 배열의 모든 char 요소는 '\0'로 초기화됩니다.

이 코드에서 '\0'의 역할:

if (arr[j][i] == '\0') continue;는 배열의 해당 위치에 값이 없는 경우(초기화 상태인 경우) 루프를 건너뛰기 위해 사용됩니다.

728x90