본문 바로가기
활동/2022 하계 모각코

[2022 하계 모각코] 2주차 1회 계획 및 결과

by JJong | 쫑 2022. 7. 7.

최종 목표 : 컴프 2 대비

2주차 1회 계획 : 컬렉션 프레임워크(collection framework(list, set))의 개념 공부

공부한 내용 정리


list 란 무엇일까?

list는 크기가 정해지지 않은 동적 배열이라고 한다. 자바의 배열은 크기를 n으로 정해주면 n+1 개의 정보를 담을 수 없다. 하지만 list는 크기가 정해지지 않았기 때문에 정보의 개수가 일정하지 않은 경우 list를 사용하는 것이 배열을 사용하는 것보다 유리하다.

자바에서 list는 인터페이스라고 한다. 그래서 ArrayList, Vector, LinkedList 등이 있다고 한다.

컴프2에서는 ArrayList를 주로 사용한다고 하니 우선 ArrayList를 정리하겠다.


ArrayList<T> arrList = new ArrayList<>();

 

선언은 보통 이렇게 한다. 여기서 T는 저번 시간에 공부했던 타입 변수이다. T 대신에 String나 Integer, Double처럼 래퍼 클래스를 사용할 수 있다.


add get size contains remove
  • add(Object o)

add는 ArrayList 안에 원소(element)를 추가하는 것이다. 리턴 타입은 void 이다.

import java.util.ArrayList;

public class Study_arrList {
    public static void main(String[] args){
        ArrayList<Integer> arrList = new ArrayList<>();
        arrList.add(10);
        arrList.add(30);
        arrList.add(120);
        System.out.println(arrList); // >> [10,30,120]
    }
}

add를 통해서 10, 30, 120을 순서대로 list에 넣어주었다. 그리고 그 리스트를 출력하면 [10,30,120]이 나온다.


  • get(int index)

get은 리스트의 원소에 접근하는 메소드이다. 리턴 타입은 ArrayList를 선언할 때 정한 타입 변수이다.

import java.util.ArrayList;

public class Study_arrList {
    public static void main(String[] args){
        ArrayList<Integer> arrList = new ArrayList<>();
        arrList.add(10);
        arrList.add(30);
        arrList.add(120);

        System.out.println(arrList.get(0)); // >> 10
    }
}

get을 통해서 해당 index로 색인 접근이 가능하다. ArrayList는 List라는 인터페이스를 구현한 클래스이므로 배열과는 다르게 '[index]'를 통해서 원소에 접근이 불가능하다. 그래서 원소에 접근이 필요한 경우, 반드시 get을 이용해야 한다.


  • size

size는 ArrayList의 크기를 반환하는 메소드이다. 리턴 타입은 반드시 int이다.

import java.util.ArrayList;

public class Study_arrList {
    public static void main(String[] args){
        ArrayList<Integer> arrList = new ArrayList<>();
        arrList.add(10);
        arrList.add(30);
        arrList.add(120);
        System.out.println(arrList.size()); // >> 3
    }
}

arrList 안에는 10, 30, 120이 순서대로 들어가 있다. 그래서 arrList의 크기는 3인 것이다.


  • contains(Object o)

contains(Object o)는 o가 ArrayList 안에 포함되어 있는지 boolean 값으로 반환하는 메소드이다.

import java.util.ArrayList;

public class Study_arrList {
    public static void main(String[] args){
        ArrayList<Integer> arrList = new ArrayList<>();
        arrList.add(10);
        arrList.add(30);
        arrList.add(120);
        System.out.println(arrList.contains(10)); // >> true
        System.out.println(arrList.contains(10000)); // >> false
    }
}
import java.util.ArrayList;

class blabla{ }

public class Example {
    public static void main(String[] args){
        ArrayList<blabla> arrList = new ArrayList<>();
        blabla A = new blabla();
        blabla B = new blabla();
        blabla C = new blabla();
        blabla D = new blabla();

        arrList.add(A);
        arrList.add(B);
        arrList.add(C);

	System.out.println(arrList.contains(A)); // >> true
        System.out.println(arrList.contains(D)); // >> false

    }
}

포함되어 있지 않다면 false를, 포함되어 있다면 true를 반환한다.


  • remove(int index)

remove는 오버로딩이 되어 있다. 매개변수로 객체를 받느냐, index를 받느냐의 차이이다.

  • 아래는 index로 지우는 방법이다.
import java.util.ArrayList;

public class Study_arrList {
    public static void main(String[] args){
        ArrayList<Integer> arrList = new ArrayList<>();
        arrList.add(10);
        arrList.add(30);
        arrList.add(120);
        
        System.out.println(arrList.remove(0)); // >> 10
        System.out.println(arrList); // >> [30,120]
    }
}

 remove(0)을 통해서 arrList의 0번째 원소인 10을 지웠다.

arrList.remove(0) 은 지우기 전, 0번째 index에 들어있던 값인 10을 반환한다.

 

  • 아래는 객체로 지운 방법이다.
import java.util.ArrayList;

class blabla{ }

public class Example2 {
    public static void main(String[] args){
        ArrayList<blabla> arrList = new ArrayList<>();
        blabla A = new blabla();
        blabla B = new blabla();
        blabla C = new blabla();

        arrList.add(A);
        arrList.add(B);
        arrList.add(C);

        System.out.println(arrList.remove(C)); // >> true
        System.out.println(arrList); // >> [blabla@75b84c92, blabla@6bc7c054]
        
	blabla D = new blabla();
        System.out.println(arrList.remove(D)); // >> false
    }
}

 

arrList.remove(C)는 remove에 성공했다면 true를 반환한다. 만약 arrList에 없는 원소인 D를 지우려고 하면 false를 반환한다.


set이란 무엇일까?

set은 집합이다. 배열이나 리스트와 다른 점을 꼽자면, 중복하여 같은 원소를 갖지 않는다는 것이다. 그리고 이것은 집합의 기본 개념이기도 하다.

import java.util.HashSet;
import java.util.Iterator;

public class Study_Set {
    public static void main(String[] args){
        // set 선언하기.
        HashSet<Integer> setStu = new HashSet<>();

        // set에 값 추가하기
        setStu.add(new Integer(123));
        setStu.add(new Integer(45));
        setStu.add(new Integer(67));

        // set의 크기
        int sizeOfSet = setStu.size();
        System.out.println("sizeOfSet : "+sizeOfSet);

        // set 내용을 알 수 있게 iterator에 담기
        Iterator<Integer> setIter = setStu.iterator();

        // Iterator에 담은 set의 모든 원소 출력하기
        while(setIter.hasNext()){
            System.out.println(setIter.next());
        }

    }
}

아래는 위 코드를 실행한 결과이다.

더보기

sizeOfSet : 3
67
123
45

set도 list와 이름과 목적이 같은 메서드가 있어서 쉽게 알 수 있다. 다만, iterator를 처음 접해보게 되어 추가적인 공부가 필요하다고 생각한다.


백준 사이트에서 문제를 풀면서 자바로 집합을 이용해보고 싶다는 생각을 자주 했다. python으로 문제를 푸는데 Java로도 문제를 풀오보고 싶었다. 이번에 set을 공부하게 되어 이 기회에 집합으로 문제를 풀어보고 싶었다. 그래서 백준 사이트에서 '단계별로 문제풀기' 에서 '집합과 맵' 카테고리에 있는 문제 하나를 풀어보았다.

https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

숫자 카드라는 문제를 풀었는데, 배열로 선형 탐색을 하는 풀이는 반드시 시간 초과가 나는 문제이다( 이분 탐색으로 풀이가 가능한 모양이다). 나는 이 문제를 집합으로 풀이해보았다. 아래는 이 문제의 정답 코드이다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.StringJoiner;

public class Main {
    public static int sToi(String s) {return Integer.parseInt(s);}
    
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String input[];

        int numberOfCards = sToi(br.readLine()); // 상근이가 가지고 있는 카드의 수
        input = br.readLine().split(" "); // 상근이가 가진 카드 넘버
        HashSet<Integer> Sang = new HashSet<>(); // 상근이가 가지고 있는 카드
        for (int i=0; i<numberOfCards; i++){
            Sang.add(sToi(input[i])); // 집합(Sang)에 상근이가 가진 카드 넘버를 add.
        }

        int compareCards = sToi(br.readLine()); // 비교하고자 하는 카드들의 수
        input = br.readLine().split(" "); // 비교하려는 카드 넘버들 입력
        String[] result = new String[compareCards];
        for (int i=0; i<compareCards; i++){
            if (Sang.contains(sToi(input[i]))) { // Sang이라는 set에 카드넘버가 포함 되어 있다.
                result[i] = "1";
            }else{ // 포함되어 있지 않다.
                result[i] = "0";
            }
        }

        StringJoiner sj = new StringJoiner(" ");
        for (String ele : result){ sj.add(ele); }
        
        bw.write(sj.toString());
        bw.flush();
        bw.close();
    }
}

 

댓글