✅ 답안과 비교하여 스스로 코드 개선점 짚어보기 완료(2022.01.03)
1. 배열
HARD1. 배열의 중간까지 오름차순, 중간 이후 내림차순 적용하기 ✅
답안에서는 중간까지의 길이를 int mid = (int)(num / 2 + 1);처럼 별도 변수에 표현했다.
int cnt=0; 이라는 임의의 변수를 사용해 중간길이 미만까지는 cnt++; 그 이후는 --cnt;로 증감연산자를 활용하기도 했다.
if문 안에 증가할 때 / 감소할 때 / 출력용으로 for문이 총 3개 자리한 것이다.
iarr[i] = iarr.length - i; 내림차순 적용에 세운 식을 기억해두면 앞으로 활용할 일이 더 있지 않을까 싶다.
홀수인 양의 정수를 입력하세요 : 9
123454321
package com.greedy.section01.array.level03.hard;
import java.util.Scanner;
public class Application1 {
public static void main(String[] args) {
/* 홀수인 양의 정수를 입력 받아 입력 받은 크기 만큼의 정수형 배열을 할당하고
* 배열의 중간까지는 1부터 1씩 증가하여 오름차순으로 값을 넣고,
* 중간 이후부터 끝까지는 1씩 감소하여 내림차순으로 값 넣어 출력하세요
*
* 단, 홀수인 양의 정수를 입력하지 않은 경우에는 "양수 혹은 홀수만 입력해야 합니다."를 출력하세요
*
* -- 입력 예시 --
* 홀수인 양의 정수를 입력하세요 : 7
*
* -- 출력 예시 --
* 1 2 3 4 3 2 1
*
* -- 입력 예시 --
* 홀수인 양의 정수를 입력하세요 : 8
*
* -- 출력 예시 --
* 양수 혹은 홀수만 입력해야 합니다.
*/
Scanner scanner = new Scanner(System.in);
System.out.print("홀수인 양의 정수를 입력하세요 : ");
int num = scanner.nextInt();
int[] iarr = new int[num];
while(true) {
/* 음수이고 짝수이면 */
if(!(num > 0 && num % 2 != 0)) {
System.out.println("양수 혹은 홀수만 입력해야 합니다.");
break;
/* 양수이고 홀수이면 */
} else {
for(int i=0; i < iarr.length; i++) {
if(i > iarr.length / 2) {
iarr[i] = iarr.length - i;
} else {
iarr[i] = i + 1;
}
System.out.print(iarr[i]);
}
break;
}
}
}
}
ADVANCED1. 로또 번호 생성하기 ✅
총 세 가지 for문으로 구성된다. 첫째는 45개의 난수를 배정하고, 같은 번호가 들어있는 인덱스를 판단해 i--; 임의로 번호를 수정해준다. 둘째는 문제 조건에 따라 오름차순 정렬한다. 마지막으로 출력한다.
10 19 24 35 37 45
package com.greedy.section01.array.level04.advanced;
public class Application1 {
public static void main(String[] args) {
/* 로또번호 생성기
* 6칸 짜리 정수 배열을 하나 생성하고
* 1부터 45까지의 중복되지 않는 난수를 발생시켜 각 인덱스에 대입한 뒤
* 오름차순 정렬하여 출력하세요
* */
int[] iarr = new int[6];
for(int i=0; i < iarr.length; i++) {
int random = (int)(Math.random() * 45) +1;
iarr[i] = random;
for(int j=0; j < i; j++) {
if(iarr[i] == iarr[j]) {
i--;
}
}
}
for(int i=0; i < iarr.length; i++) {
for(int j=0; j < iarr.length; j++) {
if(iarr[i] < iarr[j]) {
int tmp;
tmp = iarr[i];
iarr[i] = iarr[j];
iarr[j] = tmp;
}
}
}
for(int i=0; i < iarr.length; i++) {
System.out.print(iarr[i] + " ");
}
}
}
ADVANCED2. 숫자야구 게임 만들기 ✅
네 자리 숫자를 입력 받을 때 String으로 유도한 뒤, user[i] = (int)(input.charAt(i) - '0'); 구문을 써서 각각의 숫자들을 배열 index 데이터에 반영하는 것이 요점이었다. S와 B를 카운팅하기 위해서는 자릿수 비교가 반드시 필요한데 처음 막혔던 부분도 바로 여기였다. String으로 받아 charAt(i)을 통해 낱개 단위로 쪼갠 다음 거기서 '0'을 빼주면 숫자만 남을 것이기 때문이다. 앞으로도 활용도가 있을 것 같다.
1 3 2 5
도전 기회가 10회 남았습니다.
4자리 숫자를 입력하세요. > 0235
아쉽네요. 1S 2B 입니다.
도전 기회가 9회 남았습니다.
4자리 숫자를 입력하세요. > 0325
정답입니다!
package com.reminder.array_practice;
import java.util.Scanner;
public class ArrayEx03 {
public static void main(String[] args) {
/* 숫자야구 게임 */
/* 랜덤 숫자 배정(중복 체크 포함) */
int[] number = new int[4];
for(int i=0; i < number.length; i++) {
int random = (int)(Math.random() * 10);
number[i] = random;
for(int j=0; j < i; j++) {
if(number[i] == number[j]) {
i--;
}
}
}
/* 정답 확인 */
for(int i=0; i < number.length; i++) {
System.out.print(number[i] + " ");
}
System.out.println();
/* 변수와 반복문 활용 */
int countS=0;
int countB=0;
int times=10;
int[] user = new int[4];
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.println("도전 기회가 " + times + "회 남았습니다.");
System.out.print("4자리 숫자를 입력하세요. > ");
String input = scanner.nextLine();
if(input.length() != 4) {
System.out.println("4자리 정수를 입력해야 합니다.");
} else {
times--;
for(int i=0; i < number.length; i++) {
user[i] = (int)(input.charAt(i) - '0');
if(number[i] == user[i]) {
countS++;
}
}
for(int i=0; i < number.length; i++) {
for(int j=0; j < number.length; j++) {
if(number[i] != user[i] && number[i] == user[j]) {
countB++;
}
}
}
}
if(countS == 4) {
System.out.println("정답입니다!");
break;
} else {
System.out.println("아쉽네요. " + countS + "S " + countB + "B 입니다.");
}
if(times == 0) {
System.out.println("10번의 기회를 모두 소진하셨습니다. Game Over!");
break;
}
}
}
}
package com.greedy.section01.array.level04.advanced;
import java.util.Scanner;
public class Application2 {
public static void main(String[] args) {
/* 숫자 야구게임 만들기
* 길이 4의 정수 배열을 만들고 각 인덱스에는 0 ~ 9까지의 중복되지 않는 난수를 저장한다.
* 4자리 숫자를 입력받아 스트라이크, 볼 등의 힌트를 주며 4자리 난수 숫자를 맞추는 게임이다.
* 숫자와 자리가 모두 맞는 경우 스트라이크, 숫자는 맞지만 자리는 맞지 않는 경우는 볼 이다.
* 예) 9183 으로 난수가 발생하면 9356 입력 시 1S 1B이다.
*
* 단, 기회는 총 10번이며, 10번 이내에 맞추는 경우 "정답입니다." 출력 후 게임 종료
* 10번의 기회가 모두 소진 되면 "10번의 기회를 모두 소진하셨습니다. 프로그램을 종료합니다." 출력 후 종료
*
* 또한 4자리의 정수를 입력하지 않은 경우에는 "4자리의 정수를 입력해야 합니다." 출력 후 입력을 다시 받을 수 있되
* 횟수는 차감하지 않는다.
*
* -- 프로그램 예시 (난수 7416 의 경우) --
*
* 10회 남으셨습니다.
* 4자리 숫자를 입력하세요 : 1234
* 아쉽네요 0S 2B 입니다.
* 9회 남으셨습니다.
* 4자리 숫자를 입력하세요 : 5678
* 아쉽네요 0S 2B 입니다.
* 8회 남으셨습니다.
* 4자리 숫자를 입력하세요 : 7416
* 정답입니다.
* */
2. 다차원 배열
HARD1. 출석부 출력하기 ✅
== 1분단 ==
홍길동 이순신
유관순 윤봉길
장영실 임꺽정
== 2분단 ==
장보고 이태백
김정희 대조영
김유신 이사부
검색할 학생 이름을 입력하세요 : 이사부
검색하신 이사부학생은 2분단 세 번째 줄 오른쪽에 있습니다.
package com.greedy.section02.demensional_array.level03.hard;
import java.util.Scanner;
public class Application1 {
public static void main(String[] args) {
/* 길이 12의 문자열 배열을 생성하여 12명의 학생들을 출석부 순으로 1차원 배열에 할당하고,
* 2열 3행 2차원 배열을 2개 할당하여 각 1분단 2분단이라고 칭한다.
* 순차적으로 1분단 부터, 왼쪽부터 오른쪽, 1행에서 아래 행으로 번호 순으로 자리를 배치하고 출력하세요
*
* -- 출석부 --
* 1. 홍길동
* 2. 이순신
* 3. 유관순
* 4. 윤봉길
* 5. 장영실
* 6. 임꺽정
* 7. 장보고
* 8. 이태백
* 9. 김정희
* 10. 대조영
* 11. 김유신
* 12. 이사부
*
* -- 출력 예시 --
* == 1분단 ==
* 홍길동 이순신
* 유관순 윤봉길
* 장영실 임꺽정
*
* == 2분단 ==
* 장보고 이태백
* 김정희 대조영
* 김유신 이사부
*
* 출력한 이후 학생 이름을 입력 받아 몇 분단 몇 번째 줄 왼쪽/오른쪽 에 위치하는지를 출력하세요
*
* -- 입력 예시 --
* 검색할 학생 이름을 입력하세요 : 대조영
* 검색하신 대조영은 2분단 두 번째 줄 오른쪽에 있습니다.
*/
String[] students = {"홍길동", "이순신", "유관순", "윤봉길", "장영실", "임꺽정", "장보고", "이태백", "김정희", "대조영", "김유신", "이사부"};
String[][] part1 = new String[3][2];
String[][] part2 = new String[3][2];
int tmp = 0;
for(int i=0; i < part1.length; i++) {
for(int j=0; j < part1[i].length; j++)
part1[i][j] = students[tmp++];
}
for(int i=0; i < part2.length; i++) {
for(int j=0; j < part2[i].length; j++)
part2[i][j] = students[tmp++];
}
System.out.println("== 1분단 ==");
for(int i=0; i < part1.length; i++) {
for(int j=0; j < part1[i].length; j++) {
System.out.print(part1[i][j] + " ");
}
System.out.println(); //위치 중요!
}
// System.out.println();
System.out.println("== 2분단 ==");
for(int i=0; i < part2.length; i++) {
for(int j=0; j < part2[i].length; j++) {
System.out.print(part2[i][j] + " ");
}
System.out.println();
}
Scanner scanner = new Scanner(System.in);
System.out.print("검색할 학생 이름을 입력하세요 : ");
String search = scanner.nextLine();
String part = "";
String order = "";
String side = "";
for(int i=0; i < part1.length; i++) {
for(int j=0; j < part1[i].length; j++) {
if(search.equals(part1[i][j])) {
part = "1";
if(search.equals(part1[0][j])) {
order = "첫";
} else if(search.equals(part1[1][j])) {
order = "두";
} else {
order = "세";
}
if(search.equals(part1[i][0])) {
side = "왼";
} else {
side = "오른";
}
break;
} else if(search.equals(part2[i][j])) {
part = "2";
if(search.equals(part2[0][j])) {
order = "첫";
} else if(search.equals(part2[1][j])) {
order = "두";
} else {
order = "세";
}
if(search.equals(part2[i][0])) {
side = "왼";
} else {
side = "오른";
}
break;
}
}
}
System.out.println("검색하신 " + search + "학생은 " + part + "분단 " + order + " 번째 줄 "+ side + "쪽에 있습니다.");
}
}
HARD2. 모래시계 모양으로 별 찍기 ✅
증감식을 활용해 답을 구하기만 했었는데, 사실 배열 과정인 만큼 답안처럼 작성해보는 게 필요했다.
홀수 하나를 입력하세요 : 5
*****
***
*
***
*****
package com.greedy.section02.demensional_array.level03.hard;
import java.util.Scanner;
public class Application2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("홀수 하나를 입력하세요 : ");
int num = scanner.nextInt();
if(num % 2 == 0) {
System.out.println("홀수만 입력해야 합니다.");
return;
}
int[][] iarr = new int[num][num];
for(int i=0; i < iarr.length; i+=2) {
for(int j=0; j < i; j+=2) {
System.out.print(" ");
}
for(int k=0; k < iarr.length-i; k++) {
System.out.print("*");
}
System.out.println();
}
for(int i=iarr.length-2; i > 0; i -= 2) {
for(int j=1; j < i; j += 2) {
System.out.print(" ");
}
for(int k=0; k <= iarr.length-i; k++) {
System.out.print("*");
}
System.out.println();
}
}
}
package com.greedy.section02.demensional_array.level03.hard;
import java.util.Scanner;
public class Application2 {
public static void main(String[] args) {
/* 홀수를 하나 입력 받아 입력받은 크기 만큼의 정사각형 형태의 2차원 배열을 할당하고
* 모래시계 모양으로 *을 출력하세요
*
* -- 입력 예시 --
* 홀수 하나를 입력하세요 : 5
*
* -- 출력 예시 --
* *****
* ***
* *
* ***
* *****
*
* 단, 홀수를 입력하지 않은 경우 "홀수만 입력해야 합니다." 출력
* */
Scanner sc = new Scanner(System.in);
System.out.print("홀수 하나를 입력하세요 : ");
int row = sc.nextInt();
int col = row;
int center = (int) row / 2;
int start = 0;
int end = col;
int rowstart = 0;
String star[][] = new String[row][col];
if(row % 2 == 1) {
for(int i = 0; i < star.length; i++) {
for(int j = start; j < star[i].length; j++) {
star[i][j] = " ";
}
}
for(int i = 0; i < star.length; i++) {
for(int j = start; j < end; j++) {
star[i][j] = "*";
}
if(rowstart < center){
start++;
end--;
rowstart++;
} else {
start--;
end++;
rowstart++;
}
}
for(int i = 0; i < star.length; i++) {
for(int j = 0; j < star.length; j++) {
System.out.print(star[i][j]);
}
System.out.println();
}
} else {
System.out.println("홀수만 입력해야 합니다.");
}
}
}
ADVANCED1. 과목별 합계, 학생별 총점 및 평균 구하기
package com.greedy.section02.demensional_array.level04.advanced;
public class Application1 {
public static void main(String[] args) {
/* 세 명의 학생 성적 정보를 2차원 배열에 초기화 한 후
* 과목별 합계, 학생별 총점 및 평균을 구하여 출력하세요
*
* -- 출력 예시 --
* ================== A반 성적표 ====================
* 이름 국어 영어 수학 합계 평균
* -----------------------------------------------
* 홍길동 80 90 77 247 82.3
* 이순신 78 97 86 261 87.0
* 유관순 71 68 88 227 75.7
* -----------------------------------------------
* 합계 229 255 251 735 81.7
* */
int arr[][] = {{80, 90, 77}, {78, 97, 86},{71, 68, 88}};
String name = "";
System.out.println("================== A반 성적표 ====================");
System.out.println(" 이름 국어 영어 수학 합계 평균");
System.out.println("-----------------------------------------------");
for(int i = 0; i < arr.length; i++) {
switch(i) {
case 0 : name = "홍길동"; break;
case 1 : name = "이순신"; break;
case 2 : name = "유관순"; break;
}
System.out.print(" " + name + " ");
for(int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]);
if(j != arr[i].length - 1) {
System.out.print(" ");
} else {
int sum = 0;
float avg = 0.0f;
for(int k = 0; k < arr[i].length; k++) {
sum += arr[i][k];
}
avg = (float) sum / arr[i].length;
avg = ((float) Math.round(avg * 10)) / 10;
System.out.print(" " + sum + " " + avg);
}
}
System.out.println();
}
System.out.println("-----------------------------------------------");
System.out.print(" 합계 ");
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
int total = 0;
float avg = 0.0f;
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length;j++) {
if(j == 0) {
sum1 += arr[i][j];
}
if(j == 1) {
sum2 += arr[i][j];
}
if(j == 2) {
sum3 += arr[i][j];
}
}
}
total = sum1 + sum2 + sum3;
avg = (float) total / (float) (arr.length * arr[0].length);
avg = ((float) Math.round(avg * 10)) / 10;
System.out.print(" " + sum1 + " " + sum2 + " " + sum3 + " " + total + " " + avg);
}
}
'Java' 카테고리의 다른 글
[JAVA] 7. 객체배열 (0) | 2022.01.03 |
---|---|
[JAVA] 6-4. 클래스변수, 인스턴스변수, 지역변수, 초기화 순서 (0) | 2022.01.03 |
[자바의 정석] Ch 5. 배열 예제 응용 학습 (0) | 2022.01.02 |
[자바의 정석] Ch 5. 배열 연습문제 풀이 (0) | 2022.01.01 |
[JAVA/수업 Quiz] 클래스와 객체 | 오버로딩 | DTO (0) | 2021.12.31 |