본문 바로가기
알고리즘/알고리즘 설명

20230625 Java 문제풀이

by JayAlex07 2023. 6. 25.

20230625 Java 문제풀이

 

 

전국 대회 선발 고사

 

학생 3명을 선발하는 문제이다

 

문제에서는 학생들의 등수가 담긴 배열과, 학생들의 참여 여부가 담긴 배열이 주어진다

 

두 개의 배열을 탐색하며, 선발 고사를 참여하는 학생들 중, 높은 등수를 가진 학생들을 고른다

 

높은 등수부터 10000 * (제일 높은 등수) + 100 * (2번째 높은 등수) + (3번째 높은 등수) 의 식을 구하는 것이다

import java.util.*;

class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        ArrayList<Integer> list = new ArrayList<Integer> ();

        // number는 등수를 말하는 것
        // 즉 등수는 1씩 증가할 것이고, 참가하는 학생이면 list에 제일 먼저 들어올 것
        int number = 1;
        while(list.size() < 3) {

            for (int i = 0; i < rank.length; i++) {
                if (rank[i] == number && attendance[i] == true) {
                    list.add(i);
                }
            }
            number++;
        }

        int answer = 10000 * list.get(0) + 100 * list.get(1) + list.get(2);

        return answer;
    }
}

 

 

배열의 원소 삭제하기

 

배열 2개가 주어진다

  • 정수가 담긴 배열1
  • 배열1에서 빼내야 할 정수들이 담긴 배열2가 주어진다

 

차집합을 통해서 배열1 중에, 배열2와 겹치는 숫자들을 없앤다

  • 차집합 : setOne.removeAll(setTwo);
  • 교집합 : setOne.allAll(setTwo);
  • 합집합 : setOne.retainAll(setTwo);

 

배열1과 같은 순서로 출력을 해야 해서, 배열1을 순회하며, 차집합으로 만들어진 set 안에 들어가 있는지 확인하면서 정답에 넣는다

  • .contains() 를 사용하면 된다

 

import java.util.*;

class Solution {

    public HashSet<Integer> toSet(int[] array) {
         HashSet<Integer> set = new HashSet<Integer> ();

        for (int i = 0; i < array.length; i++) {
            set.add(array[i]);
        }

        return set;
    }

    public ArrayList<Integer> solution(int[] arr, int[] delete_list) {
        ArrayList<Integer> answer = new ArrayList<Integer> ();

        HashSet<Integer> setOne = toSet(arr);
        HashSet<Integer> setTwo = toSet(delete_list);

        setOne.removeAll(setTwo);

        for (int i = 0; i < arr.length; i++) {
            if (setOne.contains(arr[i])){
                answer.add(arr[i]);
            }
        }

        return answer;
    }
}

 

 

정수를 나선형으로 배치하기

 

말 그대로 n이라는 정수가 주어지고 1부터 n * n의 정수를 그래프에 다가 배치를 하는 것읻

예)

n = 4

1     2     3     4

12   13   14   5

11   16   15   6

10    9     8    7

 

처음에는 테스트 케이스 하나가 시간 초과 에러가 났다

  • 반례 n = 1 을 한번 해보았고, 역시 에러가 났다
  • 그래서 while문을 들어가기 전에 if (n == 1) 을 통해, 먼저 1에 대한 그래프를 반환했다

 

그 외에는 모두 while문을 사용하여, 그래프 밖으로 나가거나 해당 좌표가 0일 때까지 한 방향으로 숫자를 넣을 수 있도록 했다

import java.util.*;

class Solution {
    public int[][] solution(int n) {

        int[][] answer = new int[n][n];

        int x = 0;
        int y = 0;
        int number = 1;

        if (n == 1) {
            answer[x][y] = 1;
        } else {
            while (number <= n * n) {

                while (y < n && answer[x][y] == 0) {
                    answer[x][y] = number;
                    y ++;
                    number ++;
                }
                y -= 1;
                x += 1;

                while (x < n && answer[x][y] == 0) {
                    answer[x][y] = number;
                    x ++;
                    number ++;
                }
                x -= 1;
                y -= 1;

                while (0 <= y && answer[x][y] == 0) {
                    answer[x][y] = number;
                    y --;
                    number ++;
                }
                x -= 1;
                y += 1;

                while (y < n && answer[x][y] == 0) {
                    answer[x][y] = number;
                    x --;
                    number ++;
                }
                x += 1;
                y += 1;
            }
        }

        return answer;
    }
}

OX퀴즈

기본적으로 모든 식은 X [연산자] Y = Z 이다

즉 문자열을 배열로 만들면, 배열의 길이는 무조건 5이다

이런 점을 사용하여, 연산자가 뭔지 알아낼 수 있고, X와 Y를 연산한 후 Z와 같은지 비교할 수 있다

class Solution {
    public ArrayList<String> solution(String[] quiz) {
        ArrayList<String> answer = new ArrayList<String>();
        int tempNum = 0;

        for (int i = 0; i < quiz.length; i++) {

            String[] calculate = quiz[i].split(" ");

            if (calculate[1].equals("-")) {
                tempNum = Integer.parseInt(calculate[0]) - Integer.parseInt(calculate[2]);
            } else if (calculate[1].equals("+")) {
                tempNum = Integer.parseInt(calculate[0]) + Integer.parseInt(calculate[2]);
            }

            if (tempNum == Integer.parseInt(calculate[4])) {
                answer.add("O");
            } else {
                answer.add("X");
            }

        }

        return answer;
    }
}

'알고리즘 > 알고리즘 설명' 카테고리의 다른 글

20230627 [Java] 문제풀이  (0) 2023.06.27
20230626 [Java] 문제풀이  (0) 2023.06.26
20230614 [Java] 문제풀이  (0) 2023.06.14
Java 문제풀이 (백준)  (1) 2023.06.13
[Java] 문제풀이 (Programmers)  (0) 2023.06.01