[java] 기초(5)

세상을 바꾸는 개발자·2023년 2월 28일
0

LikeLion

목록 보기
5/5

스트림

[문제] https://www.acmicpc.net/problem/11382
V1 : 스트림 사용 안함

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

        String[] inputBits = sc.nextLine().split(" ");

        long sum = 0;

        for (String inputBit : inputBits) {
            sum += Long.parseLong(inputBit);
        }

        System.out.println(sum);

        sc.close();
    }
}



V2 : 스트림 사용

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

        String[] inputBits = sc.nextLine().split(" ");

        long sum = Arrays.stream(inputBits)
                .mapToLong(e -> Long.parseLong(e)) //스트림 내 요소들을 Long으로 변환
                .sum();

        System.out.println(sum);

        sc.close();
    }
}

peek : 스트림 내 요소들을 대상으로 연산을 수행하지 않고 인자로 받은 람다식을 수행
map : 스트림 내 요소들을 하나씩 특정 값으로 변환
sorted : 스트림 내 요소들을 비교하여 정렬
filter : 스트림 내 요소들을 하나씩 평가해서 조건에 맞춰서 걸러냄


-1이 입력될 때까지 숫자를 입력받아서 정렬 후 출력

[출력 결과]

숫자를 입력해주세요(-1 : 종료) : 11
숫자를 입력해주세요(-1 : 종료) : 2
숫자를 입력해주세요(-1 : 종료) : 3
숫자를 입력해주세요(-1 : 종료) : 44
숫자를 입력해주세요(-1 : 종료) : 5
숫자를 입력해주세요(-1 : 종료) : 6
숫자를 입력해주세요(-1 : 종료) : 0
숫자를 입력해주세요(-1 : 종료) : 7
숫자를 입력해주세요(-1 : 종료) : -7
숫자를 입력해주세요(-1 : 종료) : -1
입력을 종료합니다.
입력한 숫자(오름차순) : -7, 0, 2, 3, 5, 6, 7, 11, 44
프로그램을 종료합니다.

[정답]
V1 : ArrayList 사용. 스트림 사용 안함

class Sol {
    public void run() {
        Scanner sc = new Scanner(System.in);

        List<Integer> numbers = new ArrayList<>();

        while (true) {
            System.out.printf("숫자를 입력해주세요(-1 : 종료) : ");
            int num = sc.nextInt();

            if (num == -1) {
                System.out.println("입력을 종료합니다.");
                break;
            }

            numbers.add(num);
        }

        Collections.sort(numbers);
        StringBuilder sb = new StringBuilder();

        for (int number : numbers) {
            if (sb.isEmpty() == false) {
                sb.append(", ");
            }

            sb.append(number);
        }

        System.out.printf("입력한 숫자(오름차순) : %s\n", sb);
        System.out.println("프로그램을 종료합니다.");

        sc.close();
    }
}



V2 : ArrayList 사용. 스트림 사용

class Sol {
    public void run() {
        Scanner sc = new Scanner(System.in);

        List<Integer> numbers = new ArrayList<>();

        while (true) {
            System.out.printf("숫자를 입력해주세요(-1 : 종료) : ");
            int num = sc.nextInt();

            if (num == -1) {
                System.out.println("입력을 종료합니다.");
                break;
            }

            numbers.add(num);
        }

        String str = numbers
                .stream()
                .sorted() //정렬
                .map(e -> "" + e) //스트림 내 요소들을 문자열형태로
                .collect(Collectors.joining(", ")); 각각 ', '를 붙여줌

        System.out.printf("입력한 숫자(오름차순) : %s\n", str);
        System.out.println("프로그램을 종료합니다.");

        sc.close();
    }
}



ArrayList

배열과 비슷한데 배열은 크기를 지정해줘야하지만, ArrayList는 자동으로 크기가 늘어남.(마법의 장바구니)

class Main {
    public static void main(String[] args) {
        int[] arr = new int[3];
        arr[0] = 10;
        arr[1] = 20;
        arr[2] = 30;
        System.out.println(arr[0] + arr[1] + arr[2]);
        System.out.println(arr.length); // 고정길이

        // ArrayList<Integer> al = new ArrayList<Integer>(); // v1
        // List<Integer> al = new ArrayList<Integer>(); // v2
        List<Integer> al = new ArrayList<>(); // v3
        al.add(10); // 0
        al.add(20); // 1
        al.add(30); // 2
        System.out.println(al.get(0) + al.get(1) + al.get(2));
        System.out.println(al.size()); // 가변, 길이 : 3
        al.add(40); // 3
        System.out.println(al.size()); // 가변, 길이 : 4
    }
}



List 정렬

Collections.sort(al, (e2, e1) -> {
            // return e2 > e1 ? 1 : -1; // v1 오름차순 정렬
            // return e2 > e1 ? -1 : 1; // v2 내림차순 정렬
            // return e2 - e1; // v3 오름차순 정렬
            return e1 - e2; // v4 내림차순 정렬
        });
        
Collections.sort(al, (e2, e1) -> e1 - e2); // 이런식으로 생략가능

e2 - e1 : 오름차순
e1 - e2 : 내림차순


HashMap

ArrayList에 커스텀 키 기능을 추가함

// 리스트 장점 : 넣을때 편하고, 접근할 때 귀찮다.
        List<Integer> ages = new ArrayList<>();
        ages.add(20); // index : 0
        ages.add(25); // index : 1
        ages.add(30); // index : 2

        System.out.printf("철수나이 : %d\n", ages.get(0));
        System.out.printf("영수나이 : %d\n", ages.get(2));
        System.out.printf("영희나이 : %d\n", ages.get(1));

		// 맵 장점 : 넣을때 귀찮고, 접근할 때 편하다.
        Map<String, Integer> agesMap = new HashMap<>();
        agesMap.put("철수", 20); // index : 철수
        agesMap.put("영희", 25); // index : 영희
        agesMap.put("영수", 30); // index : 영수

        System.out.printf("철수나이 : %d\n", agesMap.get("철수"));
        System.out.printf("영수나이 : %d\n", agesMap.get("영수"));
        System.out.printf("영희나이 : %d\n", agesMap.get("영희"));

list는 넣을 대 편하고, 접근할 때 귀찮다.
HashMap은 넣을 때 귀찮고, 접근할 때 편하다.


예제
[사람1 정보]
이름 : 홍길동
나이 : 22
키 : 170.5

[사람2 정보]
이름 : 홍길순
나이 : 25
키 : 162.4

사람 정보가 출력될 수 있도록 작성

class Main {
    public static void main(String[] args) {
        // new Sol1().run();
         new Sol2().run();
    }
}

class Sol1 { //클래스 사용
    public void run() {
        Person p1 = new Person("홍길동", 22, 170.5);
        Person p2 = new Person("홍길순", 25, 162.4);

        System.out.println(p1);
        System.out.println(p2);
    }
}

class Person {
    private String name;
    private int age;
    private double height;

    public Person(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}

class Sol2 { //HashMap 사용
    public void run() {
        Map<String, Object> p1 = new HashMap<>();
        p1.put("이름", "홍길동");
        p1.put("나이", 22);
        p1.put("키", 170.5);

        Map<String, Object> p2 = new HashMap<>();
        p2.put("이름", "홍길순");
        p2.put("나이", 25);
        p2.put("키", 162.4);

        System.out.println(p1);
        System.out.println(p2);
    }
}



배열 vs ArrayList vs HashMap




구조체 연습

[문제] https://codeup.kr/problem.php?id=1805

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

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

        int count = sc.nextInt();

        List<Device> devices = new ArrayList<>();

        for (int i = 0; i < count; i++) {
            int id = sc.nextInt();
            int gas = sc.nextInt();

            devices.add(new Device(id, gas));
        }

        sc.close();

        devices = devices
                .stream()
                .sorted((e2, e1) -> e2.getId() - e1.getId())
                .collect(Collectors.toList());

        for (Device device : devices) {
            System.out.printf("%d %d\n", device.getId(), device.getGas());
        }
    }
}

class Device {
    private int id;
    private int gas;

    public int getId() {
        return id;
    }

    public int getGas() {
        return gas;
    }

    public Device(int id, int gas) {
        this.id = id;
        this.gas = gas;
    }

    @Override
    public String toString() {
        return "Device{" +
                "id=" + id +
                ", gas=" + gas +
                '}';
    }
}
profile
초심 잃지 않기

0개의 댓글