[배열] 국비 42일차

포키·2022년 11월 18일
0

국비과정

목록 보기
29/73

배열

2차원 배열 - '배열 안에 배열 넣기'

사실 2차원 배열이란 건 없다!

  • 2차원 배열 (x)
    배열의 원소로 배열이 들어간 것 (o)

  • 즉 2차원 배열 -> 배열 안에 배열
    3차원 배열 -> 배열 안에 배열 안에 배열

배열 안의 배열에서 원소 꺼내오는 법

  • arr[n+1][m+1] : 배열 arr의 n번째 원소(=배열)에서 m번째 원소 꺼내오기
	int[][] arr = {{4, 5, 6}, {7, 8, 9}};
    int[] temp = arr[0]; 
    // arr[0]이 의미하는 것 : int배열 {4, 5, 6}
    int n = temp[2];
    // temp[2]가 의미하는 것 : int배열 {4, 5, 6}의 세번째 data
    // 즉 n = temp[2] = arr[0][2]
    // int배열을 원소로 가지는 배열 arr에서, 첫 번째 원소(배열)의 세 번째 원소를 꺼낸 것

참고
만약 반복이 4번 이상 나오면 보통 잘못된 풀이법일 가능성이 높음
(우리 수준에서는 보통 4차원 배열까지 갈 필요가 없다💦)

예제 - 학생별 평균 점수 / 과목별 평균 점수를 구하시오

  • 성적 정보는 배열로 제공
    { {100, 80, 90, 100, 90}, {90, 70, 100, 90, 90}, {80, 80, 90, 70, 100} }
class ArrEx4 {
	public static void main(String[] args) {
		int[][] scores = new int[][] {{100, 80, 90, 100, 90}, {90, 70, 100, 90, 90}, {80, 80, 90, 70, 100}};

		// 학생별 평균 점수
		for(int i = 0; i < scores.length; i++) {
			// i는 학생번호 (학생수만큼 돌아감)
			int sum = 0;
			for(int j = 0; j < scores[i].length; j++) {
				// j는 과목번호 (과목수만큼 돌아감)
				sum += scores[i][j];
			}
			System.out.println((i + 1) + "번째 학생의 평균은 " + (sum / scores[i].length));
		}
		
		// 학생별 평균 점수 (간단한 for문 버전)
		int num = 0;
		for(int[] student : scores) {
			int sum = 0;
			for(int score : student) {
				sum += score;
			}
			num++;
			System.out.println(num + "번째 학생의 평균은 " + (sum / student.length));
		}
		System.out.println();

		// 각 테스트당 평균 점수
		for(int j = 0; j < scores[0].length; j++) {
			// j는 과목번호 (과목수만큼 돌아감)
			int sum = 0;
			for(int i = 0; i < scores.length; i++) {
				// i는 학생번호 (학생수만큼 돌아감)
				sum += scores[i][j];
			}
			System.out.println((j + 1) + "번째 시험의 평균은 " + (sum / scores.length));
		}
	}
}
  • 중복 제거!
  • 발상의 전환 - 간단한 버전💢
class ArrEx4 {
	public static void average(int[][] scores) {
    // 주어진 배열에서 원소별 평균을 구하는 메서드
		for(int i : scores) {
			int sum = 0;
			for(int j : scores[i].length) {
				sum += scores[i][j];
			}
			System.out.println(sum / scores[i].length);
		}
	}
    public static void main(String[] args) {
		int[][] scores = new int[][] {{100, 80, 90, 100, 90}, {90, 70, 100, 90, 90}, {80, 80, 90, 70, 100}};
		
		// 학생별 평균 점수
		average(scores);
		
        // 학생{과목{}, 과목{}} -> 과목{학생{}, 학생{}} 전환
		int[][] newScores = new int[5][3];
		for(int i = 0; i < scores.length; i++) {
			for(int j = 0; j < scores[i].length; j++) {
				newScores[j][i] = scores[i][j];
			}
		}
        // 과목별 평균 점수
		average(newScores);
  • or...

래그드 배열

  • 배열의 원소로 배열을 넣을 때, 들어가는 배열들의 길이가 꼭 같을 필요는 없다.
class ArrEx4 {
	public static void main(String[] args) {
		int[][] arr = {{3, 2, 1},{6, 7},{8, 9, 10, 11}}
	}
}

예제 - 3권의 책을 꽂을 수 있는 책장 2개가 있는 서점

class Book {
	String title;
	int price;
	public Book(String title, int price) {
		setTitle(title);
		setPrice(price);
	}
	
	public String getTitle() {
		return title;
	}
	public int getPrice() {
		return price;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return title + " (" + price + ")";
	}
}
class Bookcase {
	private String category;
	private Book[] books;

	public Bookcase(String category, Book... books) {
		setCategory(category);
		setBooks(books);
	}

	public String getCategory() {
		return category;
	}
	public Book[] getBooks() {
		return books;
	}
	public void setCategory(String category) {
		this.category = category;
	}
	public void setBooks(Book[] books) {
		this.books = books;
	}

	@Override
	public String toString() {
		String info =  "- category : " + category + "\n- booklist\n";
		for(Book temp : books) {
			info += "\t" + temp + "\n";
		}
		return info;
	}
}
class Bookstore {
	private String name;
	private String tel;
	private Bookcase[] cases;
	public Bookstore(String name, String tel, Bookcase... cases) {
		setName(name);
		setTel(tel);
		setCases(cases);
	} 

	public String getName() {
		return name;
	}
	public String getTel() {
		return tel;
	}
	public Bookcase[] getCases() {
		return cases;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public void setCases(Bookcase[] cases) {
		this.cases = cases;
	}

	@Override
	public String toString() {
		String info = "<< " + name + " bookstore >>\n- tel) " + tel + "\n";
		for(Bookcase temp : cases) {
			info += temp + "\n";
		}
		return info;
	}
}
class ArrEx6 {
	public static void main(String[] args) {
		Bookcase case1 = new Bookcase(
			"IT", new Book("power java", 35000), new Book("ultra java", 38000), new Book("hyper java", 41000)
		);
		
		Bookcase case2 = new Bookcase(
			"novel", new Book("춘식이는 최고야", 35000), new Book("춘식이는 집순이", 28000), new Book("춘식이는 프렌즈", 39000)
		);

		Bookstore store = new Bookstore("Green", "051-900-1000", case1, case2);
		System.out.println(store);
	}
}
profile
welcome

0개의 댓글