점프투자바

SUADI·2022년 5월 28일

종합문제

문제 1) split, join 함수

public class Sample {
    public static void main(String[] args) {
        String data = "a:b:c:d";
        String[] temp = data.split(":");
        String result = String.join("#",temp);
        System.out.println(result);
    }
}
  • split이 문자열에서 특정 문자를 제거해주는 역할을 한다면, join은 특정문자를 더해주는 역할을 한다. 어디에 문자들이 들어가는지를 생각해봤는데 처음에는 모든 문자의 사이에 들어가는줄 알았는데 data문자열을 좀 수정해서 다시 시도해보았다. split으로 특정 문자가 빠지는 곳에 들어가는 것 같다고 추론했다. (확실하지는 않다..)
String data = "a:b:c:d:efg"
// 결과 : a#b#c#d#efg

문제 3) 정수형 배열에서 50보다 큰 수 합계 구하기

import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        int[] A = {20, 55, 67, 82, 45, 33, 90, 87, 100, 25};

        int sum = Arrays.stream(A)
                .filter((a) -> (a>=50))
                .sum()
                ;

        System.out.println(sum);
    }
}
  • 처음에는 너무 쉬운 문제라고 생각하고 for문과 if문을 사용해서 코드를 짰는데 해답을 보고 훨씬 간결한 방법인 람다 함수를 이용한다는걸 알고 공부한다고 다가 아니라 몸에 체화되어야 자유자재로 코드를 잘 짤 수 있을것 같다는 생각을 했다. 람다 함수의 세세한 문법도 추후에 공부해서 포스팅해야겠다.

문제 4) 피보나치 수열

public class Sample {
    static int fibonacci(int n) {
        if (n==0) return 0;
        else if (n==1) return 1;
        else return fibonacci(n-2) + fibonacci(n-1);
    }
    public static void main(String[] args) {
        for (int i=0; i<10; i++) {
            System.out.println(fibonacci(i));
        }
    }
}
  • 피보나치 수열은 첫번째 수열이 1, 두번째 수열이 1이고, n번째 수열은 (n-1)번째 수열과 (n-2)번째 수열의 합인 수열이다. 이렇게 자기 자신의 함수값을 리턴하는 함수를 재귀함수라고 한다.

문제 6) 입력된 수의 총합 구하기(,없애기)

import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.printf("수 입력 :");
        String line = scanner.nextLine();
        String[] temp = line.split(",");
        int sum = 0;
        for (String i : temp) {
            i = i.trim();
            int n = Integer.parseInt(i);
            sum += n;
        }
        System.out.println(sum);
    }
}
  • ,를 포함한 수들을 입력받고, split함수로 ,를 제거해서 문자열 배열 변수에 저장한다. for문으로 각 element들의 공백이 있는 경우 trim함수를 이용해 없애주고, 새로운 정수형 변수를 선언해 원래 문자열로 받았던 입력값들을 Integer.parseInt함수를 이용해서 정수형으로 바꿔준 후 합을 구한다. Integer.parseInt를 자꾸 까먹는다..ㅠㅠ

문제 7) 데이터 역순으로 파일에 저장

import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;

public class Sample {
    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\sample.txt");
        String line = "AAA\r\nBBB\nCCC\nDDD\nEEE";
        pw.println(line);
        pw.close();

        BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\sample.txt"));
        ArrayList<String> temp = new ArrayList<>();
        while (true) {
            String n = br.readLine();
            if (n == null) break;
            temp.add((n));
        }
        temp.sort(Comparator.reverseOrder());
        br.close();

        PrintWriter pw2 = new PrintWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt");
        for (String n : temp) {
            pw2.println(n);
        }
        pw2.close();
    }
}
  • AAA\r\nBBB\nCCC\nDDD\nEEE 를 역순으로 저장하기 위해 temp.sort(Comparator.reverseOrder()); 구문을 사용한다.

문제 8) 평균값 구해서 파일에 쓰기

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\sample.txt");
        int[] point = {70, 60, 55, 75, 95, 90, 80, 80, 87, 100};
        for (int num : point) {
            pw.println(num);
        }
        pw.close();

        BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\sample.txt"));
        ArrayList<String> temp = new ArrayList<>();
        while (true) {
            String n = br.readLine();
            if (n == null) break;
            temp.add(n);
        }
        int sum = 0;
        for (String n : temp) {
            int num = Integer.parseInt(n);
            sum += num;
        }
        float average = (float) sum / temp.size();
        br.close();

        PrintWriter pw2 = new PrintWriter("C:\\Users\\kcs91\\Desktop\\workspace\\Programming\\src\\out.txt");
        pw2.println(sum);
        pw2.println(average);
        pw2.close();
    }
}
  • 파일 입출력 파트 공부가 제대로 안되었는지 기억이 잘 나질 않는다. 간략하게 다시 복습해 봐야겠다.
    PrintWriter 객체를 생성해서 파일을 만들고 write함수를 이용해서 파일 내에 입력하고자 하는 문구를 입력한다. 다음으로 BufferedReader로 파일을 불러온다. 불러오는 방법은 반복문을 이용해서 문자 타입의 변수를 생성한 다음 그 변수에 readLine함수를 이용해서 파일의 데이터를 저장한다. BufferedReader는 줄단위로 읽기 때문에 n값이 아무것도 없는 경우(null) 반복문을 중단한다. 그리고 n값을 ArrayList에 저장한다. 또다른 반복문을 사용해서 element들을 Integer.parseInt를 이용해서 정수형으로 바꾼 후 그 값들을 다 더한다. 여기서 굳이 문자형 타입으로 저장한 후 정수형으로 바꾸는 이유는 BufferedReader를 통해 데이터를 불러올 때 문자형 타입으로만 불러올 수 있는 것 같다.

문제 9) 계산기 만들기

Calculator.java

public class Calculator {
    int[] data;

    Calculator(int[] data) {
        this.data = data;
    }

    int sum() {
        int total = 0;
        for (int n : data) {
            total += n;
        }
        return total;
    }

    float avg() {
        float average = sum() / data.length;
        return average;
    }
}

Sample.java

public class Sample {
    public static void main(String[] args) {
        int[] data1 = {1,2,3,4,5};
        Calculator cal1 = new Calculator(data1);
        System.out.println(cal1.sum()); // 15 출력
        System.out.println(cal1.avg()); // 3.0 출력

        int[] data2 = {6,7,8,9,10};
        Calculator cal2 = new Calculator(data2);
        System.out.println(cal2.sum()); // 40 출력
        System.out.println(cal2.avg()); // 8.0 출력
    }
}
  • 지금까지는 클래스를 한 파일 안에 다 만들었었는데 나누어서 해봤다. Calculator 파일을 생성하고, 생성자를 만들어서 입력인자에 정수형 배열을 넣는다. add()함수를 만들어서 for문으로 data의 element들을 더하고 리턴한다. average함수에서는 sum()함수에서 data.length를 나눈 것을 리턴한다. Sample 클래스에서 Calculator 객체를 생성해서 int 배열을 입력인자로 넣어서 sum과 avg함수를 이용해서 합과 평균을 구한다.

0개의 댓글