본문 바로가기
Today I Learned 2024. 3. 8.

(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를 반드시 해야