본문 바로가기

Java

JSCODE 3회차

연습 문제

- 구구단 프로그램

  • 구구단 출력은 1단에서 9단까지만
  • 입력값이 1~9를 벗어난 경우 '1단에서 9단까지만 출력이 가능합니다' 출력, 구구단 출력 재질문
  • exit 입력하여 '프로그램을 성공적으로 종료했습니다.'를 출력하기 전까지 구구단 출력 질문
public void multiplicationTable() {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("[구구단] 몇 단을 출력하실건가요?");
            String input = scanner.nextLine();

            if (input.equals("exit")) {
                System.out.println("프로그램을 성공적으로 종료했습니다.");
                break;
            }

            try {
                int num = Integer.parseInt(input);
                if (num >= 1 && num <= 9) {
                    for (int i = 1; i <= 9; i++) {
                        System.out.println(num + " * " + i + " = " + num * i);
                    }
                }
                else System.out.println("1단에서 9단까지만 출력이 가능합니다.");
            }
            catch (NumberFormatException e) {
                System.out.println(e.getMessage());
            }

        }
    }

- exit 입력 전까지 구구단을 출력해야하므로 while 조건을 true로 입력하고 exit이 입력되면 break를 통해 반복문을 종료

- 문자열 입력을 받고 정수형으로 파싱하여 구구단 출력

- 예외 처리를 통해 exit 이외의 문자열이 입력되면 오류 출력

 

- 결과

 

- ArrayList와 친해지기

  1. 정수(int) 데이터를 담을 빈 ArrayList를 만들어라.
  2. ArrayList에 5, 7, 10, 9, 4라는 데이터를 차례대로 넣어라.
  3. ArrayList에서 7이라는 데이터를 삭제해라.
  4. ArrayList에 들어있는 두 번째 값을 조회해서 출력해라.
  5. ArrayList를 내림차순으로 정렬해라.
  6. for문을 활용해서 ArrayList의 모든 데이터를 차례차례 출력해라.
  7. ArrayList안에 11의 값이 존재하는 지 여부를 출력해라.
public void arrayPractice() {
        List<Integer> array = new ArrayList<>();
        array.add(5);
        array.add(7);
        array.add(10);
        array.add(9);
        array.add(4);

        array.remove(Integer.valueOf(7));
        System.out.println(array.get(1));

        Collections.sort(array, Collections.reverseOrder());

        for (Integer integer : array) {
            System.out.println(integer);
        }

        System.out.println(array.contains(11));
    }

- 여기에서 알게 된 점은 remove() 메서드가 두 가지인데 하나는 인덱스를 파라미터로 받아서 해당 인덱스에 위치한 값을 제거하는 것이고,

하나는 Object 형태를 파라미터로 받아서 해당 값을 제거한다는 것이다.

 

- 결과

 

3회차 미션

- 학생들의 이름을 가나다 순으로 출력하기

  • 배열(int[], String[] 등)을 사용 X ArrayList를 사용
  • 제네릭(Generic)을 사용
  • 입력값이 한글 또는 print가 아니면, '학생의 이름은 한글로만 입력해야 합니다' 출력.
public void sortStudents() {
        System.out.println("학생의 이름을 입력하고 엔터를 누르세요. (한글로만 입력해야 합니다.)\n학생들을 다 입력했다면, print라고 입력해주세요.");
        Scanner scanner = new Scanner(System.in);
        List<String> studentsList = new ArrayList<>();
        while (true) {
            String name = scanner.nextLine();

            if (mustFinish(name)) break;

            if (Pattern.matches("^[ㄱ-ㅎ가-힣]*$", name)) {
                studentsList.add(name);
            }
            else {
                System.out.println("학생의 이름은 한글로만 입력해야 합니다.");
            }
        }

        System.out.println("[학생 명단(가나다순)]");
        Collections.sort(studentsList);
        for (String name : studentsList) {
            System.out.println(name);
        }
    }
    
private boolean mustFinish(String value) {
	return value.equals("print");
}

- print 입력 전까지 학생 이름을 입력 받아야하기 때문에 while 조건에 true

- 한글만 입력 받기 위해 정규식을 사용

- Collections.sort() 메서드를 사용하면 리스트를 가나다순으로 정렬한다

 

- 결과

 

- 100m 달리기 선수 중 1등 찾기

  • 똑같은 선수 번호를 입력할 경우, 새로운 기록으로 갱신
  • 100m 달리기 기록은 소숫점 둘째자리까지 반올림하여 기록
  • print라고 입력하면 1등의 선수를 출력
  • ArrayList를 사용
  • 제네릭(Generic)을 사용
public void findWinner() {
        Scanner scanner = new Scanner(System.in);
        List<Integer> numbers = new ArrayList<>();
        List<Double> records = new ArrayList<>();

        while (true) {
            try {
                System.out.println("선수의 번호를 입력하세요.");
                String numberInput = scanner.nextLine();
                if (mustFinish(numberInput)) break;

                System.out.println("이 선수의 100m 달리기 기록이 몇 초인지 입력하세요.");
                String recordInput = scanner.nextLine();
                if (mustFinish(recordInput)) break;

                int number = Integer.parseInt(numberInput);
                double record = Double.parseDouble(recordInput);
                if (numbers.contains(number)) {
                    int index = numbers.indexOf(number);
                    numbers.remove(index);
                    records.remove(index);
                }
                numbers.add(number);
                records.add(record);
            }
            catch (NumberFormatException e) {
                System.out.println(e.getMessage());
            }
        }

        if (!records.isEmpty()) {
            double winnerRecord = records.get(0);

            for (double target : records) {
                if (target < winnerRecord) winnerRecord = target;
            }

            int winnerIndex = records.indexOf(winnerRecord);

            System.out.println("1등 : " + numbers.get(winnerIndex) +"번 선수" + "/ "
                    + String.format("%.2f", records.get(winnerIndex))
                    +"초 (참가인원 : " + numbers.size() +"명)");
        }
    }
    
private boolean mustFinish(String value) {
    return value.equals("print");
}

- Integer형 번호를 담을 리스트와 Double형 기록을 담을 리스트를 선언

- 마찬가지로 입력 수가 정해져있지 않기 때문에 while 조건에 true

- print를 입력 받아야하기 때문에 nextLine() 메서드를 사용하여 나중에 다른 형태로 파싱

- 선수의 번호와 기록이 같은 인덱스를 가지도록 설계

- 입력받은 번호가 리스트에 이미 존재하면 해당 인덱스의 번호와 기록을 삭제하고 다시 추가

-  for문을 이용하여 1등 기록을 알아내고 그 기록의 인덱스를 추출하고 자동으로 1등의 번호도 추출이 가능

- String.format() 메서드를 이용하여 소수점 둘째 자리까지 반올림

 

- 결과

 

이번 회차는 실무에서도 많이 사용되는 리스트를 공부해봤다.

내가 주로 사용하는 Dart와 사용법이 비슷해서  금방 적응이 됐지만, 자바에서 리스트 외에 다른 컬렉션 사용 경험이 많지 않아 공부해두면 좋을 것 같다는 생각이 들었다.

'Java' 카테고리의 다른 글

JSCODE 6회차  (1) 2023.02.20
JSCODE 5회차  (1) 2023.02.16
JSCODE 4회차  (2) 2023.02.13
JSCODE 2회차  (1) 2023.02.06
JSCODE 1회차  (1) 2023.01.30