Pre 코딩테스트 1차 연습문제 1번

2024. 6. 2. 20:22제로베이스 백엔드 스쿨/코딩 테스트

1-1. 피라미드 쌓기

[문제 설명]
 블록으로 피라미드 모양의 탑을 쌓으려고 합니다. 피라미드 모양의 탑은 꼭대기는 1개의 블록을 사용하고, 그 아래는 2개의 블록, 그 아래에는 3개의 블록의 방식으로 쌓습니다.
 n 층의 피라미드 모양의 탑을 쌓을 때, 필요한 블록의 수를 구하는 함수, solution을 완성해주세요.

 예를 들어, 4층의 피라미드에는 총 10개의 블록이 필요합니다.
 > 4층에 사용되는 블록 수 1개
 > 3층에 사용되는 블록 수 2개
 > 2층에 사용되는 블록 수 3개
 > 1층에 사용되는 블록 수 4개
 > 피라미드에 사용되는 블록의 총수는 10개입니다.


[입력 형식]
 - n은 1 이상 1,000 이하의 정수입니다.


[출력 형식]
 - 피라미드 모양의 탑을 쌓는데 필요한 블록의 총수를 구합니다.

 

내가 작성한 답변

// 피라미드 쌓기

import java.util.Scanner;

public class Practice1_1 {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();

        int result = 0;
        for (int i = 1; i < N+1; i++){
            result += i;
        }
        System.out.println(result);
    }
}

 

답안

class Solution {
    public int solution(int n) {
        return (1 + n) * n / 2;
    }
}

 

1 + 2 + ... + (n-1) + n = (1+n)*n / 2라고 판단

 

피드백: class Solution 메소드를 통하여 작성할 것, 그리고 return을 통해 복잡도와 용량 차지를 줄이는 방법 택하기

 

 

 

 

1-2. 모래쌓기 게임

[문제 설명]
 여름을 맞아 가족들과 함께 해수욕장을 방문했습니다.
 코로나로 인해서 많은 사람이 각자의 파라솔 아래에서 마스크를 쓰고 둘러앉아 모래 뺏기 게임을 하고 있습니다.
 흥민이와 흥민이의 누나는 `num`kg의 모래를 쌓아두고 게임을 시작합니다.
 모래성 중앙의 깃발이 쓰러지지 않도록 하는 모래성의 무게는 `1kg`입니다.
 흥민, 누나의 순서대로 게임이 진행됩니다.
 한사람이 한 번에 가져갈 수 있는 모래의 양은 최소 `1kg`, 최대 `3kg`입니다.
 여기에서 모래의 양 `num`을 입력하여 흥민이가 이길 수 있는 경우를 `true, false`로 출력하는 함수를 작성해 보세요.


[제한 사항]
 - 최소 `1kg`, 최대 `3kg`의 모래를 가져갈 수 있습니다.
 - 흥민, 누나의 순서대로 게임이 진행됩니다.
 - 모래성은 `1kg미만`으로 남게 되면 쓰러집니다.
 - 즉, `1kg`이 자기 차례에 남으면 승리합니다.


[입력 형식]
 - num은 1 이상 100,000 이하의 정수입니다.


[출력 형식]
 - 흥민이가 이길 수 있는 경우를 `true, false`로 출력합니다.

 

 

이길 수 있냐 없냐의 여부만 true, false로 출력하면 되기 때문에 경우의 수를 찾는다거나 그런 문제는 아님

 

 

 

1-3. 주식에서 (매수 이후 매도) 가능한의 최대 수익을 구하는 함수

배열 A는 십만전자의 일단위 주식가격이 들어있습니다.
해당 주식 가격 기준으로 매수와 매도를 1회씩 진행했을때 가능한 최대 수익을 구하는 함수를 작성하세요.

이때 매도는 항상 매수 이후에 이루어지며 수익을 낼수 없는 경우 0을 리턴하세요.

입력
 주식의 일단위 주가 정보 배열 A

출력
 최대 수익 값



매개변수 : int[] A
리턴타입 : int

 

 

매도는 항상 매수 이후에 이뤄져야 함을 기억해두기

배열 중에서도 이전 것을 매도하고 매수할 때 수익이 일어나는지를 확인해야하는 것임

public class Practice1_3 {

    public static int solution(int[] A) {
        int N = A.length;
        int[] stock = new int[N];

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++){
                int revenue = A[i] - A[j]; // 항상 매수 이후에 매도 이루어짐
                if (revenue > 0 && stock[j] < revenue) {
                    stock[j] = revenue; // 매 반복으로 다음 인덱스로 넘어갈 때마다 수익이 갱신되면 새로 저장하는 구조의 형식
                }
            }
        }
        // 해당 배열에서 가장 max한 값을 배출하는 형식으로 하기 위하여 Arrays 클래스를 사용
        return Arrays.stream(stock).max().getAsInt();
        // 수익이 나지 않으면 stock 배열에 저장이 안 될 것이기 때문에 return되면 0이 저절로 나옴
    }


    public static void main(String[] args) {
        System.out.println(solution(new int[]{1000, 100000, 2000, 3000, 30000}));
    }
}

 

 

 

1-4. 숫자로 구성된 문자열에서 가장 많이 나온 숫자 카운트

[문제 설명]
 숫자로 이루어진 문자열 s가 있습니다. 이 문자열에서 가장 많이 등장하는 수를 출력하는 함수, solution을 완성해주세요.
 예를 들어, s가 '104001100'로 주어질 때, 가장 많이 등장하는 수는 0입니다.


[제한 사항]
 - 등장하는 수가 같은 경우, 작은 수를 출력합니다.


[입력 형식]
 - s는 길이가 1 이상 100 이하의 문자열입니다.
 - s는 숫자로 구성됩니다.


[출력 형식]
 - 가장 많이 등장하는 수를 출력합니다.

 

 

문자열의 숫자 하나하나를 인식해야함

https://dlee0129.tistory.com/94

 

[JAVA 자바] 문자열(String) forEach(Enhanced for) 사용법

JAVA 자바 문자열 forEach(Enhanced for) 사용법 (enhanced for문을 forEach로 취급하겠습니다...) 개요 아래와 같이 문자열(String) 타임의 s를 forEach를 사용하려 하면, for (char c : s) { ... }다음과 같은 애러 등이

dlee0129.tistory.com

forEach 사용하는 방식도 존재 + toCharArray를 이용

 

예제코드

public class Main {
    public static void main(String[] args) {
        String numberString = "1234567890";

        // 문자열을 char 배열로 변환
        char[] charArray = numberString.toCharArray();

        // 결과 출력
        for (char c : charArray) {
            System.out.print(c + " ");
        }
    }
}

 

 

위의 것들을 참고하여 내가 작성한 답안

public class Practice1_4 {

    public static int solution(String str) {

        // 문자열을 char로 변환
        char[] charArr = str.toCharArray();

        int[] numsCount = new int[10]; // 0~9
        for (char c : charArr) {
            int num = Integer.parseInt(String.valueOf(c));
            numsCount[num]++;
        }

        int result = -1;
        int maxCount = 0;

        for (int i =0; i < numsCount.length; i++) {
            if (maxCount < numsCount[i]) {
                result = i;
                maxCount = numsCount[i];
            }
        }
        return result;
    }

    public static void main(String[] args) {

        System.out.println(solution("10003231314"));
        System.out.println(solution("4789279038183231232"));
    }
}

 

답안

class Solution {
    public int solution(String s) {
        int[] numsCount = new int[10];

        for (int i = 0; i < s.length(); i++) {
            int num = Integer.parseInt(s.substring(i, i+1));
            numsCount[num]++;
        }

        int result = -1;
        int maxCount = 0;
        for (int i = 0; i < numsCount.length; i++) {
            if (maxCount < numsCount[i]) {
                result = i;
                maxCount = numsCount[i];
            }
        }
        return result;
    }
}

위의 답안에서는 for Each 를 통한 쪼개기가 아니라 substring과 for문을 이용하여 하나하나 인덱싱에 대하여 쪼개기만 진행하였음

 

 

1-5. 결과가 0이 될 때까지 시행된 연산의 횟수 구하기

문자열 S는 2진수로 표현된 양의 정수입니다.

해당 정수에 아래의 연산을 수행합니다.

  만약 숫자가 짝수인 경우 해당 값의 2를 나눈다.
  만약 숫자가 홀수인 경우 1을 뺀다.

연산의 결과가 0이 될때까지 반복해서 수행했을 때 수행된 연산 횟수 N을 구하는 함수를 작성하세요.

입력
 2진수가 표현된 String S

출력
 결과가 0이 될때까지 수행한 연산 횟수 N



매개변수 : String S
리턴타입 : int

 

 

이진수로 입력된 String이기 때문에 format이 중요함

답안

// 연산의 결과가 0이 될 때까지의 연산 횟수 출력 프로그램

public class Practice1_5 {

    public static int solution(String S) {
        // 번거롭던 문자열을 변환
        String s = S.replaceFirst("^0*", ""); // 일단 이미 0이었던 것은 공백으로 변환(더이상 필요X)
        int n = 0;

        if (s.length() != 0) { // ""으로 변환했을 때 전부 0이었다면 length() = 0 됐음
            n = 1;
            String ss = s.substring(1); // 한 글자만 자름
            int one = (int)ss.chars().filter(c -> c == '1').count();
            int zero = (int)ss.chars().filter(c -> c == '0').count();

            n += (one * 2);
            n += zero;
        }

        return n;
    }

    public static void main(String[] args) {
        System.out.println(solution("000111010111011"));
        System.out.println(solution("01110101111010101"));
    }

}