Java - Array์™€ List

๋‚˜๋‚˜๋ฏธํ† ๋ชจ์—ยท2024๋…„ 6์›” 26์ผ
post-thumbnail

Array

ํŠน์ง•

  • ๐Ÿ‘ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
  • ๐Ÿคž Array๋Š” Object๋Š” ์•„๋‹ˆ์ง€๋งŒ Reference Value๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
  • ๐Ÿคž ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์—ฐ๋‹ฌ์•„ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด์•ผ ํ•œ๋‹ค.
  • ๐Ÿ‘Ž ๋ฏธ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด ๋†“๊ณ  ์จ์•ผ ํ•œ๋‹ค.
  • ๐Ÿ‘Ž ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ๊ณต๊ฐ„์€ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ๋‹ค.
  • ๐Ÿ‘ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜๋งŒ ์•Œ๋ฉด index๋กœ ์ƒ๋Œ€์  ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

๋ถˆํŽธํ•œ ์ 

  • ์œ ์—ฐํ•˜์ง€ ๋ชปํ•˜๋‹ค.
  • ๋ฏธ๋ฆฌ ๋ช‡๊ฐœ๊ฐ€ ํ•„์š”ํ•œ ์ง€ ๋ชฐ๋ผ๋„ ์“ธ ์ˆ˜๋Š” ์—†์„๊นŒ?
  • ํ•„์š”์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ์ค„์–ด๋“ค ์ˆ˜๋Š” ์—†์„๊นŒ?

์ด ๋ถˆํŽธํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด Listโ—๏ธ

List

  • ๐Ÿ‘ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
  • ๐Ÿ‘ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์—ฐ์†๋˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ๐Ÿ‘ ๋ฏธ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ด ๋†“์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ๐Ÿ‘ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ์ค„์–ด๋“ ๋‹ค.
  • ๐Ÿ‘Ž ์ฒซ ๋ฒˆ์งธ ์œ„์น˜๋กœ ๋ถ€ํ„ฐ index๋กœ ๋ชฉํ‘œ์œ„์น˜๋ฅผ ์•Œ๋ ค๋ฉด ํ•œ ์นธ ํ•œ ์นธ ์ด๋™ํ•˜๋ฉด์„œ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

LinkedList

  • ์ž๋ฐ”์—์„œ List๊ด€๋ จ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋Š” LinkedList ์ด๋‹ค. ๊ด€๋ จ๋œ ๋ฌธ์„œ๋Š” Java Api Docs์— ๋‚˜์™€์žˆ๋‹ค.
  • LinkedList๊ฐ€ implementํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>

List

  • List๋Š” LinkedList์—์„œ implemented๋œ ํด๋ž˜์Šค์ด๋‹ค.
  • LinkedList์—์„œ ์ถ”๊ฐ€๋กœ ๋” ๋งŽ์€ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— LinkedListํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค ํ•˜๋”๋ผ๋„ Listํƒ€์ž…์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
    • List<Integer> list = new LinkedList<>();

ArrayList

  • LinkedList์—์„œ ์›ํ•˜๋Š” index์—์„œ ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” Array์˜ ํŠน์ง•์„ ์ถ”๊ฐ€ํ•œ ArrayList๊ฐ€ ์žˆ๋‹ค.
  • ArrayList๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด get(index)ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ArrayList vs Vector

  • ArrayList์™€ Vector ๋ชจ๋‘ Listํด๋ž˜์Šค๋ฅผ implementํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜๋‹ค Listํƒ€์ž…์œผ๋กœ ๋งŽ์ด ํ‘œํ˜„ํ•œ๋‹ค.
  • ArrayList ์™€ Vector๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ด ๋น„์Šทํ•˜์ง€๋งŒ synchronize(๋™๊ธฐํ™”) ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
    • ArrayList -> not synchronized
    • Vector -> synchronized
  • ๋”ฐ๋ผ์„œ thread-safeํ•œ ๊ตฌํ˜„์„ ์›ํ•œ๋‹ค๋ฉด ArrayList, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด Vector๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

    thread-safe: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋™์‹œ์— ์ ‘๊ทผ๋˜์–ด๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ

์˜ˆ์ œ ์ฝ”๋“œ

๋ฌธ์ œ1

์ฃผ์–ด์ง„ ์ž…๋ ฅ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๊ณ , ์ตœ๋Œ€๊ฐ’์ด ์ด ์œ„์น˜ํ•˜๋Š” index ๊ฐ’์˜ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.

  • ์ž…๋ ฅ: [1, 3, 5, 4, 5, 2, 1]

์ž…๋ ฅ๋œ ๋ชฉ๋ก์˜ ์ตœ๋Œ€๊ฐ’์€ 5์ž…๋‹ˆ๋‹ค.

5์™€ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ์œ„์น˜๋Š” 3๋ฒˆ์งธ, 5๋ฒˆ์งธ ์œ„์น˜ ์ž…๋‹ˆ๋‹ค.

์ด ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” index๋Š” [2, 4] ์ž…๋‹ˆ๋‹ค.

  • ์ถœ๋ ฅ: [2, 4]
import java.util.*;
import java.util.stream.*;

class Solution {
    public int[] solution(int[] arr) {
        // max์— ์˜ํ•œ ๋ฐ˜ํ™˜๊ฐ’์ด OptionalInt ์ด๊ธฐ ๋•Œ๋ฌธ๋ฐ getAsInt()๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.
        int max = Arrays.stream(arr).max().getAsInt(); 
        
        return IntStream.range(0, arr.length)
            .filter(i -> arr[i] == max)
            .toArray();
    }
}

๋ฌธ์ œ2

๋ฌธ์ œ ์„ค๋ช…

๊ธธ์ด๊ฐ€ n์ธ ๋ฐฐ์—ด์— 1๋ถ€ํ„ฐ n๊นŒ์ง€ ์ˆซ์ž๊ฐ€ ์ค‘๋ณต ์—†์ด ํ•œ ๋ฒˆ์”ฉ ๋“ค์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
1๋ถ€ํ„ฐ n๊นŒ์ง€ ์ˆซ์ž๊ฐ€ ์ค‘๋ณต ์—†์ด ํ•œ ๋ฒˆ์”ฉ ๋“ค์–ด ์žˆ๋Š” ๊ฒฝ์šฐ true๋ฅผ, ์•„๋‹Œ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•จ์ˆ˜ solution์„ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” 10๋งŒ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด์˜ ์›์†Œ๋Š” 0 ์ด์ƒ 10๋งŒ ์ดํ•˜์ธ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

  • arr: [4, 1, 3, 2]
  • result: true
  • arr: [4, 1, 3]
  • result: false

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

  • ์ž…์ถœ๋ ฅ ์˜ˆ #1

    ์ž…๋ ฅ์ด [4, 1, 3, 2]๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 4์ด๋ฏ€๋กœ ๋ฐฐ์—ด์—๋Š” 1๋ถ€ํ„ฐ 4๊นŒ์ง€ ์ˆซ์ž๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. [4, 1, 3, 2]์—๋Š” 1๋ถ€ํ„ฐ 4๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด ์žˆ์œผ๋ฏ€๋กœ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ์ž…์ถœ๋ ฅ ์˜ˆ #2

    [4, 1, 3]์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 3์ด๋ฏ€๋กœ ๋ฐฐ์—ด์—๋Š” 1๋ถ€ํ„ฐ 3๊นŒ์ง€ ์ˆซ์ž๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. [4, 1, 3]์—๋Š” 2๊ฐ€ ์—†๊ณ  4๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

import java.util.*;

class Solution {
    public boolean solution(int[] arr) {
        int[] answer = new int[arr.length];
        for (int i = 0; i < arr.length; i++) answer[i] = i+1;
        
        Arrays.sort(arr);
        
        return Arrays.equals(arr, answer);
    }
}

sort() ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(nlogn)์ด๋‹ค.

๋ฌธ์ œ3

๋ฌธ์ œ ์„ค๋ช…

  • ์ž์—ฐ์ˆ˜ n์„ ๋’ค์ง‘์–ด ๊ฐ ์ž๋ฆฌ ์ˆซ์ž๋ฅผ ์›์†Œ๋กœ ๊ฐ€์ง€๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฆฌํ„ดํ•ด์ฃผ์„ธ์š”. ์˜ˆ๋ฅผ๋“ค์–ด n์ด 12345์ด๋ฉด [5,4,3,2,1]์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ ์กฐ๊ฑด

  • n์€ 10,000,000,000์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

  • n: 12345
  • return: [5,4,3,2,1]
import java.util.*;

class Solution {
    public int[] solution(long n) {
        List<Integer> list = new LinkedList<>();

        while(n > 0) {
            list.add((int)(n % 10);
            n /= 10;
        }

        return list.stream().mapToInt(Integer::intValue).toArrays();
    }
}

0๊ฐœ์˜ ๋Œ“๊ธ€