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

(24.03.06) Java 코딩 연습 문제 풀기 및 정리_03 👨‍💻

코딩 연습하다가  2024 카카오 인턴십 연습 문제에 걸려가지고 계속 몇시간 동안 계속 붙잡고 있다가...

정신을 놔버릴 뻔했다.. 분명 내가 진짜 기초중에 기초만 알고 있기는 하지만, 아무리 봐도 맞는데..

꼭 정확성 테스트 하면 한두개 실패해서 멘붕이다..

미리 해본 사람들 내용을 좀 보려니 Java언어로 한 사람도 없고..

그래서 오늘 양은 적지만

최대한 내가 해본 것 까지 기록하고 나름 바꿔야할 점들 공부한 것 정리했다

 


배열 길이

import java.util.Arrays;

public class Practice {
    public static void main(String[] args) {
        int[][] dots = {{1,1}, {1,1}, {3, 3}, {4, 4}};

        int[][] answerarray = new int[6][2];
        int num = 0;

        int answer = 0;
        for (int i = 0; i < dots.length - 1; i++) {
            // 배열 길이는 다차원일 경우 length만 써면 행, 행을 지정할 경우,
            for (int j = i + 1; j < dots.length; j++) {
                answerarray[num][0] = (dots[i][0]) - (dots[j][0]);
                answerarray[num][1] = (dots[i][1]) - (dots[j][1]);
                num += 1;
            }
        }
        for (int i = 0; i < answerarray.length - 1; i++) {
            for (int j = i + 1; j < answerarray.length; j++) {
                if (Arrays.equals(answerarray[i],answerarray[j])) {
                    //다차원배열 비교할 떄, 열 하나만 써도 됨
                    answer = 1;
                    break;
                }
            }
        }
        System.out.println(answer);
    }
}
(배열이름).length
다차원 배열일 경우, 행의 길이
(다차원배열이름)[(배열내 특정 인덱스)].length
다차원 배열일 경우, 특정 인덱스가 데이터론 가지고 있는 배열의 길이
ex) 위와 같이 4*2 배열일 때, dots[0].length=2

 

  • 다차원 배열도 자유롭게 길이를 쓸수 있다는 것

**주의**

  • 배열을 비교할 때, .equals() 나 = 또는 == 를 쓰지 않고 무조건 Arrays.equals()나 Arrays.deepEquals() 사용해야

 

 

문제 연습

두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.예를 들어 A가 B에게 선물을 5번 줬고, B가 A에게 선물을 3번 줬다면 다음 달엔 A가 B에게 선물을 하나 받습니다.두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 같다면, 선물 지수가 더 큰 사람이 선물 지수가 더 작은 사람에게 선물을 하나 받습니다.선물 지수는 이번 달까지 자신이 친구들에게 준 선물의 수에서 받은 선물의 수를 뺀 값입니다.예를 들어 A가 친구들에게 준 선물이 3개고 받은 선물이 10개라면 A의 선물 지수는 -7입니다. B가 친구들에게 준 선물이 3개고 받은 선물이 2개라면 B의 선물 지수는 1입니다. 만약 A와 B가 선물을 주고받은 적이 없거나 정확히 같은 수로 선물을 주고받았다면, 다음 달엔 B가 A에게 선물을 하나 받습니다.만약 두 사람의 선물 지수도 같다면 다음 달에 선물을 주고받지 않습니다.

위에서 설명한 규칙대로 다음 달에 선물을 주고받을 때, 당신은 선물을 가장 많이 받을 친구가 받을 선물의 수를 알고 싶습니다.

친구들의 이름을 담은 1차원 문자열 배열 friends 이번 달까지 친구들이 주고받은 선물 기록을 담은 1차원 문자열 배열 gifts가 매개변수로 주어집니다. 이때, 다음달에 가장 많은 선물을 받는 친구가 받을 선물의 수를 return 하도록 solution 함수를 완성

 

import java.util.Arrays;

public class Practice {
    public static void main(String[] args) {
        String[] friends = {"muzi", "ryan", "frodo", "neo"}; //친구이름
        String[] gifts = {"muzi frodo", "muzi frodo", "ryan muzi", "ryan muzi", "ryan muzi", "frodo muzi", "frodo ryan", "neo muzi"};
        int[] friends_rate = new int[friends.length];
        int[] awards = new int[friends.length];
        for (int i = 0; i < awards.length; i++) { // 0으로 초기화
            awards[i] = 0;
        }
        // 개인별 friends_rate 지수 정하기
        for (int i = 0; i < friends.length; i++) {
            int give = 0;
            int take = 0;
            for (int j = 0; j < gifts.length; j++) {
                if (gifts[j].contains(friends[i] + " ")) {
                    give += 1;
                }
                if (gifts[j].contains(" " + friends[i])) {
                    take -= 1;
                }
            }
            friends_rate[i] = give + take;
        }

        // 다음 달 받을 각 개인별 선물 수, 같을 경우 friends_rate으로 비교
        for (int i = 0; i < friends.length - 1; i++) {
            for (int j = i + 1; j < friends.length; j++) {
                int num1 = 0; // i 준선물수
                int num2 = 0; // j 준선물수
                int sum1 = 0; // i 받아야할 선물 수
                int sum2 = 0; // j 받아야할 선물 수

                for (int k = 0; k < gifts.length; k++) {
                    if (gifts[k].equals(friends[i] + " " + friends[j])) {
                        num1 += 1;
                    }
                    if (gifts[k].equals(friends[j] + " " + friends[i])) {
                        num2 += 1;
                    }
                }
                //주고 받은 갯수 비교
                if (num1 > num2) {
                    awards[i] += 1;
                }
                if (num1 < num2) {
                    awards[j] += 1;
                }
                if (num1 == num2) {
                    //선물 지수 비교
                    if (friends_rate[i] > friends_rate[j]) {
                        awards[i] += 1;
                    }
                    if (friends_rate[i] < friends_rate[j]) {
                        awards[j] += 1;
                    }
                }
            }

        }

        Arrays.sort(awards);// int[] (변수이름) 해서 선언X 메서드
        int answer = awards[(awards.length-1)];// 마지막 인덱스는 길이 번호가 아닌라는거 항상 명심

        System.out.println(Arrays.toString(awards));
        System.out.println(Arrays.toString(friends_rate));
        System.out.println(answer);
    }
}

 

  1. 제일 먼저 주고 받은 선물 수가 똑같을 경우, 선물을 하나 받아야하기 때문에 판단 지표인 '선물 지수'를 모든 사람에 정대해 지정해서 선물 지수 배열을 만듬
  2. 한명씩 순서에 맞춰서 비교
  3. 비교해서 선물을 받아야할 경우, 각자 받을 선물 수를 배열로 만들어서 추가
  4. 받을 선물수를 오름차순으로 정리, 마지막 제일 큰 수를 출력

정수 배열에서 가장 큰 정수값 출력하기

  • Arrays.sort() 로 배열을 오름차순으로 정리 **단, 이를 어떤 변수로 선언할 수는 없음
  • 그 다음에 마지막 인덱스값 ( .length-1 번째 )으로 호출

 

개선

import java.util.Arrays;

public class Practice2 {
    public static void main(String[] args) {
        String[] friends = {"muzi", "ryan", "frodo", "neo"}; // 친구이름
        String[] gifts = {"muzi frodo", "muzi frodo", "ryan muzi", "ryan muzi", "ryan muzi", "frodo muzi", "frodo ryan", "neo muzi"};
        int[] friends_rate = new int[friends.length];
        int[] awards = new int[friends.length];

        // 0으로 awards 배열 초기화
        Arrays.fill(awards, 0);

        // 개인별 friends_rate 지수 정하기
        for (int i = 0; i < friends.length; i++) {
            int give = 0;
            int take = 0;
            for (String gift : gifts) { // 향상된 for
                if (gift.contains(friends[i] + " ")) {
                    give += 1;
                }
                if (gift.contains(" " + friends[i])) {
                    take -= 1;
                }
            }
            friends_rate[i] = give + take;
        }

        // 다음 달 받을 각 개인별 선물 수, 같을 경우 friends_rate으로 비교
        for (int i = 0; i < friends.length - 1; i++) {
            for (int j = i + 1; j < friends.length; j++) {
                int num1 = 0; // i 준 선물 수
                int num2 = 0; // j 준 선물 수

                for (String gift : gifts) { //향상된 for
                    if (gift.equals(friends[i] + " " + friends[j])) {
                        num1 += 1;
                    }
                    if (gift.equals(friends[j] + " " + friends[i])) {
                        num2 += 1;
                    }
                }

                // 주고 받은 갯수 비교
                if (num1 > num2) {
                    awards[i] += 1;
                } else if (num1 < num2) {
                    awards[j] += 1;
                } else {
                    // 선물 지수 비교
                    if (friends_rate[i] > friends_rate[j]) {
                        awards[i] += 1;
                    } else if (friends_rate[i] < friends_rate[j]) {
                        awards[j] += 1;
                    }
                }
            }
        }

        Arrays.sort(awards); // awards 배열 정렬
        int answer = awards[awards.length - 1]; // 최댓값 선택

    }
}

 

Arrays.fill((초기화할 배열), (초기화할 값))

배열의 모든 인덱스값들을 전부 초기화할 값으로 

 

향상된 for

for( (배열타입) (정의할 변수) : (향상된 for을 사용할 배열) ) {…}
  • 배열의 크기 만큼 반복하면서 각 배열의 요소를 새롭게 정의할 변수에 저장.
    • for (int i = 0; i < (배열).length; i++){…} 을 사용할 때 쓸 수 있음
  • 직접적인 인덱스 접근이 불가능, 단순히 전체 값을 순회할 때만 사용
    • for (int i = 0; i < Array.length - 1; i++) {...} 이나 for (int i = 2; i < Array.length - 1; i++) {...} 이러한 반복은 사용을 잘 안하고, 까다로움

for( (배열타입) (정의할 변수) : (향상된 for을 사용할 배열) ) {…}

  • 배열의 크기 만큼 반복하면서 각 배열의 요소를 새롭게 정의할 변수에 저장.
    • for (int i = 0; i < (배열).length; i++){…} 을 사용할 때 쓸 수 있음
  • 직접적인 인덱스 접근이 불가능, 단순히 전체 값을 순회할 때만 사용
    • for (int i = 0; i < Array.length - 1; i++) {...} 이나 for (int i = 2; i < Array.length - 1; i++) {...} 이러한 반복은 사용을 잘 안하고, 까다로움