으어어어어 실습과제 너무 어렵고 많은것 ㅠㅠ
배열부터 객체지향까지 진도가 금방 끝나고 나머지는 복습이랑 실습시간인데 복습시간에 조금이라도 더 이해하고 실습과제 적용해보도록 노력해야겠다.
실습문제 풀다보니까 분산이나 표준편차 이런걸 배웠었나.. 언제적 기억을 더듬더듬.. 영어뿐만 아니라 수학도 잘해야 하는거였......ㅠ
배열 : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
실습문제 1.
- 10명의 학생들의 성적을 저장하는 배열 int[] scores를 만들고 성적을 입력받고자 한다.
- 학생 성적의 최댓값, 최솟값, 평균, 분산, 표준편차반환하는 프로그램을 작성해보자. 원소중복 가능
- 분산 계산법
표준편차 계산법
- 힌트
- 최댓값과 최솟값 - Integer 클래스 이용
- 정수값 중 최대값: Integer.MAX_VALUE (2^31-1)
- 정수값 중 최소값: Integer.MIN_VALUE (-2^31)
- 평균과 분산 - Math 클래스 이용
- 루트 : Math.sqrt(expression);
- 제곱: Math.pow(n, 2);
- 최댓값과 최솟값 - Integer 클래스 이용
import java.util.Arrays;
import java.util.Scanner;
public class Practice01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] scores = new int[10];
for (int i = 0; i < scores.length; i++) {
System.out.print((i + 1) + "번째 점수를 입력하세요 ");
scores[i] = sc.nextInt();
}
System.out.println(Arrays.toString(scores));
int max = scores[0];
int min = scores[0];
int sum = 0;
double average = 0;
double var = getVariance(scores, average); //분산
double std = getStandardDeviation(var); // 표준편차
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
if (scores[i] > max) {
max = scores[i];
} else if (scores[i] < min) {
min = scores[i];
}
}
average = sum / (double) scores.length;
System.out.println("최댓값: " + max);
System.out.println("최솟값: " + min);
System.out.println("평균: " + average);
System.out.println("분산:" + var);
}
private static double getVariance(int[] scores, double average) {
double result = 0; //분산을 저장할 변수
for (int i = 0; i < scores.length; i++) {
result = result + Math.pow((scores[i] - average), 2); // result변수 = result변수에 있던값 + Math.pow((어떤학생- 학생들의 평균), 제곱)
} // 제곱 : Math.pow(n, 2);
return result / scores.length; //제곱된 값들의 평균을 반환
}
private static double getStandardDeviation(double var) { // 표준편차 = 분산의 루트값
return Math.sqrt(var); //루트 : Math.sqrt(expression);
}
}
※ 1번 과제 point
평균 : for문을 이용해서 배열에 저장된 값을 모두 더한 후 배열의 길이인 scores.length로 나누어서 계산한다.
평균값은 정수인 int 타입으로는 정확한 결과가 나오지 않기 때문에 형변환 배열 길이를 double타입으로 변환 후 계산한다.
최대값과 최소값
배열의 첫 번째 요소 score[0]의 값으로 최대값과 최소값 변수 max,min을 초기화 한 후 두번째 요소인 score[1]부터 최대값 max와 비교하여 저장한다. 최소값 min도 같은 방식으로 계산.
실습문제 2.
- 100개의 정수를 저장하는 배열 int[] nums를 만들고 1 ≤ 정수 ≤ 100 사이의 랜덤값으로 초기화하자.
- 랜덤값 생성 방법 - Math.random() 함수 이용
- 배열의 원소 중 최댓값과 최솟값을 구하는 프로그램을 작성해보자. 원소중복 가능
import java.lang.reflect.Array;
import java.util.Arrays;
//- 100개의 정수를 저장하는 배열 `int[] nums`를 만들고 1 ≤ 정수 ≤ 100 사이의 랜덤값으로 초기화하자.
//- 랜덤값 생성 방법 - `Math.random()` 함수 이용
//- 배열의 원소 중 `최댓값`과 `최솟값`을 구하는 프로그램을 작성해보자. `원소중복 가능`
public class Practice02 {
public static void main(String[] args) {
int[] nums = new int[100];
for (int i=0; i < nums.length; i++) {
nums[i] = (int) (Math.random() * 100+1);
}
int max = nums[0];
int min = nums[0];
for (int i=0; i < nums.length; i++){
if (nums[i] > max){
max = nums[i];
} else if (nums[i] < min) {
min = nums[i];
}
}
System.out.println("최댓값 : " +max);
System.out.println("최솟값 : " +min);
}
}
※ 2번 과제 point
1번과제에서 풀었던 최대값과 최소값 방식과 동일
실습문제 3.
- 아래 테이블의 데이터를 저장하는 이차원 배열 int[][] scores2d를 만들자. 원소중복 없음
- 각 과목별 학생 성적 평균을 계산하는 프로그램을 작성해보자.
- 각 학생별 과목 성적 평균을 계산하는 프로그램을 작성해보자.
- 각 과목별 학생 성적 평균을 내림차순으로 정렬하고 각 성적을 받은 과목 이름도 같이 출력해보자.
- 각 학생별 과목 성적 평균을 오름차순으로 정렬하고 각 성적을 받은 학생 번호도 같이 같이 출력해보자.
import sun.print.SunMinMaxPage;
//- `각 과목별 학생 성적 평균`을 계산하는 프로그램을 작성해보자.
//- `각 학생별 과목 성적 평균`을 계산하는 프로그램을 작성해보자.
//- 각 과목별 학생 성적 평균을 `내림차순`으로 정렬하고 각 성적을 받은 `과목 이름`도 같이 출력해보자.
//- 각 학생별 과목 성적 평균을 `오름차순`으로 정렬하고 각 성적을 받은 `학생 번호`도 같이 같이 출력해보자.
public class Practice03 {
public static void main(String[] args) {
int[][] scores2d = {
{50, 60, 70}
,{60, 76, 100}
,{95, 88, 87}
,{60, 65, 85}
,{100, 85, 77}
};
int korTotal = 0, mathTotal = 0, engTotal = 0; // 과목별총점
float koravg = 0.0f, mathavg = 0.0f, engavg = 0.0f; // 과목별평균
System.out.println("학생번호 국어성적 수학성적 영어성적 각학생별과목성적평균");
for (int i=0; i < scores2d.length;i++){
int sum = 0; // 개인별 총점
double avg = 0; // 개인별 평균
korTotal += scores2d[i][0]; //국어성적합계 해댱열의 합계
mathTotal += scores2d[i][1]; //수학성적합계 해당열의 합계
engTotal += scores2d[i][2]; //영어성적합계 해당열의 합계
koravg = korTotal/(float)scores2d.length;
mathavg = mathTotal/(float)scores2d.length;
engavg = engTotal/(float)scores2d.length;
System.out.printf("%6d", i+1); //printf 연산가능 %d 10진수정수
for (int j=0; j < scores2d[i].length; j++){
sum += scores2d[i][j]; // 학생별 성적 합계
System.out.printf("%6d", scores2d[i][j]); // %6d 6칸만큼 오른쪽정렬 각 성적 출력
}
avg = sum/(double)scores2d[i].length; //평균계산
System.out.printf("%18.8f%n",avg); // %18.8f 18칸만큼 오른쪽정렬 후 소수점아래 8자리까지표기 실수 %n 줄바꿈
}
System.out.printf("각과목별학생성적평균%3.1f %3.1f %3.1f%n",koravg, mathavg, engavg);
}
}
※ 3번 과제 point
사실 3번과제는 출력해서 나온 값을 정렬해서 해야하는데 거기까지는 잘 모르겠어서 책에 예제로 나온 배열값 그대로 출력하는걸로 풀이했다. ㅠ
2차원배열 : 배열이름[행][열]
실습문제 4.
import java.util.Arrays;
import java.util.Scanner;
public class Practice04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] iArr = new String[sc.nextInt()]; //테스트케이스 개수
for (int i=0; i < iArr.length; i++){ //테스트케이스 개수만큼 문자열 배열로 저장
iArr[i] = sc.next();
}
for (int i = 0; i < iArr.length; i++) {
int cnt = 0; // 연속된 횟수
int sum = 0; // 연속된 O의개수 합
for (int j = 0; j < iArr[i].length(); j++) { // 입력한 문자열안에서 반복
if (iArr[i].charAt(j) == 'O'){ // 입력한문자열의 문자가 O와 같으면
cnt ++; // O의 연속된 횟수 증가
} else {
cnt =0; // O가 아니면 연속된횟수는 0
}
sum += cnt; // 연속된O의개수 합산
}
System.out.println(sum);
}
}
}
※ 4번 과제 point
배열과 for문 중첩, 조건문 적용
실습문제 5.
import java.util.Scanner;
public class Practice05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[26]; // 영문자 총 26개의 배열
String str = sc.next(); // 입력받을 문자열
for (int i = 0; i < str.length(); i++) { // 입력받은 문자열 첫번째문자부터 마지막문자까지 검사
if (65<= str.charAt(i) && str.charAt(i) <= 90){ // 아스키코드 대문자 범위, str.charAt() 문자열에서 특정인덱스에 위치하는 유니코드 단일문자반환
arr[str.charAt(i) - 65]++; //대문자범위(65~90)-65=배열 인덱스 값 ex)arr[0]=a,arr[1]=b,....
} else {
arr[str.charAt(i) - 97]++; //소문자범위(97~122)-97=배열 인덱스 값
}
}
int max=0; //최댓값 저장 변수 설정
char ch='?'; //출력할 문자 변수 설정
for (int i = 0; i < 26; i++) { //배열 순회 반복문
if (arr[i] > max){ // 배열값이 최댓값보다 큰 경우
max = arr[i]; // 최댓값에 배열값을 저장
ch = (char)(i+65); // 문자로 변환(대문자로 출력해야하기 때문에 +65)
} else if (arr[i]==max) { // 배열값이 최댓값이랑 같을 경우
ch = '?'; // 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
}
}
System.out.println(ch);
}
}
※ 5번 과제 point
아스키코드 대문자 범위 : 65~90 / 소문자 범위 : 97~122
for문과 if-else문, if-else if문 적용
실습문제 6.
코딩테스트 연습 - [1차] 비밀지도 | 프로그래머스 스쿨 (programmers.co.kr)
public class Practice06 {
public static void main(String[] args) {
}
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n]; //결과값 배열
for (int i = 0; i < n; i++) {
answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]); // Integer클래스는 10진수 값을 2진수로 바꿔주는 함수를 지원한다.
}// 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다.(OR적용)
for (int i = 0; i < n; i++) {
answer[i] = String.format("%" + n + "s", answer[i]);//string.format(포맷,값) 문자열 형식설정메서드
//String.format("%"+자릿수+"s", str)자릿수에 맞추어서 str이 변환된다.만약, str의 길이가 자릿수보다 길 경우 str이 그대로 출력된다.
answer[i] = answer[i].replaceAll("1","#");
answer[i] = answer[i].replaceAll("0"," ");
}
return answer;
}
}
}
※ 6번 과제 point
Integer.toBinaryString(); // 10진수를 2진수값으로 바꿔줄 때 사용
String.format(포맷,값); // 문자열 형식 설정 메서드
실습문제 7.
- JSON은 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다.
- 웹 어플리케이션에서 서버와 클라이언트간 데이터를 주고 받을 때 자주 쓰이기 때문에 이를 파싱하거나 객체화하는 것은 중요하다.
- 아래와 같은 JSON 데이터가 있다고 가정할 때 이를 이차원 배열에 저장하는 프로그램을 작성해보고자 한다.
- String[][] jsonTable 저장
- 사실 이를 저장하기 위해서 Map 자료구조 를 많이 사용하나 이번 과제에는 이차원 배열에 저장하자.
- JsonObject, JsonArray 사용 금지
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": "Radiation resistance"
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": "Damage resistance"
},
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": "Heat Immunity"
}
import java.util.Arrays;
public class Practice07 {
public static void main(String[] args) {
final String jsonString = "{\n" +
"\t\"name\": \"Molecule Man\",\n" +
"\t\"age\": 29,\n" +
"\t\"secretIdentity\": \"Dan Jukes\",\n" +
"\t\"powers\": \"Radiation resistance\"\n" +
"},\n" +
"{\n" +
"\t\"name\": \"Madame Uppercut\",\n" +
"\t\"age\": 39,\n" +
"\t\"secretIdentity\": \"Jane Wilson\",\n" +
"\t\"powers\": \"Damage resistance\"\n" +
"},\n" +
"{\n" +
"\t\"name\": \"Eternal Flame\",\n" +
"\t\"age\": 1000000,\n" +
"\t\"secretIdentity\": \"Unknown\",\n" +
"\t\"powers\": \"Heat Immunity\"\n" +
"}";
String[] str = jsonString.replaceAll("[{}\n\t\"]","").split(",");
// System.out.println(Arrays.toString(str));
String[][] jsonTable = new String[str.length][2];
for (int i = 0; i < str.length; i++) {
jsonTable[i][0] = str[i].split(":")[0];
jsonTable[i][1] = str[i].split(":")[1];
}
// System.out.println(Arrays.deepToString(jsonTable));
System.out.println("------------------------------------------------------------------------------------------------");
System.out.printf("%23s|%23s|%23s|%23s|\n","name","age","secretIdentity","powers");
System.out.println("------------------------------------------------------------------------------------------------");
int cnt = 0;
for(int i=0; i<jsonTable.length; i++){
System.out.printf("%23s|",jsonTable[i][1]);
cnt++;
if(cnt == 4){
System.out.println();
cnt = 0;
}
}
System.out.println("------------------------------------------------------------------------------------------------");
}
}
※ 7번 과제 point
Arrays.deepToString(); // 다차원배열의 모든 요소를 문자열로 출력1차원 배열일때는 Arrays.toString();
과제 난이도가 점점 상승하는 느낌은 나만 가지는 느낌인건가.......
일단 과제 자체가 앞서 배운 내용을 토대로 응용해야 하기 때문에 앞에서 배운 내용이 잘 정리되지 않으면 멘붕이 오기 시작한다. 조건문과 반복문 적용할 때 헷갈리기 시작하는데 조건문,반복문 복습하면서 다시 한번 정리해야 할 것 같다.
사실 이 과제도 말이 4주차지 지난 3주차 과제인데 제출기한이 늘어난것..... 객체지향 실습과제도 금요일까지인데 이건 또 언제 다하나 ㅠㅠ
'[패스트캠퍼스]KDT 핀테크 서비스 백엔드 > review' 카테고리의 다른 글
8~10주차 Review - Spring - 2022. 11. 18. 16:31 작성 (0) | 2022.12.19 |
---|---|
OOP 실습 review - 2022. 10. 12. 21:15 작성글 (0) | 2022.12.19 |
3주차 실습과제 review - 2022. 9. 29. 20:31 작성글 (0) | 2022.12.08 |
2주차 Review - java(1) - 2022. 9. 23. 14:36 작성글 (1) | 2022.12.08 |
1주차 Review - git/github - 2022. 9. 16. 14:01 작성글 (0) | 2022.12.08 |