프로그래머스 문제풀이/알고리즘 (JAVA)

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 1 (30~34번 문제풀이) / Level 0 (224/224)

남건욱 2023. 10. 26. 13:56
반응형
30. x만큼 간격이 있는 n개의 숫자

문제

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        long num = x;
        
        for(int i=0; i<n; i++){
            answer[i] = num + (i*num);
        }
        
        return answer;
    }
}

<작성한 코드>

간단한 문제다. answer의 길이는 n만큼 선언해 주고 반복문으로 answer [i]에 각각의 x + (i*x)를 해준 뒤 대입해 줬다. x를 long형 num에 대입해 준 이유는 매개변수 x가 int형인데 큰 값이 들어오면 오버플로우가 생긴다. 그래서 long형 변수로 따로 만들어서 사용하였다.

 

 

 

31. 직사각형 별찍기

문제

import java.util.Scanner;

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

        for(int i=1; i<=a*b; i++){
            System.out.print("*");
            if(i%a == 0){
                System.out.println();
            }
        }
        
        
    }
}

<작성한 코드>

간단한 문제다. 풀던 방식이 아닌 다른 방법으로 풀어보고 싶어서 for문으로 i는 1부터 a*b까지 별을 출력하게 한 뒤 내부에서 i% a가 0일 때 \n을 해줬다.

 

 

 

32. 소수 만들기

문제

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        
        for(int i=0; i<nums.length-2; i++){
            for(int j=i+1; j<nums.length-1; j++){
                for(int k=j+1; k<nums.length; k++){
                    int sum = nums[i] + nums[j] + nums[k];
                    if(real(sum)){
                        answer++;
                    }
                }
            }
        }

        return answer;
    }
    
    private boolean real(int num){
    if(num < 2) return false;
    for(int i=2; i<=Math.sqrt(num); i++){
        if(num%i == 0) return false;
    }
    
    return true;
    }

    
}

<작성한 코드>

우선 real 메서드를 만들었다. 소수 인지 판단하기 위해서 num이 2보다 작은 수면 바로 false를 리턴하고 아니라면 i는 2부터 제곱근(Math.sqrt())까지 반복해 주고 약수가 있다면 false를 리턴해준다. 만약 약수가 없다면 true를 리턴한다.

메인함수에서는 총 3개의 숫자를 반복해야 하니 for문을 3번 중첩해서 사용하였다. 그 뒤 숫자 세 개를 더해서 sum을 만들어주고 real(sum)을 해서 true, false를 확인했다. 만약 true라면 answer에 1을 더해준다. 그 후 마지막으로 answer를 반환해 주고 끝냈다.

 

 

 

33. 예산

문제

import java.util.*;

class Solution {
    public int solution(int[] d, int budget) {
        int answer = 0;
        
        Arrays.sort(d);
        
        for(int i=0; i<d.length; i++){
            budget -= d[i];
            
            if(budget < 0){
                break;
            }
            
            answer ++;
        }
        
        return answer;
    }
}

<작성한 코드>

정수형 배열 d를 오름차순으로 정렬해 준 뒤 for문을 사용해서 보유자산 - 지원금액을 빼줬다. 만약 지원금액이 -가된다면 for문을 멈춘다. 0보다 크다면 answer에 1씩 더해줬다. 그 뒤 answer을 반환해 줬다.

 

 

 

34. [1차] 비밀지도

문제

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        
        for(int i=0; i<n; i++){
            int map = arr1[i] | arr2[i];
            
            String map2 = Integer.toBinaryString(map);
            
            while(map2.length() < n){
                map2 = "0" + map2;
            }
            
            map2 = map2.replaceAll("1", "#");
            map2 = map2.replaceAll("0", " ");
            
            answer[i] = map2;
        }
        
        return answer;
    }
}

<작성한 코드>

#이 하나라도 있으면 #이고 둘 다 공백이면 공백이라는 걸 보면 OR연산을 해주면 된다. 그래서 for문을 사용해서 n번까지 반복해 주고 내부에서는 int형 변수 map에 arr1 [i]와 arr2 [i]의 OR연산을 해줬다. 그 뒤 문자열 변수 map2에 정수형 변수 map을 2진수로 변환해 줬다. 현재 5자리가 나와야 하기 때문에 while문을 사용해서 map2의 길이가 n보다 짧다면 n과 같아질 때까지 map2의 앞에 0을 추가해 줬다. 그 뒤. replaceAll을 사용해서 map2 내부에 있는 1은 #으로 0은 공백으로 변경했다. 그 뒤 answer [i]에 계산된 map2값을 넣으면 된다. 마지막으로 answer을 반환해 줬다.

반응형
프로필사진

남건욱's 공부기록