연습 문제
- 구구단 프로그램
- 구구단 출력은 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와 친해지기
- 정수(int) 데이터를 담을 빈 ArrayList를 만들어라.
- ArrayList에 5, 7, 10, 9, 4라는 데이터를 차례대로 넣어라.
- ArrayList에서 7이라는 데이터를 삭제해라.
- ArrayList에 들어있는 두 번째 값을 조회해서 출력해라.
- ArrayList를 내림차순으로 정렬해라.
- for문을 활용해서 ArrayList의 모든 데이터를 차례차례 출력해라.
- 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 |