본문 바로가기

알고리즘/Do it! 알고리즘 코딩 테스트

배열과 리스트

배열의 특징

  1. 인덱스를 사용하여 값에 바로 접근할 수 있다.
  2. 새로운 값을 삽입하거나 특정 인덱스에 있는 값을 삭제하기 어렵다. 값을 삽입하거나 삭제하려면 해당 인덱스 주변에 있는 값을 이동시키는 과정이 필요하다.
  3. 배열의 크기는 선언할 때 지정할 수 있으며, 한 번 선언하면 크기를 늘리거나 줄일 수 없다.
  4. 구조가 간단하므로 코딩 테스트에서 많이 사용한다.

 

리스트의 특징

  1. 인덱스가 없으므로 값에 접근하려면 Head 포인터부터 순서대로 접근해야 한다. 다시 말해 값에 접근하는 속도가 느리다.
  2. 포인터로 연결되어 있으므로 데이터를 삽입하거나 삭제하는 연산 속도가 빠르다.
  3. 선언할 때 크기를 별도로 지정하지 않아도 된다. 다시 말해 리스트의 크기는 정해져 있지 않으며, 크기가 변하기 쉬운 데이터를 다룰 때 적절하다.
  4. 포인터를 저장할 공간이 필요하므로 배열보다 구조가 복잡하다.

[백준 11720번] 숫자의 합 구하기

https://www.acmicpc.net/problem/11720

 

N의 범위가 1부터 100까지이므로 값을 int형, long형과 같은 숫자형으로 담을 수 없다. 먼저 문자열 형태로 입력값을 받은 후 이를 문자 배열로 변환하고, 문자 배열값을 순서대로 읽으면서 숫자형으로 변환하여 더해야 한다. (입력값 "1234"와 같이 문자열로 받은 후 이를 다시 '1', '2', '3', '4' 문자 배열로 변환하고 이 문자 배열을 1, 2, 3, 4 숫자로 바꾼 후 합산)

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // 입력값을 String형 변수 sNum에 저장한 후 char[]형 변수로 변환하기
        String sNum = sc.next();
        char[] cNum = sNum.toCharArray();
        int sum = 0;
        for (int i = 0; i < cNum.length; i++) {
            sum += cNum[i] - '0';
            // cNum[i]를 정수형으로 변환하면서 sum에 더해 누적
        }
        System.out.println(sum);        
    }
}

 

  • str.toCharArray() : String으로 받은 문자열을 char 문자로 쪼갠 후 char[] 배열에 순서대로 넣어 반환
  • Arrays.toString(arr) : 배열의 값들을 문자열 형태로 만들어서 반
자바에서의 형 변환

String형 -> 숫자형
- Integer.parseInt(s)
- Integer.valueOf(s)
- Double.parseDouble(s)
- Double.valueOf(s)
- (Float, Long, Short 마찬가지)

숫자형 -> String형
- String.valueOf(i)
- Integer.toString(i)
- String.valueOf(d)
- Double.toString(d)
- (Float, Long, Short 마찬가지)

 


 

[백준 1546번] 평균 구하기

https://www.acmicpc.net/problem/1546

 

최고 점수를 기준으로 전체 점수를 다시 계산해야 하므로 모든 점수를 입력받은 후 최고점 별도로 저장해야 한다. 나는 모든 점수에 관하여 (점수/M * 100) 을 일일이 계산한 후 더해 평균을 구했지만 사실 이럴 필요 없이 다음처럼 한번에 변환한 점수의 평균 점수를 구할 수 있다.

 

변환 점수의 평균을 구하는 식(점수가 A, B, C인 경우)

(A / M * 100 + B / M * 100 + C / M * 100) / 3 = (A + B + C) * 100 / M / 3

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] marks = new int[n];
        for (int i = 0; i < n; i++) {
            marks[i] = sc.nextInt();
        }
        long sum = 0;
        long max = 0;
        for (int i = 0; i < n; i++) {
            if(marks[i] > max) max = marks[i];
            sum += marks[i];
        }
        // 한 과목과 관련된 수식을 총합한 후 관련된 수식으로 변환해 로직이 간단해짐
        System.out.println(sum * 100.0 / max / n);
    }
}

 

 

 

 

[참고문헌]

Do it! 알고리즘 코딩 테스트 자바편

'알고리즘 > Do it! 알고리즘 코딩 테스트' 카테고리의 다른 글

버블 정렬 (Bubble sort)  (0) 2024.05.15
스택과 큐  (1) 2024.05.15
슬라이딩 윈도우  (0) 2024.05.11
투 포인터  (0) 2024.05.10
구간 합  (0) 2024.05.09