본문 바로가기

자바 자료구조 알고리즘/문자열 & 배열 & 투포인터 & 정렬

코딩 테스트 Java 배열 문제 풀이

개요와 목적

코딩 테스트 대표적인 자바 배열 문제들을 풀어보고,

배열의 문제 풀이 방식에 대해서 알아본다.

뒤집은 소수 구하기(소수와 수 뒤집기 알고리즘 이해)

9 32 55 62 20 250 370 200 30 100


풀이

수를 먼저 뒤짚은 값을 구하고 prime인지 확인하는 메소드를 실행하디.

import java.util.Scanner;

public class 뒤짚은소수 {
		
		//소수인지 판별하는 메소드 소수라면 true를 반환 한다.
    public static boolean isPrime(int num) {
        if(num==1) return false;
        for(int i=2; i<num; i++){
            if(num%i==0) return false;
        }
        return true;
    }
		
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        for (int tmp : arr) {
            //뒤짚은 수 구하기 이 부분이 핵심이다.
            int res = 0;
            while (tmp > 0) {
                int t = tmp % 10;
                res = res * 10 + t;
                tmp = tmp / 10;
            }
            if (isPrime(res)) {
                System.out.print(res+" ");
            }
        }
    }
}

등수 구하기

5 87 89 92 100 76


풀이

answer 배열을 생성해서 이중 for문을 돌아 자신보다 큰 수가 있으면 cnt++을 통해 자신의 성적을 구한다.

import java.util.Arrays;
import java.util.Scanner;

public class 등수구하기 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        
        int[] answer = new int[n];
        for(int i=0; i<n; i++){
            int cnt=1;
            //arr[0]부터 arr[0]~arr[4]과 비교하며 자신보다 큰 값이 있으면 등수를 
            //한칸씩 미룬다(cnt++)
            //그 값을 해당 answer[] 인덱스 넣는다.
            for(int j=0; j<arr.length; j++){
                if(arr[j]>arr[i]) cnt++;
            }
            answer[i]=cnt;
        }
        System.out.println(Arrays.toString(answer));
    }

임시 반장 구하기

5 2 3 1 7 3 4 1 9 6 8 5 5 2 4 4 6 5 2 6 7 8 4 2 2 2

풀이

i =1,2,3,4,5 배열의 k 번째 값(arr[i][k])과 각 j의 1,2,3,4,5 k번 째 값중(arr[j][k]에 같은 것이 있는 지 확인한다.

즉 a[1][k]는→ a[1][k], a[2][k], a[3][k], a[4][k], a[5][k 와 비교해 같은 값이 있는 지 찾고 찾을 수만큼 cnt 표시를 한다.

한번 같은 반인 것을 확인 했으면 i번과 j의 같은 값 찾는 것을 그만한다.

3번 학생과 4번 학생이 2학년에서 같아서 cnt++해주었는데, 3학년까지 같아서 cnt++ 또 해주면 안되기 때문이다.

import java.util.Arrays;
import java.util.Scanner;

public class 임시반장구하기 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] arr = new int[n + 1][6];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= 5; j++) {
                arr[i][j] = sc.nextInt();
            }
        }
        System.out.println(Arrays.deepToString(arr));
        for (int[] ints : arr) {
            System.out.println(Arrays.toString(ints));
        }

        int answer = 0, max = 0;
        for (int i = 1; i <= n; i++) {
            int cnt = 0;
            for (int j = 1; j <= n; j++) {
                for (int k = 1; k <= 5; k++) {
                    if (arr[i][k] == arr[j][k]) {
                        cnt++;
                        //한번 같은 반 되었으면 그만 센다. 3번학생과 4번 학생이 2학년에서 같아서 cnt++
                        //해주었는데, 3학년까지 같아서 cnt++ 또해주면 안되니깐
                        //i번 j번 학생이 같은 것을 한번 확인 했으면 break 걸어준다.
                        break;
                    }
                }
            }
            if (cnt > max) {
                max = cnt;
                answer = i;
            }
        }
        System.out.println(answer);
    }
}

멘토링

4 3 3 4 1 2 4 3 2 1 3 1 4 2


풀이

import java.util.Scanner;

public class 멘토링 {

    public static void main(String[] args){
        Scanner kb = new Scanner(System.in);
        int n=kb.nextInt();
        int m=kb.nextInt();
        int[][] arr=new int[m][n];
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                arr[i][j]=kb.nextInt();
            }
        }
        System.out.println(solution(n,m,arr));
    }

    public static int solution(int n, int m, int[][] arr) {
        int answer = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                int cnt = 0;
                for (int k = 0; k < m; k++) {
                    int pi = 0, pj = 0;
                    for (int s = 0; s < n; s++) {
                        if (arr[k][s] == i) {
                            pi = s;
                        }
                        if (arr[k][s] == j) {
                            pj = s;
                        }
                    }
                    if (pi<pj) cnt++;
                }
                if (cnt == m) {
                    answer++;
                }
            }
        }
        return answer;
    }
}