파트2. List(리스트)
출처
해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다.
2-1
Array란?
- 여러개의 데이터를 한꺼번에 다룰 수 있습니다.
- Array는 Object는 아니지만 Reference Value로 취급됩니다.
- 메모리상에 연달아 공간을 확보합니다.(효율 좋음)
- 미리 공간을 확보해 놓고 써야 합니다.(미리 크기정해야함)
- 한번 만들어진 공간은 크기가 고정됩니다.(크기 변경x)
- 첫 번째 위치만 알면 index로 상대적 위치를 빠르게 찾을 수 있습니다.
List란?
- 여러개의 데이터를 한꺼번에 다룰 수 있습니다.
- 메모리상에 연속되지 않아도 됩니다.
- 미리 공간을 확보해 놓지 않아도 됩니다.
- 필요에 따라 데이터가 늘어나거나 줄어듭니다.
- 첫 번째 위치로 부터 index로 목표위치를 알렴녀 한 칸 한 칸 이동하면서 찾아야 합니다.
메소드
해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다.
Array란?
- 여러개의 데이터를 한꺼번에 다룰 수 있습니다.
- Array는 Object는 아니지만 Reference Value로 취급됩니다.
- 메모리상에 연달아 공간을 확보합니다.(효율 좋음)
- 미리 공간을 확보해 놓고 써야 합니다.(미리 크기정해야함)
- 한번 만들어진 공간은 크기가 고정됩니다.(크기 변경x)
- 첫 번째 위치만 알면 index로 상대적 위치를 빠르게 찾을 수 있습니다.
List란?
- 여러개의 데이터를 한꺼번에 다룰 수 있습니다.
- 메모리상에 연속되지 않아도 됩니다.
- 미리 공간을 확보해 놓지 않아도 됩니다.
- 필요에 따라 데이터가 늘어나거나 줄어듭니다.
- 첫 번째 위치로 부터 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차이점
ArrayList
는 not Synchronized
, Vector
는 Synchronized
입니다. 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)));
}
}
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));
}
}
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();
}
}
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
Author And Source
이 문제에 관하여(파트2. List(리스트)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ds02168/파트2.-List리스트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)