으어어어어 실습과제 너무 어렵고 많은것 ㅠㅠ

배열부터 객체지향까지 진도가 금방 끝나고 나머지는 복습이랑 실습시간인데 복습시간에 조금이라도 더 이해하고 실습과제 적용해보도록 노력해야겠다.

실습문제 풀다보니까 분산이나 표준편차 이런걸 배웠었나.. 언제적 기억을 더듬더듬.. 영어뿐만 아니라 수학도 잘해야 하는거였......ㅠ

 

배열 : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것


실습문제 1.

  • 10명의 학생들의 성적을 저장하는 배열 int[] scores를 만들고 성적을 입력받고자 한다.
  • 학생 성적의 최댓값, 최솟값, 평균, 분산, 표준편차반환하는 프로그램을 작성해보자. 원소중복 가능
  • 분산 계산법

표준편차 계산법

  • 힌트
    • 최댓값과 최솟값 - Integer 클래스 이용
      • 정수값 중 최대값: Integer.MAX_VALUE (2^31-1)
      • 정수값 중 최소값: Integer.MIN_VALUE (-2^31)
    • 평균과 분산 - Math 클래스 이용
      • 루트 : Math.sqrt(expression);
      • 제곱: Math.pow(n, 2);
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.

2908번: 상수 (acmicpc.net)

 

2908번: 상수

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두

www.acmicpc.net

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.

1157번: 단어 공부 (acmicpc.net)

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

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)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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  (0) 2022.11.18
7주차 Review - JSP/SERVLET  (0) 2022.10.24
3주차 실습과제 review  (0) 2022.09.29
2주차 Review - java(1)  (1) 2022.09.23
1주차 Review - git/github  (0) 2022.09.16

+ Recent posts