파트2. List(리스트)

출처

해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다.




2-1

Array란?

  1. 여러개의 데이터를 한꺼번에 다룰 수 있습니다.
  2. Array는 Object는 아니지만 Reference Value로 취급됩니다.
  3. 메모리상에 연달아 공간을 확보합니다.(효율 좋음)
  4. 미리 공간을 확보해 놓고 써야 합니다.(미리 크기정해야함)
  5. 한번 만들어진 공간은 크기가 고정됩니다.(크기 변경x)
  6. 첫 번째 위치만 알면 index로 상대적 위치를 빠르게 찾을 수 있습니다.


List란?

  1. 여러개의 데이터를 한꺼번에 다룰 수 있습니다.
  2. 메모리상에 연속되지 않아도 됩니다.
  3. 미리 공간을 확보해 놓지 않아도 됩니다.
  4. 필요에 따라 데이터가 늘어나거나 줄어듭니다.
  5. 첫 번째 위치로 부터 index로 목표위치를 알렴녀 한 칸 한 칸 이동하면서 찾아야 합니다.


메소드

Arrays.toString(배열) : 배열을 ID값이 아닌 내용물을 출력합니다.




2-2

리스트 만들기

리스트는 다형성을 보장합니다. 즉 List<E>는 인터페이스이고, 해당 인터페이스를 구현한 LinkedList<E>, ArrayList<E>, Vector<E>가 존재하며 List<E>인터페이스로 가리킬 수 있습니다.



List의 메서드

리스트.add(값) : 맨뒤에 값을 추가 합니다.
리스트.add(인덱스,값) : 해당 인덱스 위치에 값을 추가 합니다.
리스트.remove(인덱스) : 해당 인덱스 위치의 값을 삭제 합니다.
리스트.set(인덱스,값) : 해당 인덱스 위치의 값을 수정 합니다.
리스트.contains(값) : 리스트내에 해당 값이 존재하는지 여부입니다.
리스트.size() : 리스트의 크기를 반환합니다.
리스트.isEmpty() : 리스트가 비었는지 반환합니다.



리스트에 객체를 포함하기

class MyData{
	int value;
    public MyData(int value){
    	this.value = value;
    }
    
    public MyData create(int v){
    	return new MyData(v);
    }
    
    public String toString(){
    	return "" + value;
    }
    
    public boolean equals(Object o){
    	if(this == o) return true;
        if(o == null || getClass() != o.getClass()) return false;
        MyData myData = (MyData) o;
        return value == myData.value;
    }
}

equals를 오버라이딩 해준다면 리스트.contains(값), 리스트.indexOf(값) 등 값을 비교하는 메서드를 이용할 수 있습니다.



ArrayList와 Vector차이점

ArrayListnot Synchronized, VectorSynchronized입니다. Synchronized는 멀티 쓰레드 사용시 데이터를 주고받는 작업을 수행하기 위해 동기화하는 작업입니다. 동기화 하지 않으면 속도가 더 빠르고 동기화를 사용하면 안전하게 사용할 수 있습니다.




최댓값 인덱스 구하기

나의 풀이

package com.programmers.java;

import java.util.*;

public class 최댓값인덱스구하기 {

	public static int[] solution(int[] arr) {
        List<Integer> answer = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        
        //최댓값 구하기
        for(int i : arr) {
        	list.add(i);
        }
        Collections.sort(list);
        int max = list.get(list.size()-1);
        
        //최댓값의 인덱스 구하기
        for(int i=0;i<arr.length;i++) {
        	if(max == arr[i])
        		answer.add(i);
        }
        
        //결과
        return answer.stream().mapToInt(i->i).toArray();
    }
	
	public static void main(String[] args) {
		int[] arr = {3, 6, 10, 1, 7, 2, 4, 6, 10, 9};
		System.out.println(Arrays.toString(solution(arr)));
	}

}

리스트를 만들고 일일히 값을 복사하고, 정렬 후 마지막 값이 최댓값임을 이용하여 최댓값이 존재하는 인덱스들을 추출하였습니다.
리스트.stream().mapToInt(i->i).toArray();로 스트림을 이용해 리스트를 배열로 변환하였습니다.



강의 풀이

import java.util.*;
import java.util.stream.*;

class Solution {
    public int[] solution(int[] arr) {
        int max = Arrays.stream(arr).max().getAsInt();
        
        return IntStream.range(0, arr.length)
            .filter(i -> arr[i] == max)
            .toArray();
    }
}

스트림을 활용하여 많이 단축된 코드인것같습니다. Arrays.stream(), getAsInt(), IntStream등등 익힐게 많네요




순열 검사

나의 풀이

package com.programmers.java;

import java.util.*;

public class 순열검사 {
	public static boolean solution(int[] arr) {
		boolean answer = true;
		//정렬
		Arrays.sort(arr);
		//연속된 순열인지 확인
		for(int i=0;i<arr.length;i++) {
			if((i+1) != arr[i]) {
				answer = false;
				break;
			}
		}
		
		return answer;
	}
	
	public static void main(String[] args) {
		int[] arr = {4, 1, 3, 2};
		System.out.println(solution(arr));
		
		int[] arr2 = {4, 1, 3};
		System.out.println(solution(arr2));
	}
}

정렬 후 연속되어 있는지 연속되지 않은 부분이 있다면 false, 마지막까지 연속되어 있다면 true를 반환 합니다.



강의 풀이

import java.util.*;

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

정답을 만들고 정답과 하나씩 비교하며 다른 부분이 있다면 false, 마지막까지 모두 정답과 동일하다면 true를 반환합니다.




자연수 뒤집어 배열로 만들기

나의 풀이

package com.programmers.java;

import java.util.*;

public class 자연수뒤집어배열로만들기 {
	public static int[] solution(int n) {
		List<Integer> answer = new ArrayList<>();
        
        //한 자리씩 리스트에 삽입
        while(n > 0){
            long count = n % 10;
            answer.add((int)count);
            n = n / 10;
        }
        
        //결과 리스트를 배열로
        return answer.stream().mapToInt(i->i).toArray();
	}
	
	public static void main(String[] args) {
		int n = 12345;
		System.out.println(Arrays.toString(solution(n)));
	}
}


강의 풀이

import java.util.*;

class Solution {
    public int[] solution(long n) {
        List<Integer> list = new LinkedList<>();
        
        while(n > 0){
            list.add((int)(n % 10));
            n = n / 10;
        }
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

나머지 연산으로 한자리씩 추출하고, 나누기 연산으로 한칸씩 앞으로 옮겨가며 0이 될 때 까지 수행합니다.

스트림을 이용할때 리스트.stream().mapToInt(i->i).toArray()도 가능하지만 리스트.stream().mapToInt(Integer::intValue).toArray()도 가능합니다.




GitHub

https://github.com/ds02168/Study_Algorithm/tree/master/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/%5BJava%5D%20%EC%96%B4%EC%84%9C%EC%99%80%20%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%80%20%EC%B2%98%EC%9D%8C%EC%9D%B4%EC%A7%80/%ED%8C%8C%ED%8A%B82.List(%EB%A6%AC%EC%8A%A4%ED%8A%B8)

좋은 웹페이지 즐겨찾기