개발/CodingTest

CodingTest - Array(1, 2차원 배열) / 1

잇(IT) 2023. 10. 16. 12:28
728x90
1.
N개의 정수를 입력받아,
자신의 바로 앞 수보다 큰 수만 출력하는 프로그램을 작성하세요.
(첫 번째 수는 무조건 출력한다)

 

- 방법 1

import java.util.ArrayList;
import java.util.Scanner;

public class sec2_1 {

    public ArrayList<Integer> solution(int num, int[] arr) {
        ArrayList<Integer> answer = new ArrayList<>();
        answer.add(arr[0]);
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] < arr[i + 1]) {
                answer.add(arr[i + 1]);
            }
        }
        return answer;
    }

    public static void sec2_1(String[] args) {
        sec2_1 sec2_1 = new sec2_1();
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int[] ints = new int[num];
        for (int i = 0; i < num; i++) {
            ints[i] = scanner.nextInt();
        }
        for (int x : sec2_1.solution(num, ints)) {
            System.out.print(x + " ");
        }
    }
}

- 별 다른 어려움은 없었던 문제다.

 


2.
선생님이 N명의 학생을 일렬로 세웠습니다.
일렬로 서 있는 학생의 키가 앞에서부터 순서대로 주어질 때,
맨 앞에 서 있는 선생님이 볼 수 있는 학생의 수를 구하는 프로그램을 작성하세요.
(앞에 서 있는 사람들보다 크면 보이고, 작거나 같으면 보이지 않습니다.)

 

- 방법 1

import java.util.Scanner;

public class Main {

    public int solution(int num, int[] ints) {

        int answer = 0;
        int count = 0;
        int canSee = 1;
        for (int i = 0; i < ints.length; i++) {
            for (int j = 0; j < i; j++) {
                if (ints[i] <= ints[j]) {
                    count = 0;
                    break;
                }
                count = 1;
            }
            if (count == 1) {
                canSee++;
            }
            answer = canSee;
        }
        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int[] ints = new int[num];
        for (int i = 0; i < num; i++) {
            ints[i] = scanner.nextInt();
        }
        System.out.print(main.solution(num, ints));
    }
}

- 첫번째 내가 짠 코드인 위 코드의 경우 for문을 2번 돌기 때문에 시간 복잡도가 O(n^2)이기 때문에 효율이 좋지 못하다. 

 

- 방법 2

import java.util.Scanner;

public class Main {

    public int solution(int num, int[] ints) {

        int answer = 0;
        int max = ints[0];
        int count = 1;

        for (int i = 0; i < ints.length; i++) {
            if (ints[i] > max) {
                max = ints[i];
                count++;
            }
            answer = count;
        }

        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int[] ints = new int[num];
        for (int i = 0; i < num; i++) {
            ints[i] = scanner.nextInt();
        }
        System.out.print(main.solution(num, ints));
    }
}

1. 제일 큰 숫자를 max로 지정하고, for문을 돌면서 max보다 큰지 아닌지 확인한다.

2. 만약 큰 값이 있다면 max의 값을 변경해주고, count++ 추가해준다.

 

- 위 방법의 경우 for문을 한 번 돌기 때문에 처음 짠 코드보다 시간 복잡도가 줄어드는 코드임을 알 수 있다.


3.
A, B 두 사람이 가위바위보 게임을 합니다.
총 N번의 게임을 하여 A가 이기면 A를 출력하고, B가 이기면 B를 출력합니다.
비길 경우에는 D를 출력합니다.
가위, 바위, 보의 정보는 1:가위, 2:바위, 3:보로 정하겠습니다. 
두 사람의 각 회의 가위, 바위, 보 정보가 주어지면 각 회를 누가 이겼는지 출력하는 프로그램을 작성하세요.

- 방법 1

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public ArrayList<String> solution(int num, int[] ints, int[] ints2) {

        ArrayList<String> answer = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            if (ints[i] == ints2[i]) {
                answer.add("D");
            } else if (ints[i] == 1 && ints2[i] == 3) {
                answer.add("A");
            } else if (ints[i] == 2 && ints2[i] == 1) {
                answer.add("A");
            } else if (ints[i] == 3 && ints2[i] == 2) {
                answer.add("A");
            } else {
                answer.add("B");
            }

        }
        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);

        int num = scanner.nextInt();
        int[] ints = new int[num];
        int[] ints2 = new int[num];
        for (int i = 0; i < num; i++) {
            ints[i] = scanner.nextInt();
        }
        for (int i = 0; i < num; i++) {
            ints2[i] = scanner.nextInt();
        }
        for (String x : main.solution(num,ints,ints2)) {
            System.out.println(x);
        }
    }
}

- 크게 어려움은 없었던 문제였던 것 같다.


4.
1) 피보나키 수열을 출력한다. 피보나치 수열이란 앞의 2개의 수를 합하여 다음 숫자가 되는 수열이다.
2) 입력은 피보나치 수열의 총 항의 수 이다. 만약 7이 입력되면 1 1 2 3 5 8 13을 출력하면 된다.

 

- 방법 1

import java.util.Scanner;

public class Main {

    public int[] solution(int num) {

        int[] answer = new int[num];
        answer[0] = 1;
        answer[1] = 1;

        for (int i = 2; i <= num; i++) {
            answer[i] = answer[i - 2] + answer[i - 1];
        }
        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        for (int x : main.solution(num)) {
            System.out.println(x+" ");
        }
    }
}

- 위 방법은 크게 어렵지 않았다. 

 

- 방법 2

import java.util.Scanner;

public class Main {

    public void solution(int num) {

        int a=1,b=1,c;
        System.out.print(a+" "+b+" ");
        for (int i = 2; i < num; i++) {
            c = a + b;
            System.out.print(c+" ");
            a=b;
            b=c;
        }
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        main.solution(num);
    }
}

- 피보나치 수열의 경우 앞의 두 숫자를 더한 값이 다음에 나오는 것이기 때문에 기존의 두 숫자를 앞으로 계산되는 숫자와 계속해서 변경해 나가면서 계산하는 방식을 사용할 수도 있다.

- 위와 같이 값을 변경하는 방식으로 피보나치 수열에 대한 코드를 작성 할 수 있다.

 


5.
자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요.
만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다.

 

- 방법 1

import java.util.Scanner;

public class Main {

    public int solution(int num) {

        int answer = 0;

        for (int i = 2; i <= num; i++) {
            boolean isPrime = true;
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime) {
                answer++; // 소수인 경우 answer를 증가
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        int iNum = scanner.nextInt();
        System.out.println(main.solution(iNum));
    }
}

- 소수 구하는 방법... 조금 시간이 걸렸다...

 

1. 주어진 숫자의 앞의 숫자를 전부 하나씩 전부 나눠봤을 때 나머지가 0이 하나라도 나오면 소수가 아니라는 뜻이다.

2. 반복문이 끝까지 돌았을 때 나머지가 0인 애가 안나왔을 때 answer 값을 증가 시키는 코드를 작성하는데 시간이 왜인지 오래 걸렸다.

 

- 방법 2

import java.util.Scanner;

public class Main {

    public int solution(int num) {

        int answer =0;
        int[] ints = new int[num + 1];
        for (int i = 2; i <= num; i++) {
            if (ints[i] == 0) {
                answer++;
                for (int j = i; j <= num; j = j + i) {
                    ints[j] = 1;
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        int iNum = scanner.nextInt();
        System.out.println(main.solution(iNum));
    }
}

1. 인덱스 값을 0 or 1로 지정하는 방식이다.

2. 2부터 2의 배수에 해당하는 인덱스는 전부 1로 바꾼다 (2의 배수에 해당하면 해당 값은 소수가 아니기 때문이다.)

3. 마찬가지로 3,4,5 쭉 for문으로 돌면서 모든 값을 2.와 같이 적용시킨다.(4의 경우 이미 2.에서 인덱스가 1로 변경되었기 때문에 별도의 작업을 하지 않는다.)

 

- 위 방법은 처음에 생각해내지 못했지만 시간복잡도에 있어서 방법 1 보다 더 최적화된 방법이다.


6.
N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하는 프로그램을 작성하세요.
예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력한다. 단 910를 뒤집으면 19로 숫자화 해야 한다.
첫 자리부터의 연속된 0은 무시한다.

 

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public 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 ArrayList<Integer> solution(int num, int[] ints) {

        ArrayList<Integer> answer = new ArrayList<>();

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

            int rNum=0;
            while (ints[i] != 0) {
                int tmp = ints[i]%10;
                rNum = rNum * 10 + tmp;
                ints[i] /= 10;
            }
            if (isPrime(rNum)) answer.add(rNum);
        }
        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        int iNum = scanner.nextInt();
        int[] ints = new int[iNum];
        for (int i = 0; i < iNum; i++) {
            ints[i] = scanner.nextInt();
        }
        for (int x : main.solution(iNum, ints)) {
            System.out.print(x + " ");
        }
    }
}

- 숫자 뒤집는 부분에서 애를 많이 먹었다...

 

1. 숫자를 뒤집는 것은 문자를 뒤집는 것과 다르다. (문자를 뒤집는 것은 StringBuilder의 reverse를 통해서 뒤집을 수 있다. * 추가로 replace를 사용할 수 있다는 것도 한 번 더 기억해두자)

2. 자연수를 10으로 나눈 나머지 즉 n%10은 일의 자리가 된다.

3. 나머지를 새로운 변수(newNum)에 넣고, 그 다음 또 10으로 나눈 숫자를 또 10으로 나누게 되면 다음으로 10의 자리 숫자의 자리수가 나온다. 해당 숫자를 이전에 생성한 새로운 변수(newNum)을 10을 곱하고 더한다. -> 기존의 자리수가 10의 자리로 변경되고, 일의 자리숫자에 현재 구한 일의 자리 숫자가 들어간다.

 

* 입력 숫자 받는거랑... 해당 변수 값이 어떻게 변하는지 잘 파악하자...


7.
OX 문제는 맞거나 틀린 두 경우의 답을 가지는 문제를 말한다.
여러 개의 OX 문제로 만들어진 시험에서 연속적으로 답을 맞히는 경우에는 가산점을 주기 위해서 다음과 같이 점수 계산을 하기로 하였다.
1번 문제가 맞는 경우에는 1점으로 계산한다. 앞의 문제에 대해서는 답을 틀리다가 답이 맞는 처음 문제는 1점으로 계산한다.
또한, 연속으로 문제의 답이 맞는 경우에서 두 번째 문제는 2점, 세 번째 문제는 3점, ..., K번째 문제는 K점으로 계산한다. 틀린 문제는 0점으로 계산한다.
예를 들어, 아래와 같이 10 개의 OX 문제에서 답이 맞은 문제의 경우에는 1로 표시하고, 틀린 경우에는 0으로 표시하였을 때, 점수 계산은 아래 표와 같이 계산되어, 총 점수는 1+1+2+3+1+2=10 점이다.

시험문제의 채점 결과가 주어졌을 때, 총 점수를 계산하는 프로그램을 작성하시오.

 

- 방법 1

import java.util.Scanner;

public class Main {

    public int solution(int iNUm, int[] ints) {

        int answer = 0, cnt = 0;

        for (int i = 0; i < iNUm; i++) {
            if (ints[i] == 1) {
                cnt++;
                answer += cnt;
            } else {
                cnt = 0;
            }
        }

        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        int iNum = scanner.nextInt();
        int[] ints = new int[iNum];
        for (int i = 0; i < iNum; i++) {
            ints[i] = scanner.nextInt();
        }
        System.out.println(main.solution(iNum, ints));
    }
}

- 사실 한 번에 풀지 못한 문제다... 어렵게 생각해서 그런건지... 뭔가 급하게 풀려고 해서 그런지는 모르겠지만... 

 

1. 배열을 순차적으로 검색하면서 1이 연속되면 count를 위해 만든 변수를 1씩 계속해서 증가 시키고 해당 값을 sum에 넣어주면 된다.

2. 만약 중간에 0을 만난다면 count를 0으로 초기화 하면된다.

 

- 사실 count를하고, 0을 만나면 다시 0으로 초기화 하는 방법은 떠올랐지만... 생각한 것을 코드로 풀어내는 연습을 꾸준하게 해야겠다...


 

728x90