[JAVA+국비교육] 배열 기초
by 무작정 개발2021.12.27(5일 차)
저번 주 화요일부터 수업을 시작해서 주말에 쉬고 2주 차 시작이다. 대면 수업을 들으러 강남으로 통원을 하니 힘들다..
하지만 대면으로 수업을 들어야 같은 반 사람들과 친해질 수 있고, 모르는 부분이 생겼을 때 질문을 하기 위해 꾹 참고
다닌다!
오늘의 수업 내용은 ' 배열 '이다.
배열(Array)
- 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스(index)를 부여해놓은 자료구조
- 같은 자료형들끼리 모아두는 하나의 묶음
(1) 배열의 특징
- 배열은 같은 타입의 데이터만 저장할 수 있다.
- 한 번 생성된 배열은 길이를 수정할 수 없다.
- 배열은 선언 후에 생성까지 해줘야 메모리 공간이 생긴다.
(2) 배열 예제
package com.day3;
import java.util.Scanner;
public class Test8 {
public static void main(String[] args) {
// 배열
int[] num = new int[5]; //int num[] = new int[5];
Scanner sc = new Scanner(System.in);
System.out.print("다섯개의 변수 : "); // 5 7 9 2 3
for(int i=0; i<num.length; i++) {
num[i] = sc.nextInt();
}
//하단 배열을 위의 for문 2줄로 바꿈
/*num[0] = sc.nextInt();
num[1] = sc.nextInt();
num[2] = sc.nextInt();
num[3] = sc.nextInt();
num[4] = sc.nextInt();*/
//i<num.length; 아래랑 같다
for(int i=0; i<=num.length-1; i++) {
System.out.println("num["+ i +"]:" + num[i]);//System.out.println("num[1]:" + num[i]);
}
System.out.println("배열 갯수 : " + num.length);// 배열의 length는 ()괄호가 없다.
num[3] = 100;
System.out.println("num[3]:" + num[3]); //num[3]를 출력
int a = num[3] - 30; //배열 3에 들어있는수(100)에서 -30을 함
System.out.println("a:" + a);
}
}
(3) 만년 달력 만들기
package com.day4;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
//배열 시작!
// 만년달력 만들기
Scanner sc = new Scanner(System.in);
//int [] months = new int [12]; 하단 처럼 배열 생성 가능
// 월별 날짜 수를 배열에 저장
int [] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // = 12개
int y, m, nalsu, i, week = 0;
do {
System.out.print("년도 : "); // 2021
y = sc.nextInt();
} while(y<1); // 년도는 1보다 작으면 안된다.
do {
System.out.print("월 : "); //12월
m = sc.nextInt();
} while(m<1 || m>12); //월은 1보다 작으면 안되고 12보다 크면 안된다.
//윤년에 따른 2월의 날 수
if(y%4 == 0 && y%100 != 0 || y%400 == 0) { //윤년을 구하는 공식
months[1] = 29; // 윤년이면 배열 [1]을 29로 바꾼다. 윤년이 아니면 [1]은 28이다.
}
//1년1월1일부터 사용자가 (y-1)년 12월 31일까지의 날 수 구하기 // &&는 빼기 ||는 더하기
nalsu = (y-1)*365 + (y-1)/4-(y-1)/100 +(y-1)/400;//윤년 구하는 공식
/*int yy = (y-1)/4-(y-1)/100 +(y-1)/400;
System.out.println(nalsu); // 날 수
System.out.println(yy); */
//index : 0 1 2 3 4 5 6 7 8 9 10 11
//배열 : {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
//월(m) : 1 2 3 4 5 6 7 8 9 10 11 12
//(m-1)월 말일까지의 날 수
for(i=0; i<m-1; i++) {
nalsu += months[i];
}
nalsu += 1; //y년 m월1일
// 주의수 계산
week = nalsu % 7; // 3
//System.out.println(week);
System.out.println("\n 일 월 화 수 목 금 토");
System.out.println("------------------------------");
for(i=0; i<week; i++) { // 공백 1칸 = 2바이트 문자 = 2바이트
System.out.print(" "); //공백 4칸 why? 위에서 공백2칸 일/공백2칸 화 이렇게 찍었는데 둘다 4바이트로 맞춘다.
}
for(i=1; i<=months[m-1]; i++) {
System.out.printf("%4d", i); // %4d는 %d가 들어가는 공간은 4바이트로 만든다
// 요일한글대신 wed fri 등 영어약어로 바꾸면 %4d대신 %3d 사용
// 한 주의 날짜가 출력되면 줄바꿈
week++;
if(week%7 == 0) // 토요일 다음으로 넘어갈때 줄바꿈해서 날짜 출력
System.out.println();
}
if(week%7 != 0) {
System.out.println();
}
System.out.println("------------------------------");
}
}
(4) 연도, 월, 일 을 입력받아서 요일까지 출력하게 하기
package com.day4;
import java.util.Scanner;
public class Test2_1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("연도를 입력하시오: ");
int year = scan.nextInt();
System.out.print("월을 입력하시오: ");
int month = scan.nextInt();
System.out.print("일을 입력하시오: ");
int date = scan.nextInt();
// 1. 주어진 연도에서 1900을 빼서 365를 곱한다.
// 2. 연도에서 1900을 뺀 것을 4로 나누면 윤년의 횟수이므로 이 값을 더한다.
int totalDays = ((year - 1900) * 365) + ((year - 1900) / 4);
// 3. 주어진 연도가 윤년이고 주어진 월이 2월이나 1월이면 위의 결과에서 1을 뺀다.
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
if (month == 1 || month == 2) {
totalDays--;
}
}
// 실제 월로 하기때문에 index 0은 쓸 일이 없을 듯 하여 0으로 대체
int[] monthDays = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// 4. 위의 결과에 주어진 월과 일까지의 날 수를 더한다. 예를 들어 1월 3일이면 3을 더한다.
// 일단 전월까지를 모두 더하고
for (int i = 1; i <= month - 1; i++) {
totalDays += monthDays[i];
}
// 해당월의 일까지를 더한다.
totalDays += date;
String[] weeks = { "일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일" };
// 5. 구한 날 수에 7을 나눈 나머지가 요일이 된다.
System.out.printf("%d년 %d월 %d일은 %s입니다.", year, month, date, weeks[totalDays % 7]);
scan.close();
}
}
문제보다는 윤년 공식이 많이 헷갈린다....
배열을 배우면서 선생님이 정렬 작업을 알려주셨다.
선택 정렬(Selection Sort)
선택 정렬은 정렬되지 않은 데이터들에 대해 가장 작은 데이터를 찾아 가장 앞의 데이터와 교환해나가는 방식
자세한 설명은 하단 링크 첨부
https://blog.naver.com/makeflood/222607257000
예를 들어 설명해 보자면
변수 하나를 별도로 선언해서 저장해뒀다가 덮어 씌우고
num [0] > num [1]과 비교했을 때 num [0]이 더 크면 자리를 바꾼다. (정렬의 기본 원리)
선택 정렬 방법
ex ) int num [] = {32, 23, 11, 6, 10}
1.
32 23 11 6 10
23 35 11 6 10
11 35 23 6 10
6 35 23 11 10
-> 6는 가장 작은 값으로 고정
2.
6 23 35 11 10
6 11 35 23 10
6 10 35 23 11
-> 6, 10 고정
3.
6 10 23 35 11
6 10 11 35 23
-> 6, 10, 11 고정
4.
6 10 11 23 35
-> 정렬 완료
선택 정렬(selection sort) 기본 공식
for(i=0; i<num.length-1; i++) {
for(j=i+1; j<num.length; j++) {
}
}
5개의 수를 입력받아서 오름차순으로 정렬하기
package com.day4;
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
// selection sort(선택정렬)
//int [] num = {50, 42, 37, 26, 5}; // 정해진 5개의 정수를 생성해서 정렬하는법
Scanner sc = new Scanner(System.in); //5개의 수를 사용자한테 입력받는법
int i,j,temp;
int[] num = new int [5];
System.out.print("5개의 수를 입력 : ");
for(i=0; i<num.length; i++) {
num[i] = sc.nextInt();
}
System.out.print("Source Data: ");
for(i=0; i<num.length; i++) {
System.out.printf("%4d", num[i]);
}
System.out.println();
System.out.println("----------------------------------");
//-----------------------------------------------------------------------------------
//Selection Sort
//선택 정렬 기본 공식 (암기 필수)!!이중for문
for(i=0; i<num.length-1; i++) {
for(j=i+1; j<num.length; j++) {
//System.out.println(i + ":" + j);
if(num[i]>num[j]) {
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
//------------------------------------------------------------------
//확장 for문 @검색해서 찾아보기
System.out.print("Sorted Data: ");
for(int k : num) { // 배열일 때만 쓰는 for문
System.out.printf("%4d", k); // 배열 for문에서는 자동으로 수를 가져와서 넣어준다
}
System.out.println();
}
}
10명 이내의 이름과 점수를 입력받아 점수를 기준으로 내림차순으로 출력하기
package com.day4;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
// 10명 이내의 이름과 점수를 입력받아
// 점수가 높은사람에서 낮은사람 순으로 출력(점수 내림차순)
Scanner sc = new Scanner(System.in);
String [] name; //배열을 몇개만들지 정확히 모를 때 이렇게 한다.
int [] score; //여기서 배열선언안하고 아래에서 해도되지만 변수는 위에서 선언해주는 것이 좋음
int i, j, people, temp1;// temp1은 점수를 받는다.(int)
String temp2; //temp2는 이름을 받는다.(String)
do {
System.out.print("인원 수[1~10] : "); // 3
people = sc.nextInt();
} while(people<1 || people>10); //1보다 작거나 10보다 크면 안되게끔
//위의 배열을 갖고와서 쓴다.
//배열 메모리 할당(객체 생성)
name = new String[people]; //여기서 String [] name = new String[people];
score = new int[people]; // int [] score = new int[people]; 이렇게 선언가능 위에서 선언안하고.
for(i=0; i<people; i++) {
System.out.print("이름 : "); //suzi
name[i] = sc.next();
System.out.print("점수 : "); //50
score[i] = sc.nextInt();
}
// 총점 정렬
for(i=0; i<score.length-1; i++) {
for(j=i+1; j<score.length; j++) {
if(score[i]<score[j]) {
temp1 = score[i]; //score자리바꿈
score[i] = score[j];
score[j] = temp1;
temp2 = name[i]; //name 자리바꿈
name[i] = name[j];
name[j] = temp2;
}
}
}
//2개이상의 배열을 가져올때는 확장for문을 못씀 / 배열 1개일때만 가능
for(i=0; i<people; i++) {
System.out.printf("%6s %4d \n", name[i], score[i]);
}
}
}
다음 문제를 풀기 앞서 선생님께서 Random 클래스에 대해 설명해 주셨다.
Random 클래스
직접 지정한 범위 내의 숫자 또는 문자를 랜덤으로 출력할 수 있는 클래스이다.
랜덤 클래스를 사용하기 위해서는 import java.util.Random이 필요하다.
Random 클래스는 boolean, int, long, float, double 난수를 얻을 수 있다.
메서드 | 설명 |
setSeed(long n) | 매개값으로 주어진 종자값이 설정됩니다. |
boolean nextBoolean() | boolean타입의 난수를 리턴합니다. |
double nextDouble() | doouble 타입의 난수를 리턴합니다. |
int nextInt() | int 타입의 난수를 리턴합니다. |
int nextInt(int n) | int 타입의 0 ~ 매개값까지의 난수를 리턴합니다. |
double nextGaussian() | 평균이 0.0이고 표준편차가 1.0인 정규분포 난수를 리턴합니다. |
1부터 45까지의 수 중에서 6개의 난수를 발생시켜 크기순으로 정렬하기( 로또 문제)
package com.day4;
import java.util.Random;
public class Test5 {
public static void main(String[] args) {
//1~45까지의 수 중에서 6개의 난수를 발생시켜 크기순으로 정렬 (로또)
Random rd = new Random();
int [] num = new int[6];
int i, j, n, temp;
n = 0;
//Math.random();
//몇번 실행해야할지 모르니 while문 사용'
while(n<6) { // 6개의 랜덤숫자 생성
num[n] = rd.nextInt(45)+1; //(45)만쓰면 0부터 44이다. (45)+1을 하면 1~45 범위가 나온다
//@@ 매우 중요 @@//
for(i=0; i<n; i++) { //이 while문 방법으로하면 중복값이 절대 안나온다.
if(num[i] == num[n]) { // 중복값이 나오면 n-- 감소시켜 배열 전 칸으로 가서 다시 랜덤숫자를 뽑는다.
n--; // 쉽게 말하자면 중복숫자가 안나오면 랜덤으로 6개를 쭉 뽑아주고, 만약에
break; // 중복값이 나오면 다시 이전칸으로 돌아가는데 break를 만나서 둘의 수를
} // 비교하지 않고 다시 랜덤숫자를 채운다.
}
n++;
}
// 정렬 랜덤뽑기해서 정렬안하려면 이 부분을 주석처리
for(i=0; i<num.length-1; i++) {
for(j=i+1; j<num.length; j++) {
if(num[i]>num[j]) {
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
} //여기까지
//for(int i=0; i<num.length; i++) 아래의 for문과 여기 for문과 같다.
for(int su : num) { //확장 for문 -> 배열에서만 사용 가능하다.
System.out.printf("%4d", su);
}
}
}
지역 변수와 전역 변수의 초기값
package com.day4;
import com.day5.Rect;
public class Test6 {
public static void main(String[] args) {
Rect usa = new Rect(); // 패키지가 달라서 import 시켜야함
usa.input();
int aa = usa.area();
int ll = usa.length();
usa.print(aa, ll);
//전역변수: 초기값 = 0
//지역변수 초기값 = 쓰레기값 가지고 있다.
}
}
Q. 퀴즈풀이
1번
5개의 정수를 입력받아서 가장 큰 수와 작은 수 를 출력
package com.day4;
import java.util.Scanner;
public class Q1_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] su = new int[5];
int i,max,min;
System.out.print("5개의 정수를 입력하세요.");
for(i=0;i<su.length;i++){
su[i] = sc.nextInt();
}
//max와 min구할때 사용
//값을 넣어놓고 다른 수와 비교
max=min=su[0];
for(i=1;i<su.length;i++){
if(max<su[i])
max=su[i];
if(min>su[i])
min=su[i];
}
System.out.printf("가장 작은수 : %d, 가장 큰수 %d",min,max);
System.out.println();
}
}
2번
1 ~ 10 사이의 난수를 발생시켜 발생시킨 난수를 3번 안에 맞춰보세요. 3번 안에 맞추지 못하면 발생된 난수 출력
package com.day4;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;
public class Q2 {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
Random rd = new Random();
int[] num = new int[3];
int a;
char ch;
a = rd.nextInt(10) + 1; // 1
while (true) {
for (int i = 0; i < 3; i++) {
System.out.printf("정수입력?[%d번째 기회] : ", i + 1);
num[i] = sc.nextInt();
if (a == num[i]) {
System.out.println("맞았어요!");
break;
} else {
System.out.println("틀렸어요!");
}
}
System.out.printf("정답은 %d입니다.", a);
System.out.println("계속 할래?[Y/y]");
ch = (char) System.in.read();
if (ch != 'Y' && ch != 'y') {
System.out.println("프로그램 종료");
break;
}
}
}
}
3번
1~3 사이의 난수를 발생시켜 가위, 바위, 보 게임 프로그램 작성
1 : 가위, 2: 바위, 3: 보
package com.day4;
//3. 1~3사이의 난수를 발생시켜 가위,바위,보 게임 프로그램 작성
//1:가위, 2:바위, 3:보
import java.util.Scanner;
public class Q3 {
public static void main(String[] args) {
System.out.print("(1)가위, (2)바위, (3)보");
Scanner sc = new Scanner(System.in);
int user = sc.nextInt();
int com = (int) (Math.random() * 3) + 1; //
System.out.println("컴퓨터:" + com + "사람:" + user);
switch (user-com) {
case 2: case -1:
System.out.println("컴퓨터가 이겼습니다.");
break;
case 1: case -2:
System.out.println("당신이 이겼습니다");
break;
case 0:
System.out.println("비겼습니다.");
break;
}
}
}
package com.day4;
import java.util.Random;
import java.util.Scanner;
public class Q3_2 {
public static void main(String[] args) {
/*
1~3사이의 난수를 발생시켜 가위,바위,보 게임 프로그램 작성 1:가위, 2:바위, 3:보
예) 1:가위, 2:바위, 3:보 ?1 컴퓨터 :보 사람 :가위 당신이 이겼습니다
1:가위, 2:바위, 3:보 ?1 컴퓨터 :바위 사람 :가위 컴퓨터가 이겼습니다
*/
Scanner sc = new Scanner(System.in);
Random rd = new Random();
String[] a = { "가위", "바위", "보" };
int c, d; // c: 컴퓨터, d: 사람
c = rd.nextInt(3);
System.out.print("1(가위), 2(바위) 3(보) 중 하나를 입력하세요");
d = sc.nextInt() - 1;
System.out.printf("컴퓨터: %s, 사람: %s %n", a[c], a[d]);
if (c == d) {
System.out.println("비겼습니다.");
} else if (c + 2 == d || c - 1 == d) {
System.out.println("컴퓨터가 이겼습니다.");
} else {
System.out.println("당신이 이겼습니다.");
}
}
}
'Language > Java' 카테고리의 다른 글
[JAVA+국비교육] static, this, 변수 초기화 방법, Overloading, 생성자 (0) | 2021.12.30 |
---|---|
[JAVA+국비교육] 클래스(Class), 객체 지향(OOP) 시작! (0) | 2021.12.30 |
[JAVA+국비교육] 반복문 (0) | 2021.12.30 |
[JAVA+국비교육] 증감연산자/산술연산자 & for문/if문 (0) | 2021.12.27 |
[JAVA+국비교육] 변수 선언과 자료형 (0) | 2021.12.27 |
블로그의 정보
무작정 개발
무작정 개발