[프로그래머스 LV.2] - JAVA[0]

hybiis·2023년 3월 2일
0

프로그래머스 - JAVA

목록 보기
16/19

1. 최댓값과 최솟값

📖Q1.

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

✍A1.

import java.util.*;
class Solution {
    public String solution(String s) {
        String answer = "";
        String arr[]=s.split(" ");
        int intarr[]=new int[arr.length];
        
        for(int i=0;i<arr.length;i++){
            intarr[i]+=Integer.parseInt(arr[i]);
        }
        
        Arrays.sort(intarr);        
        answer+=Integer.toString(intarr[0])+" "+Integer.toString(intarr[intarr.length-1]);
        
        return answer;
    }
}

✍A1-1. 이게 더 빠름

import java.util.*;
class Solution {
    public String solution(String s) {
        String answer = "";
        String arr[]=s.split(" ");
        int intarr[]=new int[arr.length];
        int a=0;
        
        for(String i: arr){
            intarr[a++]=Integer.parseInt(i);
        }
        
        StringBuffer sb= new StringBuffer();      
        sb.append(Arrays.stream(intarr).min().getAsInt());
        sb.append(" ");
        sb.append(Arrays.stream(intarr).max().getAsInt());
        
        return sb.toString();
    }
}

2. 올바른 괄호

📖Q2.

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

✍A2.

import java.util.*;
class Solution {
    boolean solution(String s) {
        boolean answer = true;

        if(s.charAt(0)==')'){
            return false;
        }
        
        Stack <Character> stack =new Stack<>();
        
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(c=='('){
                stack.push(c);
            }else{
                if(!stack.isEmpty()){
                    stack.pop();
                }                    
            }
        }
        
        if(stack.size()>0){
            return false;
        }

        return answer;
    }
}

3. 최솟값 만들기

📖Q3.

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다.
배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)

예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면

A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
A에서 세번째 숫자인 2, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)
즉, 이 경우가 최소가 되므로 29를 return 합니다.

배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.

✍A3. 처음에 sort를 이용해 B를 내림차순 해줬는데 효율성 문제로 틀림 그래서 for문 이용해줌

import java.util.*;
class Solution
{
    public int solution(int []A, int []B)
    {
        int answer = 0;
         
        Arrays.sort(A);
        Arrays.sort(B);
        
        int b[]=new int[B.length];
        int a=0;
        
        for(int i=B.length-1;i>=0;i--){
            b[a++]=B[i];
        }
        
        for(int i=0;i<B.length;i++){
                answer+=A[i]*b[i];            
        }
        return answer;
    }
}

4. 이진 변환 반복하기

📖Q4.

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

✍A4.

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int temp=0;
        
        while(!s.equals("1")){ // s가 1일때까지 while문 실행
            answer[1]+=s.length();
            s=s.replaceAll("0","");            
            temp=s.length();
            s=Integer.toBinaryString(temp); //2진수 변환
            
            answer[0]++;
            answer[1]-=temp;            
        }
        return answer;
    }
}

5. 숫자의 표현

📖Q5.

Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.

1 + 2 + 3 + 4 + 5 = 15
4 + 5 + 6 = 15
7 + 8 = 15
15 = 15
자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return하는 solution를 완성해주세요.

✍A5.

class Solution {
    public int solution(int n) {
        int answer = 1;
    
        if(n<3){
            return answer;
        }
        
        for(int i=1;i<=n/2+1 ; i++){
            int result =0;
            for(int j=i ; j<=n/2+1 ; j++){
                result+=j;
                if(result==n){
                    answer++;
                    break;
                }else if(result>n){
                    break;
                }
            }
        }
        return answer;
    }
}

6. 피보나치 수

📖Q6.

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.

예를들어

F(2) = F(0) + F(1) = 0 + 1 = 1
F(3) = F(1) + F(2) = 1 + 1 = 2
F(4) = F(2) + F(3) = 1 + 2 = 3
F(5) = F(3) + F(4) = 2 + 3 = 5
와 같이 이어집니다.

2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.

✍A6.

class Solution {
    public int solution(int n) {
        int answer = 0;
        int arr[]=new int[n+1];
        arr[0]=0;
        arr[1]=1;
        for(int i=2;i<=n;i++){
            arr[i]=(arr[i-1]+arr[i-2])%1234567; //오버플로우가 일어나지 않게 %연산을 사용해줌         
        }
        answer=arr[n];
        return answer;
    }
}

7. 다음 큰 숫자

📖Q7.

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.

조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.
예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.

✍A7.

class Solution {
    public int solution(int n) {
        int answer = 0;
        int count=Integer.bitCount(n);
        int count2=0;
 
        while(true){
            n++;
            count2=Integer.bitCount(n);           
            if(count2==count){
                return n;
                }
            }
 
    }
}

⚠️Integer.bitCount() 란?

int형 정수를 bit 변환 후 1의 수를 반환하는 함수

ex)

int n=15
int result=Integer.bitCount(n) //result=4

8. 짝지어 제거하기

📖Q8.

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa →

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

✍A8.

import java.util.*;
class Solution
{
    public int solution(String s)
    {

        Stack <Character> stack = new Stack<>();
        
        for(char c : s.toCharArray()){
            if(stack.size()==0){
                stack.push(c);
            }else if(stack.peek()==c){
                stack.pop();
            }else{
                stack.push(c);
            }
        }
    
        return stack.size()==0 ? 1:0;
    }
}

profile
초보 개발자

0개의 댓글