* 이 글은 제가 공부하기 위해 최대한 사실에 입각해 내용을 적으려고 하지만 일부 내용들이 정확하지 않을 수 있습니다.
혹시나 잘못된 부분이 있으면 너그럽게 이해해주시고 피드백 부탁드려요!
연산자
조건 : 연산자만을 이용하여 문제를 풀어보기
1. 과일바구니 계산
과일바구니 당 과일이 들어갈 수 있는 수는 10개, 과일은 455개가 있다.
내가 필요한 과일 바구니의 갯수는?
package Excercise;
public class FruitCount {
public static void main(String[] args) {
int apple = 455; // 사과의 갯수
int remains = apple % 10; // 바구니에 넣고 바구니에 담지 못한 사과의 갯수
int i = remains < 10 ? 1 : 0; // 사과가 10개 미만이 있다면 1개를 추가 아니면 0
int basket = apple / 10 + i; // 바구니 안에 들어갈 수 있는 수는 10개
System.out.println("사과의 갯수는 " + apple);
System.out.println("바구니 안에 들어갈 수 있는 사과의 개수는 10개씩입니다.");
System.out.println("필요한 사과 바구니의 수 : " + basket);
}
}
생각한 방법
나는 연산자 파트 중에 사용할 수 있는 삼항연산을 활용하여 문제를 해결해보았다.
package Excercise;
public class FruitCount {
public static void main(String[] args) {
int apple = 455; // 사과의 갯수
int remains = apple % 10; // 바구니에 넣고 바구니에 담지 못한 사과의 갯수
int i = remains < 10 ? 1 : 0; // 사과가 10개 미만이 있다면 1개를 추가 아니면 0
//int basket = apple / 10 + i; // 바구니 안에 들어갈 수 있는 수는 10개
int basket = (apple + 9) / 10; // 이렇게 올림하여도 됨.
// int basket = (apple +(10-1) / 10;
System.out.println("사과의 갯수는 " + apple);
System.out.println("바구니 안에 들어갈 수 있는 사과의 개수는 10개씩입니다.");
System.out.println("필요한 사과 바구니의 수 : " + basket);
}
}
2. 특정 '문자'가 영문자인지 숫자인지 판단하기
특정 문자(예시 'A')가 주어진다면 이 문자가 영문자인지 숫자인지 판단하는 식을 만들어보자.
package Excercise;
public class NumLetterJudgement {
public static void main(String[] args) {
char i = 'A';
char j = '1';
// String alpabet = ((int)i >=48 || (int)i<= 90) ? "문자" : "숫자";
String alpabet = (((int)i >=97 && (int)i<= 122) || ((int)i >= 65 && (int)i <= 90)) ? "문자" : "숫자";
String number = (((int)j >=48 && (int)j<= 57)) ? "숫자" : "문자";
System.out.println("해당 문자는 "+ alpabet + "입니다." );
System.out.println("해당 문자는 "+ number + "입니다." );
}
}
생각한 방법
아스키 코드를 활용해보면 어떨까?라는 생각을 해보았다.
아스키코드(American Standard Code for information interchange)
- ANSI에서 제시한 표준 코드 체계로 각 문자를 7비트로 표현하므로 총 128개의 문자를 표현 할 수 있다.
해당 문자 0 = (십진수)48 ~ 9 = (십진수)57
해당 문자 A = (십진수)65 ~ Z = (십진수)122, a = (십진수)97 ~ z = (십진수)122
예를 들어 A라는 문자를 입력 받으면 alpabet이라는 변수에 입력받은 A가 강제형변환을 통해 char 타입을
int형으로 변환하여 십진수가 나오게 되면 97~122 안에 있는 숫자가 되기 때문에 결과 값이 문자라고 알려주는
삼항연산을 사용하였다.
package Excercise;
public class NumLetterJudgement {
public static void main(String[] args) {
char i = 'C';
char j = '1';
// String alpabet = ((int)i >=48 || (int)i<= 90) ? "문자" : "숫자";
String alpabet = (((int)i >=97 && (int)i<= 122) || ((int)i >= 65 && (int)i <= 90)) ? "문자" : "숫자";
String number = (((int)j >=48 && (int)j<= 57)) ? "숫자" : "문자";
System.out.println("해당 문자는 "+ alpabet + "입니다." );
System.out.println("해당 문자는 "+ number + "입니다." );
// boolean 으로 하면 된다.
// 비교 논리 연산자를 사용하면 된다.
// 또는이니 or가 반드시 들어가겠구나 생각하면 된다.
// 영문자 or 숫자
// => 영대문자 or 영소문자 or 숫자
char ch = 91;
System.out.println(ch);
boolean result = ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z' || ch >= '0' && ch <='9'; // 숫자로 해도 됨.
System.out.println(result);
}
}
3. 소수점 버림, 반올림, 올림 계산
소수점 넷째 자리에서 셋째 자리로 소수점 버림, 반올림, 올림 계산식을 만들어보자.
package Excercise;
public class DecimalPoint {
public static void main(String[] args) {
double i = 1.2345;
double result = (int)(i * 1000) / 1000d; // 버림
System.out.println(result);
int k = (int)(i * 10000) % 10;
System.out.println(k); // 넷쨰자리 숫자를 반올림할 수 있도록 5이상인지 나타내보기
double result2 = k >= 5 ? i+0.001 : i; // 일의 자리 숫자가 5 이상이면 입력받은 숫자 i의 소수점 셋째자리에서 1을 더하게 하기
double result3 = k < 5 ? i : i+0.001; // 일의 자리 숫자가 5 미만이면 입력받은 숫자 i의 소수점 넷째자리에서 버리기
System.out.println(result2);
System.out.println(result3);
//System.out.printf("%.4f\n", i*1000000); ? 궁금함.
// Math 클래스 이용
// 1. Math.round() : 반올림
// 2. Math ceil() : 올림
// 3. Math.floor() : 내림
// String.Format 이용방법
// String Format("%.4f", 1.2345);
}
}
생각한 방법
연산자만 사용하면서 반올림이나 올림을 쓰기가 쉽지 않았다.
package Excercise;
public class DecimalPoint {
public static void main(String[] args) {
// double i = 1.2345;
// double result = (int)(i * 1000) / 1000d; // 버림
// System.out.println(result);
//
//
// int k = (int)(i * 10000) % 10;
// System.out.println(k); // 넷쨰자리 숫자를 반올림할 수 있도록 5이상인지 나타내보기
//
// double result2 = k >= 5 ? i+0.001 : i; // 일의 자리 숫자가 5 이상이면 입력받은 숫자 i의 소수점 셋째자리에서 1을 더하게 하기
// double result3 = k < 5 ? i : i+0.001; // 일의 자리 숫자가 5 미만이면 입력받은 숫자 i의 소수점 넷째자리에서 버리기
//
// System.out.println(result2);
// System.out.println(result3);
//System.out.printf("%.4f\n", i*1000000); ? 궁금함.
// Math 클래스 이용
// 1. Math.round() : 반올림
// 2. Math ceil() : 올림
// 3. Math.floor() : 내림
// String.Format 이용방법
// String Format("%.4f", 1.2345);
double d = 1.234567;
double result1 = (int)(d * 1000) / 1000d;
System.out.println(result1);
double result2 = (int)(d * 1000 + 0.5) / 1000d; // 반올림 문제해결
System.out.println(result2);
// 올림 하려면 + 0.9 하면 됨
double result3 = (int)(d * 1000 + .9) / 1000d; // 올림 문제해결
System.out.println(result3);
}
}
4. 직각삼각형의 둘레와 넓이 구하기
직각삼각형의 밑변과 높이(숫자 2개를 입력받기)를 안 상태에서 둘레와 넓이를 구해보자.
* Math.sqrt를 써야함.
package Excercise;
public class Triangle {
public static void main(String[] args) {
// 넓이와 둘레 구하기
int i = 6; // 밑
int j = 8; // 높
int k = (int)Math.sqrt(i*i + j*j); // 빗변
int area = (i * j) / 2;
int perimeter = i + j + k;// (int)Math.sqrt(k);
System.out.println(area);
System.out.println(perimeter);
}
}
생각한 방법
밑변과 높이가 주어진다면 빗변은 피타고라스의 정리를 이용해서 구할 수 있다.
다만 자바에서 제곱근을 사용하기 위해서는 Math.sqrt()를 사용해야한다.
빗변이 구해지면 넓이를 구하기 위해서는 밑변과 높이를 곱한뒤 1/2을 해주면 된다.
둘레는 밑변+높이+빗변을 하면 된다.
package Excercise;
public class Triangle {
public static void main(String[] args) {
// 넓이와 둘레 구하기
int i = 6; // 밑
int j = 8; // 높
int k = (int)Math.sqrt(i*i + j*j); // 빗변 = 제곱근(밑변^2 + 높이^2)
int area = (i * j) / 2;
int perimeter = i + j + k;// (int)Math.sqrt(k);
System.out.println(area);
System.out.println(perimeter);
double width = 0;
double height = 0;
double area1 = width * height / 2;
double cir = width + height + Math.sqrt(width*width + height*height);
System.out.println(area1);
System.out.println(cir);
// 활용할 수 있는 방법 : 거리 구하기, 시간 구하기 = > 직선구하기
// 경도(서경, 동경), 위도(북위, 남위)
}
}
제어문
조건 : (연산자~)제어문까지만을 이용하여 문제를 풀어보기
1. 최대공약수 구하기
두 수가 주어진다면 최대공약수를 구하여라.
조건 : 주어진 두 수는 정수이다.
package Excercise;
public class Gcd {
public static void main(String[] args) {
// 최대공약수 구하기
int i = 30;
int j = 50;
// 둘중에 작은 값을 비교해야함. 그래야 포문에 넣을 수가 있다.
int min = i < j ? i : j;
int gcd = 0;
for(int k = 1; k<=min; k++) { //k가 0이 되면 값이 안나온다.
if (i % k == 0 && j % k == 0) {
gcd = k;
}
}
System.out.println(i+ "와 " +j + "의 최대공약수는 "+ gcd+ "이다.");
}
}
생각한 방법
조건이 두수가 주어진다면 두 수는 먼저 대소 비교를 해야한다.
왜냐하면 작은 수의 기준까지 밖에 약수가 나오지 않기 때문이다.
gcd를 하나씩 올리면서 두 수를 나눴을 때 나머지가 둘 다 0이어야 약수가 된다.
package Excercise;
public class Gcd {
public static void main(String[] args) {
// // 최대공약수 구하기
// int i = 30;
// int j = 50;
//
// // 둘중에 작은 값을 비교해야함. 그래야 포문에 넣을 수가 있다.
// int min = i < j ? i : j;
// int gcd = 0;
//
// for(int k = 1; k<=min; k++) { //k가 0이 되면 값이 안나온다.
// if (i % k == 0 && j % k == 0) {
// gcd = k;
// }
// }
// System.out.println(i+ "와 " +j + "의 최대공약수는 "+ gcd+ "이다.");
int num1 = 12;
int num2 = 18;
int gcd = 0;
for(int i = 1; i <= num1; i++) {
if(num1 % i == 0) {
System.out.println(i);
}
}
System.out.println("=========================");
for(int i = 1; i < num2; i++) {
if(num2 % i == 0 ) {
System.out.println(i);
}
}
System.out.println("=========================");
for(int i = 1; i < num2; i++) {
for (int j = 1; j <=num1; j++) {
if(num1 % j ==0 && num2 % i == 0 && i==j) {
System.out.println(i);
gcd = i;
}
}
}
System.out.println("최대공약수 : " + gcd);
System.out.println("최소공배수 : " + num1 * num2 / gcd);
/* a:
* for(int i = num1 ; i <=num1*num2 ; i+=num1) {
* for(int j = num2 ; j < num1*num2 ; j+=num2) {
* if(i == j) {
* System.out.println(i);
* break a; // 브레이크를 안하면 최소공배수 말고도 계속 나옴
* }
* }
* }
*/
}
}
2. 소수 구하기
소수 : 약수가 1과 자신뿐인 자연수
조건 : 수열 형태로 30개 이상 출력하기 (1,2,3,5,......)
package Excercise;
public class PrimeNum {
public static void main(String[] args) {
// 소수 구하기
// 먼저 100까지 해보기
int count = 0;
System.out.print("소수 : ");
// 소수는 1과 자신만 나눌 수가 있으니 1 제외하고 2부터 시작
for (int i=2; i<=100;i++) {
for(int j = 2; j<=i;j++) {
if (i %j == 0) {
count += 1;
}
}
if(count == 1) {
System.out.print(i + " ");
}
count = 0;
}
}
}
생각한 방법
소수는 1과 자신만이 나눌 수가 있으니 2부터 조건식을 시작해서 계속해서 나눠서 나머지가 0이 되면
소수라고 판단하고 카운트가 1이 되면 해당 숫자를 출력하게 됐다.
package Excercise;
public class PrimeNum {
public static void main(String[] args) {
// 소수 구하기
// 먼저 100까지 해보기
// int count = 0;
// System.out.print("소수 : ");
//
// // 소수는 1과 자신만 나눌 수가 있으니 1 제외하고 2부터 시작
//
// for (int i=2; i<=100;i++) {
// for(int j = 2; j<=i;j++) {
// if (i %j == 0) {
// count += 1;
//
// }
// }
// if(count == 1) {
// System.out.print(i + " ");
// }
// count = 0;
// }
int count =0;
for(int j = 2;count<30 ; j++) {
boolean prime = true;
int num = j;
for( int i =2; i<num; i++) {
if(num % i == 0) {
// System.out.println(i);
prime = false;
break;
}
}
if(prime) {
System.out.print(j + " ");
count++;
}
}
}
}
3. 등비수열 출력하기
등비수열 : 연속한 두항의 비가 일정한 값 r이 되는 수열, 이 때 일정한 값 r을 공비라고 한다.
조건 : 등비수열 20개 이상 출력하기(1, 2, 4, 8, 16, ......)
package Excercise;
public class GeometricSequence {
public static void main(String[] args) {
//등비수열 an = ar^(n-1)
for(int i = 1; i < 1000; i *= 2) { // 자바 승을 표현하는 것은 어려운건가? ^ 것을 쓰면 좋을 것 같다.
// for(int i = 1; i < Math.pow(2, 20); i *= 2) {
// 자바 승을 표현하는 것은 어려운건가? 논리연산자인 ^ 이것을 쓰면 좋을 것 같다.
System.out.print(i+" ");
}
System.out.println();
}
}
생각한 방법
첫 항이 1이고 공비가 2인 등비수열을 먼저 나타내보자.
1 2 4 8 16 32 64 ..........
초항이 a이고 공비가 r인 등비수열 : a, ar, ar^2, ar^3, ar^4.......
an = ar^(n-1) = > anr = a(n+1)
등비수열은 for문에서 증감식만 바꿔주면 해결이 쉬어진다.
지속해서 항이 늘어날수록 같은 값만 곱해주면 되기 때문이다.
package Excercise;
public class GeometricSequence {
public static void main(String[] args) {
//등비수열 An + 1 = r*An
for(int i = 1; i < 1000; i *= 2) { // 자바 승을 표현하는 것은 어려운건가? ^ 것을 쓰면 좋을 것 같다.
// for(int i = 1; i < Math.pow(2, 20); i *= 2) {
// 자바 승을 표현하는 것은 어려운건가? 논리연산자인 ^ 이것을 쓰면 좋을 것 같다.
System.out.print(i+" ");
}
System.out.println();
// for (int i =1, count =0; count < 20; i++) {
//
// }
for(int i =0; i<20; i++) {
int val = 1;
for(int j = 0; j< i; j++) {
val *= 2;
}
System.out.print(val + " ");
}
System.out.println();
System.out.println(Math.pow(2, 3));
}
}
4. 피보나치 수열
피보나치 수열 : 첫 번째 항의 값이 0이고 두번째 항의 값이 1일 때, 이후의 항들은 이전의 두 항을 더한 값으로 이루어진느 수열
조건 : 피보나치 수열 20개 이상 출력하기(1 1 2 3 5 8 13,......)
package Excercise;
public class FibonacciNum {
public static void main(String[] args) {
// 피보나치수열
int num1 = 0;
int num2 = 1;
int sum = num1 + num2;
System.out.print(num1 + num2 + " ");
for(int i =0; i < 20; i++) { // 피보나치 수열 20개 항 구하기
sum= num1 + num2;
num1 = num2;
num2 = sum;
System.out.print(sum + " ");
}
}
}
생각한 방법
피보나치 수열은 첫 항과 다음항이 더해졌을 때 두번째 항이 그 값이 된다.
이 것도 결국 나중에 배울 배열에서 정렬 부분에서 쓰일 수 있다고 생각한다.
package Excercise;
public class FibonacciNum {
public static void main(String[] args) {
// 피보나치수열
int num1 = 0;
int num2 = 1;
int sum = num1 + num2;
System.out.print(num1 + num2 + " ");
for(int i =0; i < 20; i++) { // 피보나치 수열 20개 항 구하기
sum= num1 + num2;
num1 = num2;
num2 = sum;
System.out.print(sum + " ");
}
System.out.println();
// 선생님 풀이
int a = 1;
int b = 0;
int c= 0;
// 반복이 되게 됨.
// c = a+b;
// System.out.println(c);
// a = b;
// b = c;
//
for (int i =0; i < 20; i++) {
c = a + b;
System.out.print(c + " ");
a = b;
b = c;
}
}
}
5. 회문수 판별하기
회문수 : 숫자가 앞뒤로 동일하게 읽혀지는 것( 121, 12321, 1661 등)
package Excercise;
public class PalinNum {
public static void main(String[] args) {
// 회문수 구하기 121 1661 1991
int i = 1661; // 해당수가 회문수인지?
int j = (int)(i % 10); // 일의 자리 숫자 표
// 해당 숫자의 자리수를 구해야함 그래서 그게
int k = 0;
// for (int k =0; k<i; k++) {
// int l = i % k
// }
// 자리수를 알기 위해서 로그를 통해 자리수를 알아보기
int l = (int)Math.log10(i) % 10;
System.out.println(l);
int p = i / (int)(Math.pow(10, l));
System.out.println(p);
if (p == j) {
System.out.println(i + " 해당 숫자는 회문수입니다.");
}
else {
System.out.println(i + " 해당 숫자는 회문수가 아닙니다.");
}
}
}
생각한 방법
처음에 생각한 것은 먼저 회문수라는 것은 어떤 정수가 주어졌을 때 첫째자리 수와 마지막 자리 수가 같아야만
회문수라고 생각했다.
그래서 첫째 자리 수와 마지막 자리 수가 같은지 까지는 판별을 할 수 있었지만
이후 중간 자리 숫자들이 회문수인지 어떻게 판별해야할지 모르겠다.
package Excercise;
public class PalinNum {
public static void main(String[] args) {
// 회문수 구하기 121 1661 1991
// int i = 1661; // 해당수가 회문수인지?
//
// int j = (int)(i % 10); // 일의 자리 숫자 표
//
// // 해당 숫자의 자리수를 구해야함 그래서 그게
// int k = 0;
//// for (int k =0; k<i; k++) {
//// int l = i % k
//// }
// // 자리수를 알기 위해서 로그를 통해 자리수를 알아보기
//
// int l = (int)Math.log10(i) % 10;
// System.out.println(l);
//
// int p = i / (int)(Math.pow(10, l));
// System.out.println(p);
//
// if (p == j) {
// System.out.println(i + " 해당 숫자는 회문수입니다.");
// }
// else {
// System.out.println(i + " 해당 숫자는 회문수가 아닙니다.");
// }
int num = 224422;
// 자리수를 바꾸는 것이 핵심
int origin = num;
int result = 0;
int tmp = 0;
//System.out.println(tmp);
while(num != 0) {
tmp = num % 10;
//System.out.println(tmp);
result *= 10;
result += tmp;
num /= 10;
//System.out.println(num);
}
System.out.println(origin);
System.out.println(result);
System.out.println(result == origin ? "회문수" : "아님");
// tmp = num % 10;
// System.out.println(tmp);
// result *= 10;
// result += tmp;
// num /= 10;
// System.out.println(num);
//
// tmp = num % 10;
// System.out.println(tmp);
// result *= 10;
// result += tmp;
// num /= 10;
// System.out.println(num);
//
// tmp = num % 10;
// System.out.println(tmp);
// result *= 10;
// result += tmp;
// num /= 10;
// System.out.println(num);
//
// tmp = num % 10;
// System.out.println(tmp);
// result *= 10;
// result += tmp;
// num /= 10;
// System.out.println(num);
// 자리 숫자를 하나씩 빼옴
// 이걸 다시 재조림
}
}
배열
조건 : (연산자~)배열만을 이용하여 문제를 풀어보기
1. 지폐와 동전 갯수 구하기
어떤 돈(ex) 57420원)이 주어지면 5만원권, 1만원권, 5천원권 ~ 100원, 10원 단위로 갯수 구하기(배열사용)
package Excercise;
public class BillCoin {
public static void main(String[] args) {
// 지폐와 동전 구하기
int[] calculatingMachine = {50000, 10000, 5000, 1000, 500, 100, 10}; // 계수기 = 돈의 기
int money = 1527000; // 랜덤 돈
for(int i=0; i<calculatingMachine.length; i++) { // 기준이 명확하지만 그래도 배열의 길이를 알수 있는 것을 사용
System.out.println(calculatingMachine[i]+ "짜리" + money/calculatingMachine[i] +"개"); // 돈의 속성 표시 + 해당 기준 돈으로 나눠 몇개가 필요한
money = money%calculatingMachine[i]; // 다음 계산을 위해 나머지 연산 넣기
}
}
}
생각한 방법
돈의 기준에 따라 배열을 먼저 생성하였고, 그에 따라 주어진 돈을 계산할 수 있도록 하였다.
연산자에서 많이 쓰이는 나머지를 지속해서 활용하여 계산하였다.
package Excercise;
public class BillCoin {
public static void main(String[] args) {
// 지폐와 동전 구하기
int[] calculatingMachine = {50000, 10000, 5000, 1000, 500, 100, 10}; // 계수기 = 돈의 기
int money = 1527000; // 랜덤 돈
for(int i=0; i<calculatingMachine.length; i++) { // 기준이 명확하지만 그래도 배열의 길이를 알수 있는 것을 사용
System.out.println(calculatingMachine[i]+ "짜리" + money/calculatingMachine[i] +"개"); // 돈의 속성 표시 + 해당 기준 돈으로 나눠 몇개가 필요한
money = money%calculatingMachine[i]; // 다음 계산을 위해 나머지 연산 넣기
}
int amount = 234560;
int[] units = {50000, 10000, 5000, 1000, 500, 100, 50, 10};
int[] counts = new int[units.length];
// System.out.println(counts[0] = amount / units[0]);
// amount %= units[0];
// System.out.println(amount);
for(int i =0; i<units.length; i++) {
counts[i] = amount / units[i];
amount %= units[i];
}
for(int i =0; i<units.length; i++) {
System.out.println(units[i] + "원짜리" + counts[i] + "개");
}
}
}
2. 배열 정렬(오름차순)
버블 정렬 (bubble sort) : 서로 이웃한 데이터들을 비교하며 가장 큰 데이터를 가장 뒤로 보내며 정렬하는 방식
예시) [ 12 15 1 8 9 ] => [1 8 9 12 15]
package Excercise;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
// 버블정렬 오름차순
int[] array1 = {12, 15, 1, 8, 9};
// for (int i = 0;i<array1.length -1;i++) {
// if (array1[i] > array1[i+1]) {
// int tmp = array1[i];
// array1[i] = array1[i+1];
// array1[i+1] = tmp;
// }
// }
// 여기까지만 하면 결과값이 [12 1 8 9 15]가 나온다.
// 이걸 해결 해야한다.
// 그러기 위해서는 한번 더 비교를 해야하지 않나 싶다.
for(int j = 0 ; j < array1.length; j++) {
for(int i = 0; i < array1.length -1; i++) {
if (array1[i] > array1[i+1]) {
int tmp = array1[i];
array1[i] = array1[i+1];
array1[i+1] = tmp;
}
}
}
// 여기서 문제를 해결은 했지만 책이나 다른 사람들의 풀이에서는 array1.length -1 -i로 해결한다.
// 그 이유를 모르겠다.
System.out.println(Arrays.toString(array1));
}
}
생각한 방법
package Excercise;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
// // 버블정렬 오름차순
// int[] array1 = {12, 15, 1, 8, 9};
//
//// for (int i = 0;i<array1.length -1;i++) {
//// if (array1[i] > array1[i+1]) {
//// int tmp = array1[i];
//// array1[i] = array1[i+1];
//// array1[i+1] = tmp;
//// }
//// }
// // 여기까지만 하면 결과값이 [12 1 8 9 15]가 나온다.
// // 이걸 해결 해야한다.
// // 그러기 위해서는 한번 더 비교를 해야하지 않나 싶다.
//
// for(int j = 0 ; j < array1.length; j++) {
// for(int i = 0; i < array1.length -1; i++) {
// if (array1[i] > array1[i+1]) {
// int tmp = array1[i];
// array1[i] = array1[i+1];
// array1[i+1] = tmp;
// }
// }
// }
// // 여기서 문제를 해결은 했지만 책이나 다른 사람들의 풀이에서는 array1.length -1 -i로 해결한다.
// // 그 이유를 모르겠다.
//
// System.out.println(Arrays.toString(array1));
//
//
int[] arr = {5, 4, 1, 3, 2}; // n
// 1회차(n - 1)
// 4 5 1 3 2
// 4 1 5 3 2
// 4 1 3 5 2
// 4 1 3 2 5
// 2회차 (n -2)
// 1 4 3 2 5
// 1 3 4 2 5
// 1 3 2 4 5
// 3회차 (n -3)
// 1 3 2 4 5
// 1 2 3 4 5
// 4회차 (n -4)
// 1 2 3 4 5
// 인덱스
// 0, 1
// 1, 2
// 2, 3
// 3, 4
for(int j= 0 ; j<arr.length -1; j++) {
boolean change = false;
int cnt = 0;
for(int i = 0 ; i < arr.length - 1 -j ; i++) {
if(arr[i] > arr[i+1]) {
int tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
change = true; //
cnt++;
}
}
if(!change) break; //
System.out.println(j + 1 + "회차" + Arrays.toString(arr) + cnt + " 번 이동");
}
}
}
3. 배열 선언 초기화 코드 중 잘못 된 것을 고르기
1. int[] arr = {1, 2, 3};
2. int arr[3];
3. int[] arr = new int[3];
4. int arr[3] = new int[3];
2,4 번 선언 불가!
4. 다음 2차원 배열의 길이와 2번 인덱스의 길이를 작성하시오.
package Excercise;
public class Excercise2 {
public static void main(String[] args) {
int [][] arr = {
{1},
{1, 2},
{1, 2, 3},
{1, 2, 3, 4}
};
System.out.println("arr의 길이 : " + arr.length);
System.out.println("arr[2]의 길이 : " + arr[2 ].length);
}
}
생각한 방법
2차원 배열의 길이는 4
2번 인덱스의 길이는 3이다.
5. 다음 배열에 담긴 점수들의 합계 점수와 평균 점수를 출력하는 코드를 완성하시오.
package Excercise;
public class Excercise3 {
public static void main(String[] args) {
int[] score = {90, 80, 60, 100};
int totalScore = 0;
double avgScore = 0;
// 코드작성
for (int i = 0; i<score.length;i++) {
totalScore += score[i];
avgScore = totalScore / (double)score.length;
}
System.out.println("합계점수 : " + totalScore);
System.out.println("평균점수 : " + avgScore);
}
}
생각한 방법
score라는 배열은 인덱스가 4까지있는 배열이다.
for문을 이용하여 인덱스 번호에 있는 데이터 값을 totalScore에 지속해서 더해 합계를 구하였고
totalScore라는 합계에서 배열의 길이로 나누게 되면 avgScore라는 평균이 나오게 된다.
이 때 Score.legth가 double 타입이 아니게 되면 결과값이 정수만 나오게 된다.
6. 하나의 배열엔 1부터 10까지 10개의 정수가 저장되어 있다. 각각의 값을 다른 배열의 해당 인덱스 값에 제곱값을 대입 하는 코드를 완성하시오.
예) num1 = {1, 2, 3};
num2 = {1, 4, 9};
package Excercise;
import java.util.Arrays;
public class Excercise4 {
public static void main(String[] args) {
int[] num1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] num2 = new int[10];
// 코드작성
for(int i =0; i<num1.length;i++) {
num2[i] = num1[i] * num1[i];
}
System.out.println(Arrays.toString(num2));
// num2 출력
// for (int i=0; i<num2.length; i++); {
// System.out.println(num2[i]);
// }
}
}
생각한 방법
'Full Stack > JAVA' 카테고리의 다른 글
[풀스택과정] JAVA 7장 클래스(3) (1) | 2023.01.17 |
---|---|
[풀스택과정] JAVA 7장 클래스(2) (1) | 2023.01.16 |
[풀스택과정] JAVA 6장 배열, 7장 클래스(1) (0) | 2023.01.13 |
[풀스택과정] JAVA 6장 배열 (0) | 2023.01.12 |
[풀스택과정] JAVA 5장 제어문 (0) | 2023.01.11 |