(24.03.08) Java 코딩 연습 문제 풀기 및 정리_05👨💻
책을 분철로 시켜서 생각보다 배송이 늦게 와버린 사태. 그래도 자바의 정석이 도착을 했다.
"자바의 정석" 책 기준으로 스파르타에서 제공되어준 정보는 거의 책의 반 정도라곤 생각이된다.
객체지향 프로그래밍 관련 클래스/객체/메서드 까지의 개념까지의 내용이 내가 지금 가이드북에서 알게 된 것이고,
그 이후의 자바의 정석에서는 더 심화된 내용으로 채워져서 마지막에는 프로그래밍을 끝내고 입출력을 지나 네트워킹까지 다루는 것 같다.
본 캠프에서도 역시 Java에 대해 공부하는 시간이 있다고 했지만, 나는 내가 잘 아는법.. 분명 벙쪄가지고 머리가 하얗게 될게 분명하다..
이번주 코딩테스트 연습문제를 좀 풀어보면서 어떤 느낌으로 Java 코드를 짜는가를 느꼈다면,
다음주는 다시 처음으로 돌아와서
- 가이드 북으로 배웠던 내용과 겹치는 "자바의 정석" 내용 빠르게 읽으면서 훑기
- 노션에 내가 직접 정리한 내용에 자바의 정석 내용을 추가로 덧붙이기
- 이해하지 못한 Java CS 관련하여 더 읽어보기
- 코딩테스트 연습문제 최소 2개 이상
- 필요한 내용은 정리하면서
- 스파르타 제공 강의 관련하여 추가로 정리
이렇게 하고, 캠프가 살짝 미뤄졌기 때문에 좀 뜨는 시간이 분명 생긴다면,
자바의 정석 심화를 들어가서 미리 읽으면서 정리하는 주를 또 가져야 할 것
Java 공부를 하면서 제일 먼저 생각나는 건
진짜 수학에 학을 떼는 사람이면.. 매우 많은 노력이 필요하다는 것
...나잖아?🥹
Java 연습문제 풀이
Q1
얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.
선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.
import java.util.Arrays;
//findRanking메서드 만들기
public class Practice {
public static void main(String[] args) {
String[] players = {"mumu", "soe", "poe", "kai", "mine"};
String[] callings = {"kai", "kai", "mine", "mine"};
//선수 이름을 부를 때마다
for (int i = 0; i < callings.length; i++) {
//i선수의 현재 등수 부여
int ranking = findRanking(players, callings[i]);
//스와핑 : i선수와 그 앞에 있는 선수
swiping(players,ranking,ranking-1);
}
System.out.println(Arrays.toString(players));
}
private static void swiping(String[] array, int i, int j) {
String temp = array[i];
array[i] = array[j];
array[j] = temp;
}
private static int findRanking(String[] array, String target) {
int ranking=0;
for (int i = 0; i < array.length; i++) {
if (array[i].equals(target)) {
ranking = i;
}
}
return ranking;
}
}
순서 정리 해보기
[해설진이 선수의 이름은 부를때]
선수가 바로 앞 선수를 추월했을 때
선수 끼리의 순위가 바뀌었을 때
[매개변수]
현재 등수 배열
해설진이 부른 선수들의 문자열 배열
-
경주가 끝났을 때,
선수들의 이름을 1등부터 등수 순서대로 배열에 담아 출력
-
해설진이 선수 이름을 부를때
배열상 앞의 선수 이름과 스와핑
**연산 시간이 오래 걸리기 때문에 새로운 List 컬렉션을 스와핑 부분에 사용하고자 함**
List 인터페이스 & ArrayList 클래스
List 인터페이스
- 컬렉션 프레임웍 중 핵심 인터페이스
- 컬렉션 프레임웍 : 데이터 ‘군’을 저장하는 클래스들의 표준화
- 컬렉션 : 다수의 데이터 그룹, 프로그램 방식
- List 인터페이스 경우, 컬렉션 프레임웍 중 순서가 있는 데이터의 집합(따라서 데이터의 중복도 허용) 을 다루는 컬렉션
ArrayList 클래스
- List 컬렉션 클래스인 “데이터의 저장순서 유지, 중복허용
- 배열을 기반으로 하기 때문에 크기가 가변적=동적으로 조절
- 컬렉션 프레임웍중 가장 많이 사용
List<String>
List<Integer>
- 동적인 크기를 가진 List를 나타네는 인터페이스를 정의하는 타입
- 따라서 ArrayList를 정의할 때 사용할수있음
- <>가운데에는 List의 타입을 표
.asList(배열)
- 배열을 List로 변환하는 메서드, ArrayList로 만들어 주는 메서드
(리스트).indexOf(찾을 인덱스값)
- 리스트에 있는 어떤 인덱스 값을 가지는 인덱스의 번호를 찾는 메서드
- 일치하는 값이 없다면, -1을 return
따라서 아래와 같이 위의 스와핑 코드를 수정할 수 있음
private static int findRanking(String[] array, String target) {
// findRanking의 메서드는 매개변수로 들어온 array 배열을
// ArrayList로 바꾸고, 매개변수 target값과 똑같은 인덱스값이 있다면
// 그 인덱스번호를 리턴하는 것
List<String> result = Arrays.asList(array);
return result.indexOf(target);
}
Q2
사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 ["may", "kein", "kain"]이고 각 인물의 그리움 점수가 [5점, 10점, 1점]일 때 해당 사진의 추억 점수는 16(5 + 10 + 1)점이 됩니다. 다른 사진 속 인물의 이름이 ["kali", "mari", "don", "tony"]이고 ["kali", "mari", "don"]의 그리움 점수가 각각 [11점, 1점, 55점]]이고, "tony"는 그리움 점수가 없을 때, 이 사진의 추억 점수는 3명의 그리움 점수를 합한 67(11 + 1 + 55)점입니다.
그리워하는 사람의 이름을 담은 문자열 배열 name, 각 사람별 그리움 점수를 담은 정수 배열 yearning, 각 사진에 찍힌 인물의 이름을 담은 이차원 문자열 배열 photo가 매개변수로 주어질 때, 사진들의 추억 점수를 photo에 주어진 순서대로 배열에 담아 return하는 solution 함수를 완성해주세요.
import java.util.ArrayList;
import java.util.Collections;
public class Practice {
public static void main(String[] args) {
String[] name = {"kali", "mari", "don"};
int[] yearning = {11, 1, 55};
String[][] photo = {{"kali", "mari", "don"}, {"pony", "tom", "teddy"}, {"con", "mona", "don"}};
//결과를 넣을 리스트 만들기
ArrayList<Integer> result = new ArrayList<>();
//각 사진들에 있는 사람이름의 리스트 만들기
for (String[] eachphotogroup : photo) {
ArrayList<String> namelist = new ArrayList<>();
for (int i = 0; i < eachphotogroup.length; i++) {
namelist.add(eachphotogroup[i]);
}
// 각 사진별 특정 인물의 숫자 세고 각자의 총 포인트에 더하기
int point = 0; // 총 포인트
for (int i = 0; i < name.length; i++) {
// 특정 인물의 수
int count = Collections.frequency(namelist, name[i]);
if (count != -1) {
point += count * yearning[i]; // 총 포인트에 더하기
}
}
// 모든 포인트를 결과 집합에 정의
result.add(point);
}
//result를 int[] 배열로 바꾸기
int[] result2 = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
result2[i] = result.get(i);
}
System.out.println(result2);
}
}
ArrayList 활용
선언
ArrayList<(타입)> (참조변수)= new ArrayList<>()
새로운 ArrayList를 선언
타입은 List 인터페이스에서는 String Integer로 primitive type과 다름
ArrayList 매서드
(ArrayList이름).add(타입에 맞는 값)
ArrayList에 값을 순서대로 지정
(ArrayList이름).size()
ArrayList의 크기,길이를 나타냄
()사이에 어떤 값도 들어가서는 X
(ArrayList이름).get(정수)
ArrayList의 정수번 인덱스(0부터 시작)값을 반환
0미만 또는 최대 인덱스번호 초과시 Error
Collections 매서드
Collections.frequency((ArrayList이름), (특정값))
ArrayList, List의 특정값을 인덱스 사이에몇개 가지고 있는지 확인
없을 경우, 0을 반환
- 단, ArrayList 클래스가 아니기 때문에 import java.util.Collections를 반드시 해야
'Today I Learned' 카테고리의 다른 글
(24.03.12) CS강의(프로그램 & 프로세스 / 프로세스 메모리 / 스레드 & 스레드 풀) (0) | 2024.03.12 |
---|---|
(24.03.11) CS강의(CPU, 메모리 / 스케쥴링, 캐시, 메모리할당) 🤯 (0) | 2024.03.11 |
(24.03.07) Java 코딩 연습 문제 풀기 및 정리_04 👨💻 (1) | 2024.03.07 |
(24.03.06) Java 코딩 연습 문제 풀기 및 정리_03 👨💻 (1) | 2024.03.06 |
(24.03.05) Java 코딩 연습 문제 풀기 및 정리_02 👨💻 (0) | 2024.03.05 |