1. 8칸 크기의 배열을 선언하고 랜덤수로 초기화 후, 가장 큰 수와 작은 수 출력.
풀이
package java_fes_2;
import java.util.Arrays;
import java.util.Random;
public class moon_01 {
public static void main(String[] args) {
// 8칸 크기의 배열을 선언하고 랜덤수로 초기화 한 후
// 가장 큰수와 작은 수를 구해 각각 출력하기.
int[] tes = new int[8];
Random r = new Random();
for(int i=0;i<8;i++) {
tes[i] = r.nextInt(100);
System.out.print(tes[i]+" ");}
System.out.println();
Arrays.sort(tes);
System.out.println("가장 작은값 : " + tes[0]);
System.out.println("가장 큰값 : "+tes[7]);}}
8칸 배열을 생성 후, 랜덤 수로 채운다. 그 후에 MIN 값과 MAX 값을 찾는다.
- 8칸의 크기를 가진 배열 tes 를 생성한다.
- r 이란 변수에 Random 명령어를 쓰기 위해 담아준다.
- sort 를 통해 오름차순으로 정렬되었기에 인덱스 0과 7이 각각 최솟값, 최댓값일 것.
%솔직히 수업의 의의에 맞게 푼건 아니다.
sort 명령어가 아닌 for문이라던지 다른 방법으로 정렬을 한 뒤에 크기를 비교하고 출력하는게 해당 문제를 풀게 한 이유였을 것이다. 정렬법을 위한 문제
2. 학생들의 성적정보가 문자열로 선언되어 있을 때, 각 성적 별 학생 수.
풀이
package java_fes_2;
public class moon_02 {
public static void main(String[] args) {
// 학생들의 성적정보가 문자열로 선언되어 있을 때 각 성적 별 학생수를 출력하시오.
String score = "A,A,B,C,D,A,C,D,D,D,F";
String[] tes = score.split(",");
int cnt_a=0;
int cnt_b=0;
int cnt_c=0;
int cnt_d=0;
int cnt_f=0;
for(int i=0;i<tes.length;i++) {
if(tes[i].equals("A")) {
cnt_a+=1;
}else if(tes[i].equals("B")) {
cnt_b+=1;
}else if(tes[i].equals("C")) {
cnt_c+=1;
}else if(tes[i].equals("D")) {
cnt_d+=1;
}else if(tes[i].equals("F")) {
cnt_f+=1;
}}
System.out.println("A : "+cnt_a+"명\nB : "+cnt_b+"명\nC : "+cnt_c+"명\nD : "
+cnt_d+"명\nF : "+cnt_f+"명");}}
score 라는 변수에 학생의 성적이 입력되어 있을 때, 각 학점의 수 입력
- cnt 라는 변수 뒤에 학점을 기입, 각 학점별 갯수를 나타내는 변수 선언
- tes 라는 변수에 문자열 score를 split 명령어를 통해 " , " 기준으로 String 배열로 만들어주었다.
- 혹시나 해서 적지만, String 형태 한정 같다 다르다를 비교하기 위햇서는 equals 라는 명령어를 사용한다.
3. 중복이 없이 숫자를 뽑는 로또 프로그램 만들기.
풀이
package java_fes_2;
import java.util.Random;
public class moon_03 {
public static void main(String[] args) {
// 중복이 없이 숫자를 뽑는 로또 프로그램을 만드시오
// 로또는 총 6자리
int tes[] = new int[6];
Random r = new Random();
for(int i=0;i<6;i++) {
tes[i]=r.nextInt(99)+1;
for(int j=0;j<i;j++) {
if(tes[i] == tes[j]) {
--i;}}}
for(int i=0;i<tes.length;i++) {
System.out.println("행운의 숫자는 >> "+tes[i]);}}}
랜덤수로 6칸을 가진 배열을 채우는데, 중복이 없어야 한다.
- Random 메소드를 통해 난수를 생성한다.
- 범위는 99란 수를 대입하면 0~98까지 생성, 때문에 +1을 해주어 1~99까지 표기토록 하였다.
- 난수를 생성할때마다 매번 반복문을 통해 그동안 만들었던 난수 중 일치하는게 있는지 조건문을 걸었다.
- 만일 동일한게 있다면 1번째 반복문 변수인 i 값을 감소시켜서 해당 Index에 대해 난수를 다시 부여하였다.
4. 정수 n을 입력 받아 1,2,4,7,11과 같은 수열의 n번째 항까지 출력.
풀이
package java_fes_2;
import java.util.Scanner;
public class moon_04 {
public static void main(String[] args) {
// 정수 n을 입력받아 1,2,4,7,11과 같은 수열의 n번째 항까지 출력하시오
Scanner sc = new Scanner(System.in);
System.out.print("n 입력 : ");
int n = sc.nextInt();
int cnt=0;
int va=1;
for(int i=0;i<n;i++) {
System.out.print(cnt+va+" ");
va+=cnt;
cnt+=1;}}}
수열을 보면 1씩 커지는 값을 다음 항에 더해주어 나열되는 규칙을 갖고 있다.
- n번째 항은 n-1번째 항에 n-1만큼 더해준 값이다.
- cnt 는 1씩 증가하는 변수로 각 항에 더해주는 값이다.
- va 변수는 각 항에 표기될 값이다.
5. 문자열 형태의 2진수를 입력 받아 10진수로 바꾸는 프로그램.
풀이
package java_fes_2;
import java.lang.Math;
import java.util.Scanner;
public class moon_05 {
public static void main(String[] args) {
// 문자열 형태의 2진수를 입력 받아 10진수로 바꾸는 프로그램을 작성하십시오.
System.out.println((int)Math.pow(4,2));
Scanner sc = new Scanner(System.in);
System.out.print("2진수를 입력 >> ");
String st = sc.next();
String[] st_a = st.split("");
int cnt=0;
for(int i=0;i<st_a.length;i++) {
if(st_a[i].equals("1")) {
cnt+=(int)Math.pow(2, st_a.length-i-1);}
System.out.println(st_a[i]);}
System.out.println(st+"(2) = "+cnt+"(10)");
System.out.println(st_a.length);}}
2진수를 입력 받으면 해당 값을 10진수로 변환해준다.
- 2진수 값을 String 형태로 입력 받는다.
- 입력 받은 값을 st_a 라는 변수에 split 을 이용해 String형 배열로 담아준다.
- cnt 변수에 2진수를 10진수로 변환했을 때의 값을 더해 나갔다.
- 명령어 Math.pow(제곱할 수, 지수) 는 입력한 수를 입력한 지수만큼 제곱 연산 행한다.
- Math.pow를 통해 도출한 결과가 double 형태이기 때문에 int형으로 명시적 형변환 을 진행해준다.
6. 정수 N을 입력 받아 N X N 배열에 숫자를 저장하고 출력.
풀이
package java_fes_2;
import java.util.Scanner;
public class moon_06 {
public static void main(String[] args) {
// 정수 N을 입력받아 N*N 배열에 1열부터 차례대로 기입되는 코드를 입력하기
// -> 1열 1행부터 쭉~, 다음은 2열 쭉~ .... N열 쭉~~~
Scanner sc = new Scanner(System.in);
System.out.print("정수 N을 입력하세용 >> ");
int n = sc.nextInt();
int[][] tes = new int[n][n];
int cnt=1;
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
tes[j][i] = cnt;
cnt+=1;}
System.out.println();}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
System.out.print(tes[i][j]+"\t");}
System.out.println();}}}
입력 받은 정수만큼의 행렬을 Column에 따라 값을 대입시켜 나간다.
- 첫번째, 두번째 반복문 변수 i , j 를 각각 Column, Row라 생각하고 값을 대입.
- cnt 라는 변수를 1부터 시작하여 1씩 증가시켜주었다.
- 출력할 때는 정상적인 순서로 하여 출력. ( i는 Row, j는 Column )
7. 정수 N을 입력 받아 N X N 배열에 숫자를 저장하고 출력.
풀이
package java_fes_2;
import java.util.Scanner;
public class moon_07 {
public static void main(String[] args) {
// 정수 N을 입력받아 N*N 배열에 1행 부터 차례대로 값을 기입하기.
Scanner sc = new Scanner(System.in);
System.out.print("정수 N을 입력하세용 >> ");
int n = sc.nextInt();
int[][] tes = new int[n][n];
int cnt=1;
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
tes[i][j] = cnt;
cnt+=1;
System.out.print(tes[i][j]+"\t");}
System.out.println();}}}
6번과 같은 문제. 6번이 Column 단위로 값을 대입했다면, 해당 문제는 Row 단위로 값을 대입한다.
- 값을 행 단위로 대입하는것이기 때문에, 출력 또한 입력과 동시에 이뤄지도록 코드를 짰다.
- 출력은 행 단위로 출력하는게 일반적. 왜냐면 출력문을 통한 띄어쓰기 등은 열 단위가 아닌 행 단위로 이뤄지니까
8. 1차원의 점들이 주어졌을 때, 점들 중 거리가 가장 짧은 점의 Index를 각각 출력할 것.
풀이
package java_fes_2;
import java.util.Arrays;
public class moon_08 {
public static void main(String[] args) {
// 1차원 점들이 주어졌을 때, 그 중 가장 거리가 짧은 점(index)들을 출력하시오.
// point = {92, 32, 52, 9, 81, 2, 68}
int[] point = {92, 32, 52, 9, 81, 2, 68};
int cnt=0;
int x=0;
int y=0;
System.out.print("result = [");
for(int i=0;i<point.length;i++) {
for(int j=0;j<point.length;j++) {
if(i!=j &&(cnt==0 || cnt>Math.abs(point[i]-point[j]))) {
cnt=Math.abs(point[i]-point[j]);
x=i;
y=j;}}}
System.out.println(x+", "+y+"]");}}
1차원의 점들이 주어졌을 때 각 점들의 거리를 구하여 최소거리를 나타내는 점들의 Index를 출력하는 문제.
- 거리 값을 나타내는 변수는 cnt 로 주었다.
- 최소값을 갖는 거리를 나타내는 두개의 점을 각각 x , y 로 지정
- 정렬되어있지 않는 관계로 이중 for문을 통해 모든 점들의 거리를 구하는데, Math.abs 명령어를 통해 절댓값으로 환산하여 최소 거리를 판별하였다.
- 매번 최소 거리가 생길때마다 좌표와 거리 값이 변동된다.
9. 5개의 정수를 입력 받아 오름차순으로 정렬 후 출력.
풀이
package java_fes_2;
import java.util.Arrays;
import java.util.Scanner;
public class moon_09 {
public static void main(String[] args) {
// 5개의 정수를 입력 받아 오름차순 정렬하여 출력하는 프로그램을 구현하기
// 선택 정렬 문제.
// 근데 나는 선택정렬로 안품... sort 썼는디...
Scanner sc = new Scanner(System.in);
int[] tes = new int[5];
for(int i=0;i<5;i++) {
System.out.print(i+1+"번째 수 입력 : ");
tes[i] = sc.nextInt();}
Arrays.sort(tes);
System.out.println("정렬 후");
for(int i=0;i<5;i++) {
System.out.print(tes[i]+" ");}}}
5개의 정수를 입력 받아 오름차순으로 정렬하는 문제. 선택정렬을 사용토록 하였으나... sort 써서 풀었다.
- 으으으으으음.... sort 썼다.
선택정렬에 대한 내용은 수업의 19일차에 정리하였으며 코드 또한 첨부하였다. 참고하자.
10. 2차원 배열을 왼쪽으로 90도 회전하여 출력하기.
풀이
package java_fes_2;
public class moon_10 {
public static void main(String[] args) {
// 2차원 배열 왼쪽으로 90도 회전하여 출력하기
int cnt=1;
int n = 5;
int[][] tes = new int[n][n];
System.out.println("원본");
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
tes[i][j] = cnt;
cnt+=1;
System.out.print(tes[i][j]+"\t");}
System.out.println();}
// ==================================================
int[][] tes_r = new int[n][n];
System.out.println("\n90도 회전");
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
tes_r[i][j] = tes[j][n-i-1];
System.out.print(tes_r[i][j]+"\t");}
System.out.println("");}}}
주석을 기준으로 원본과 회전된 배열이다.
- 90도로 회전시켰다는 거는 (1,1~Col)의 값들을 (1~Row,1)로 옮긴다는 의미.
- 하지만 나는 값을 입력과 동시에 출력하기 위해 다른 방법을 썼다.
- 원본의 배열을 기준으로 보면 회전된 행렬의 1행에는 5열의 값이, 2행에는 4열의 값이 들어간다.
- 이를 통해 위의 코드를 작성하였다.
- n - i - 1 이라는 값은 2번째 반복문에서 고정되며, 마지막 열부터 첫 열까지 돌아오도록 설계하였다.
11. 2차원 배열을 왼쪽으로 180도 회전하여 출력하기.
풀이
package java_fes_2;
public class moon_11 {
public static void main(String[] args) {
// 2차원 배열 왼쪽으로 180도 회전하여 출력하기
int cnt=1;
int n = 5;
int[][] tes = new int[n][n];
System.out.println("원본");
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
tes[i][j] = cnt;
cnt+=1;
System.out.print(tes[i][j]+"\t");}
System.out.println();}
// ==================================================
int[][] tes_r = new int[n][n];
System.out.println("\n180도 회전");
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
tes_r[i][j] = tes[n-1-i][n-1-j];
System.out.print(tes_r[i][j]+"\t");}
System.out.println("");}}}
주석을 기준으로 원본과 회전된 배열이다.
- (1,1~Col) 데이터들은 회전 된 배열에 (Row, Col~1) 순으로 들어가게 된다.
- 즉, Row도 Column도 원본의 마지막 값에서 시작하여 대입하게 된다.
- 배열의 크기에 점차적으로 증가하는 반복문 변수 2개를 각각 빼주고, 추가적으로 Index와 크기가 실질적으로 1만큼의 차이가 나기에 추가적으로 1을 빼주었다.
- 값을 대입해줌과 동시에 출력토록 구성하였다.
'국비교육기관 > 숙제' 카테고리의 다른 글
자바_알고리즘_문제풀이_3차 (0) | 2021.04.11 |
---|---|
자바_알고리즘_문제풀이_1차 (0) | 2021.04.11 |
오라클SQL_교재2권_14장숙제풀이 (1) | 2021.03.30 |
댓글