[Java] 자료구조(1)

나무나무·2025년 1월 9일

자바

목록 보기
3/6

입력

Scanner

Scanner sc = new Scanner();

int a = sc.nextInt();
flaot b = sc.nextFloat(); 
String c = sc.nextLine();

BufferedReader
Scanner보다 속도가 빠르다. 필자는 백준 풀 때 무조건 이걸 사용하는 편.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOExcepion;  //예외 처리 필수

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();

출력

System.out.print 사용

System.out.println() ; //출력 후 한 줄 띄기
System.out.print(); //한 줄 띄기 없음
System.out.printf(); //형식 지정해서 출력하기

BufferedWriter 사용

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("anogowop");   //buffer에 출력할 내용을 저장함.
bw.flush(); //남아 있는 데이터를 모두 출력시킴
bw.close(); //스트림을 닫음

배열(Array)

같은 타입의 데이터들을 연속된 공간에, 인덱스를 부여하여 저장하는 자료구조임. 크기가 한 번 정해지면 크기를 바꿀 수 없음.

int[] arr1 = new int[5];
int[] arr2 = {1, 2, 3, 4, 5};
int[] arr3 = new int[] {1, 2, 3, 4, 5}; 
String[] str = {"안녕", "잘 지내니?"};
int[][] twoDimArray = new int[3][4];

//1차원 배열 값을 출력할 때
System.out.println(Arrays.toString(arr1)); 

//2차원 배열 값을 출력할 때
System.out.println(Arrays.deepToString(twoDimArray));

//배열 정렬
Arrays.sort(arr1);
//역정렬
Arrays.sort(arr2, Collections.reverseOrder());
//배열 복사
int[] copy = Array.copyOf(arr1, 길이);

리스트(List)

  • 배열과 동일하게 순서를 갖는 자료구조
  • 배열과 다른 점은 가변 크기를 갖는다는 점이다.
  • List 구현 클래스로는 ArrayList, Vector, LinkedList, Stack 등이 있다.
List<Integer> ls = new ArrayList<>();
List<Integer> ls1 = new ArrayList<>(List.of(1, 2, 3, 4, 5));

ls.get(i) // i번째 값 확인
ls.set(i, 3)  // i번째 값을 3으로 변경함

ls1.add(1);   // 맨 뒤에 1을 추가함 
ls1.add(i ,4);  // i번째 위치에 4를 추가

ls1.remove(4);  // 4번쨰 위치의 원소를 삭제

ls1.sort(Integer::compareTo);  //오름차순으로 정렬
ls1.sort(Comparator.reverseOrder());

집합 (set)

  • 중복을 허용하지 않는다.
  • 순서가 없어 인덱스를 통해 값에 접근하는 것이 불가능하다.
  • HashSet, LinkedHashSet, TreeSet 등이 존재한다.
import java.util.Array;
import java.util.HashSet; 

HashSet<Integer> set1 = new HashSet<>();
HashSet<Integer> set2 = new HashSet<>();

set1.add(1);
set2.add(2);
set1.remove(1);

//교집합
set1.retainAll(set2);
//차집합
set1.removeAll(set2);
//합집합
set1.addAll(set2);

//배열 -> Set으로
int[] arr = {1, 2, 3, 4, 5};
HashSet<Integer> newSet = new HashSet<Integer>(Arrays.asList(arr));

//set -> 배열로
int[] newArr = newSet.toArray(new int[newSet.size()]);

TreeSet & LinkedHashSet
TreeSet : 값을 오름차순으로 정렬해 저장함
LinkedHashSet : 값을 입력한 순서대로 정렬함

  • TreeSet 은 HashSet보다 시간이 오래 걸리고, LinkedHashSet은 추가적인 오버헤드가 존재할 수 있음
  • HashSet > LinkedHashSet > TreeSet 순으로 효율이 좋음

맵(Map)

  • Key : value 쌍을 저장하는 방식 (key는 value를 찾기 위한 이름 역할)
  • 순서 유지 x
  • key 는 중복되지 않음. value는 중복 가능
  • HashSet, TreeMap, LinkedHashMap 등이 존재
import java.util.HashMap;

HashMap<String, Integer> map = new HashMap<>();
map.put("이승용", 28); 
map.get("이승용");   // 28
map.containKeys("이승용"); // true, false
map.remove("이승용"); 
map.size(); 

// 맵의 모든 key를 모아서 집합으로 반환
map.keySet();
HashSet<Integer> tmp = new HashMap<>(map.keySet()); 

// 맵의 모든 Key-value 쌍을 가져와 Set 객체로 반환
for(Map.Entry<String, Integer> entry : map.entrySet()){
		...
}

TreeMap & LinkedHashMap
TreeMap : 입력된 Key를 오름차순으로 데이터 정렬
LinkedHashMap : 입력된 순서대로 데이터를 저장

  • HashMap > LinkedHashMap > TreeMap 순으로 효율이 좋음

profile
백엔드 개발자 나무입니다

0개의 댓글