자바 알고리즘 Datastructure

2025. 2. 17. 09:12·Cs기본지식/알고리즘

1. List

 

: 데이타를 저장한 순서대로 저장해 준다.

데이타의 Index는 0부터 size()-1

 

중간 삽입할 수 있는 Index는 0부터 size()까지 이다.

 

범위를 벗어나면 IndexOutOfBoundsException이 발생한다.

 

데이타를 중복해서 저장할 수 있다.

 

inndexOf(Object o), lastIndexOf(Object o), contains(Object o)

remove(Object o)에서 해당 기능을 수행하기 위해

=> equals(Object o)를 호출해서 객체가 같은지 비교후 처리한다.

     equals함수가 구현 할려면 해당 타입인지 검사  

public boolean equals(Object obj) {
		if (obj instanceof Employee) { //instanceof가 null검사도 한다 
			Employee emp = (Employee) obj;
			if( empno != null && empno.equals(emp.empno)) {
				return true;
			}
		}
		return false;

 

2. ArrayList

 

-List 배열로 구성

- 데이터를 추가, 삭제시 내부에서 동적으로 배열의 길이를 조절 해준다

-연속적인 데이터의 리스트

- 중간에 빈 공간이 생기지 않도록 요소들의 위치를 앞뒤로 이동

: 순서대로 하나씩 추가한다면 상관이 없지만, 중간에 삽입이 들어가면 맨끝에서 부터 하나씩 이동하면서 공간을 마련

삽입이 일어난 공간부터 맨 아래까지 이동이 나타남

삭제도 동일하게 비워진 공간에 대하여 다시 아래서 공간이 채워지고 아래서 다시 채워지고 반복

 

- 삽입 삭제 하기 전 Overhead 발생!!

- 배열로 구성했기 때문에 원하는 것을 탐색하고 순서대로 삽입하는 것은 빠름

 

일반적인 크기를 알고 있다면 intialCapacity를 통해 버리는 메모리가 없게 활용 가능

=>크기를 알고 있을 때 활용하기 좋음

 

 *요소삽입

ArrayList<Integer> members = new ArrayList<>();

 

 

!Array의 경우 처음 선언한 배열의 크기를 변경 할 수 없고,

데이터를 삭제하더라도 해당 index에는 빈공간으로 계속 남는다.

 

3. LinkedList

: ArrayList와 다르게 LinkedList는 각각의 노드를 연결하는 방식을 사용

 

LinkedList는 Node라는 객체로 이루어져 있으며

Node는 데이터를 저장하는 field와 다음 노드를 가리킬 수 있는 next pointer field로 구성이 되어있다

 

이 노드들이 연결된 형태의 자료구조를 바로 LinkedList 이다

 

삽입 삭제의 경우 노드가 가리키는 포인터만 바꾸어주면 되기 때문에

배열처럼 데이터를 이동하기 위해 복사하는 과정 없이 삽입/삭제가 매우 빠르게 가능하다.

 

하지만 순차접근만 가능하기 때문에 요소를 받아오는 속도가 매우 느립니다.

 

 ArrayList의 경우 원하는 것을 탐색하고 순서대로 삽입을 진행할 때

LinkedList의 경우 삽입과 삭제를 진행할 때 효율성입 높다.

 

4. Set

: 값들의 순서를 보장하지않고 중복되지 않는 자료구조

 

 동일한 객체를 저장하지 않음

=> 데이타의 유니크성을 보장

 

- add(Object o), contains(Object o), remove(Object o)에서

equals(Object o)와 hashCode()를 호출하여 객체가 같은지 비교한다.

 

-객체의 주소값을 리턴(hashCode)

 - 데이타를 저장한 순서대로 저장하지 않는다.

-  index가 없다.!!!!!

 

=> 순서에 상관없이, 어떤 데이터가 존재하는지를 확인하는 용도로 활용

 

5. treeset

 - set과 동일하게 유니크성을 보장하면서 tree를 이용해서 정렬을 유지한다.

==> 정렬시 Comparable interface의 compareTo()를 이용하므로

저장할 객체에 Comparable interface 구현해야 된다.

 

6. Map

- 유일한 key값으로 value를 관리하는 자료구조

- 검색이 가장 빠른 자료구조

 

7.Stack

 - 마직막에 저장한 데이타를 먼저 꺼내는 방식의 자료 구조(LIFO:Last Input First Out)

 ex) 쌓아 놓은 접시를 맨 위에부터 사용하는 방식

 

 - 컴퓨터의 연산 처리시 사용, 메서드 호출 처리에서 사용

- push(arg) : 맨 끝에 저장

 - pop() : 맨 끝에 있는 데이타를 제거 후 리턴

- peek() : 맨 끝에 있는 데이타를 제거 없이 리턴

- isEmpty() : 저장된 데이타가 있으면 false 없으면 true

 - size() : 저장된 데이타의 개수를 리턴

 - contains(데이타) : 해당 데이타가 stack에 저장되어 있으면 true, 없으면 false

 

8. Stack을 활용한 문제풀이

 

 

 

package boj.bronze;

import java.util.Scanner;
import java.util.Stack;

public class Main_g5_1141_불쾌한날 {

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

        // N: 배열의 크기
        int N = sc.nextInt();
        int[] data = new int[N];

        // 입력 받기
        for (int i = 0; i < N; i++) {
            data[i] = sc.nextInt();
        }

        // 스택을 사용하여 문제 해결
        Stack<Integer> stack = new Stack<>();
        stack.push(0); // 초기값으로 0을 넣어줌
        long count = 0;

        // 각 데이터에 대해 처리
        for (int i = 0; i < N; i++) {
            int a = data[i];

            // 스택의 top 값이 현재 값보다 작거나 같으면 pop
            while (!stack.isEmpty() && stack.peek() <= a) {
                stack.pop();
            }

            // 현재 스택의 크기만큼 count 증가
            count += stack.size();
            
            // 현재 값을 스택에 추가
            stack.push(a);
        }

        // 결과 출력
        System.out.println(count);

        sc.close();
    }
}

 

package boj.bronze;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main_2493_g5_탑_ {
    
    public static void main(String[] args) throws Exception {
        // 입력을 위한 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 탑의 개수 N
        int N = Integer.parseInt(br.readLine());

        // 탑의 높이 정보 입력받기
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] tower = new int[N];
        for (int i = 0; i < N; i++) {
            tower[i] = Integer.parseInt(st.nextToken());
        }

        // 결과를 저장할 배열
        int[] arr = new int[N];
        
        // 스택 초기화 (탑의 인덱스를 저장)
        Stack<Integer> stack = new Stack<>();
        
        // 각 탑에 대해 처리
        for (int i = 0; i < N; i++) {
            int a = tower[i];

            // 스택이 비어 있지 않고, 현재 탑의 높이가 스택의 top에 있는 탑보다 크면 pop
            while (!stack.isEmpty() && tower[stack.peek()] < a) {
                stack.pop();
            }

            // 스택에 탑이 남아있으면 그 탑의 인덱스를 arr[i]에 저장
            if (!stack.isEmpty()) {
                arr[i] = stack.peek() + 1; // 1-based index
            } else {
                arr[i] = 0; // 스택이 비어 있으면 0 저장
            }

            // 현재 탑의 인덱스를 스택에 push
            stack.push(i);
        }

        // 결과 출력
        for (int i = 0; i < N; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

'Cs기본지식 > 알고리즘' 카테고리의 다른 글

자바 자료구조 / Graph ,Tree 알아보기  (1) 2025.02.19
자바 알고리즘 Subset 알아보기  (0) 2025.02.18
자바 알고리즘 /순열과 조합  (0) 2025.02.17
정렬 알고리즘 이해하기 : 기본 구조 및 종류  (0) 2025.02.17
자바 알고리즘 / 재귀 함수(Recursion Function) /백준 17478번  (0) 2025.02.12
'Cs기본지식/알고리즘' 카테고리의 다른 글
  • 자바 알고리즘 Subset 알아보기
  • 자바 알고리즘 /순열과 조합
  • 정렬 알고리즘 이해하기 : 기본 구조 및 종류
  • 자바 알고리즘 / 재귀 함수(Recursion Function) /백준 17478번
startfront
startfront
startfront 님의 블로그 입니다.
  • startfront
    startfront 님의 블로그
    startfront
  • 전체
    오늘
    어제
    • 분류 전체보기 (42)
      • 프로젝트 (5)
        • 프로젝트 해보기 (1)
        • 디자인 알아보기 (2)
        • 프로젝트의 기본 (2)
      • 백엔드의 이해 (4)
      • React (14)
      • 프론트엔드 기본 (2)
        • Html (1)
        • Css (0)
        • JavaScript (1)
      • Cs기본지식 (14)
        • 알고리즘 (8)
        • 데이터베이스 (6)
      • Java (3)
        • Java의 이해 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
startfront
자바 알고리즘 Datastructure
상단으로

티스토리툴바