[ STUDY ]/CodingTest

[ 자료구조 ] 배열과 리스트(백준 11720, 1546)

김강니 2024. 10. 28. 20:57

 배열

배열은 메모리의 연속 공간에 값이 채워져 있는 형태의 자료구조

  • 배열의 값은 인덱스를 통해 참조할 수 있다. ex) A[3], B[0]
  • 새로운 값을 삽입하거나 특정 인덱스에 있는 값을 삭제하기 어렵다.
  • 배열의 크기는 선언할 때 지정되며, 크기를 늘리거나 줄일 수 없다.

 리스트

값과 포인터를 묶은 노드라는 것을 포인터로 연결한 자료구조

  • 인덱스가 없으므로 값에 접근하려면 Head 포인터부터 순서대로 접근해야한다. 즉, 값에 접근하는 속도가 느리다.
  • 데이터를 삽입하거나 삭제하는 연산 속도가 빠르다.
  • 선언할 때 크기를 별도로 지정하지 않아도 된다. 크기가 변하는 데이터를 다룰 때 적절하다.
  • 포인터를 저장할 공간이 필요하여 배열보다 구조가 복잡하다.

 

 11720 : 숫자의 합 구하기

 

문제

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

  • 100자리의 숫자는 int나 long형에 담을 수 없다. -> 문자형으로 입력받기
  • 아스키코드에서 문자 '1'과 숫자 1은 48만큼 차이난다. 예) '1' - 48 = 1

출력

입력으로 주어진 숫자 N개의 합을 출력한다.

 

실행 코드

import java.util.Scanner;

public class P11720 {
    // 11720 : 숫자의 합 구하기
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        // N값 입력받기
        int N = sc.nextInt();

        // N값 길이만큼의 String형 변수 저장
        String Snum = sc.next();

        // String 변수를 char[] 배열에 저장
        char[] cNum = Snum.toCharArray();

        // 배열의 각 값을 더한다.
        int sum = 0; // 숫자의 합을 저장할 변수

        for(int i = 0; i < N ; i++){
            sum += cNum[i] - '0'; // '1' = 49, '0' = 48
        }
        System.out.print(sum);
    }
}
 

 

 1546 : 평균 구하기

문제

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

 

출력

첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.

 

실행 코드

ex) 70, 60, 80, 90일 경우

(70/90*100 + 60/90*100 + 80/90*100 + 90/90*100) / 4

= (70+60+80+90) * 100 / 90 / 4

= (각 점수 합) * 100 / 최대점수 / N

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int[] A = new int[N];

        for(int i = 0; i<N; i++){
            A[i] = sc.nextInt();
        }
        long sum = 0;
        long max = 0;

        // 최댓값 찾기
        for(int i=0; i<N; i++){
            if(A[i]>max) max = A[i];
            sum += A[i];
        }

        //(각 점수 합) * 100 / 최대점수 / N
        System.out.println(sum * 100.0 / max / N);
    }
}