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

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (95~100번 문제풀이)

남건욱 2023. 10. 4. 23:38
반응형
95. 잘라서 배열로 저장하기

문제

class Solution {
    public String[] solution(String my_str, int n) {
        int numlength = 0;
        if(my_str.length() % n == 0){
            numlength = my_str.length()/n;
        }else {
            numlength = my_str.length()/n + 1;
        }
        
        String[] answer = new String[numlength];
        
        for(int i=0; i<numlength; i++){
            if(my_str.length() >= n){
                answer[i] = my_str.substring(0, n);
                my_str = my_str.substring(n, my_str.length());
            }else {
                answer[i] = my_str.substring(0, my_str.length());
            }
        }
        
        
        return answer;
    }
}

<작성한 코드>

배열의 길이를 지정해 주기 위해 먼저 if문으로 설정해 줬다. 만약 my_str을 n으로 나눴을 때 딱 떨어지면 그 몫을 배열의 길이로 사용하면 되고, 나눠 떨어지지 않는다면 나눈 몫에 +1을 해줘서 크기를 지정해 줬다. 그 뒤 for문으로 길이만큼 반복시켜 주고 조건을 걸었다. 만약 my_str의 길이가 n보다 크거나 같으면 answer배열의 i번째에 my_str를 0부터 n번까지 잘라서 집어넣어 줬다. 그 뒤 my_str에는 자른 나머지를 다시 대입해 줬다. 만약 my_str의 남은 배열의 길이가 n보다 작으면 my_str에 남은 모든 수를 넣어준 뒤 반환했다.

 

 

 

 

96. 문자열 밀기

문제

class Solution {
    public int solution(String A, String B) {
        int answer = -1;
        if(A.equals(B)) return 0;
        String push = A;
        
        for(int i=0; i<A.length(); i++){
            String a = push.substring(push.length() - 1);
            push = a + push.substring(0, push.length() - 1);
            
            if(push.equals(B)){
            answer = i + 1;
            break;
            }
        }
        
        return answer;
    }
}

<작성한 코드>

answer를 -1로 초기화하고 시작했다. 그 후 A와 B가 같으면 0을 리턴하도록 하였다. push에 A값을 집어넣고 for문에서 a에는 push의 마지막값을 저장. push에는 마지막값 + 나머지값을 넣어줘서 한 칸씩 이동시켰다. 그 뒤 push와 B가 같으면 answer에 i+1을 넣어주고 for문을 종료했다. 

 

 

 

 

97. 종이 자르기

문제

class Solution {
    public int solution(int M, int N) {
        int answer = 0;
        
        int m = M-1;
        int n = M * (N-1);
        
        answer = n+m;
        
        return answer;
    }
}

<작성한 코드>

M을 가로 N을 세로의 길이라고 생각하고 풀이를 하였다. M에서 -1을 해주면 세로로 잘라야하는 가위질의 횟수, n에서 -1을 해주면 가로로 잘라야 하는 횟수가 나온다. M을 곱해준 이유는 세로로 잘린 종이만큼 가로로 잘라줘야 하기 때문에 곱해줬다. 이 횟수를 더해서 반환했다. 머리 아플 뻔했던 문제였다.

 

 

 

98. 연속된 수의 합

문제

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        int startNum = total / num - (num / 2);
        
        if(num%2 == 0){
            startNum++;
        }
        
        for(int i=0; i<num; i++){
            answer[i] = startNum + i;
        }
        
        
        return answer;
    }
}

<작성한 코드>

answer은 num의 개수만큼 선언해줬다. 그 뒤 startNum을 지정하여 초기화해 줬다. 연결된 값의 평균을 구하기 위해 total / num을 해줬고 거기서 중간값을 빼줬다. 만약 num이 짝수이면 중간값이 없기 때문에 +1을 해줬다. 그 뒤 for문으로 answer [i]에 중간값부터 차례대로 넣어주고 반환하였다.

 

 

 

 

99. 다음에 올 숫자

문제

class Solution {
    public int solution(int[] common) {
        int answer = 0;
        
        if(common[1] - common[0] == common[2] - common[1]){
            answer = common[common.length-1] + (common[1] - common[0]);
        } else {
            answer = common[common.length-1] * (common[1] / common[0]);
        }
        
        return answer;
    }
}

<작성한 코드>

등차인지 등비인지는 각 값의 차가 일정한지 커지는지 체크하면 됐다. 그래서 첫 번째 if에서 원소들의 차가 같으면 등차수열이므로 answer에는 마지막 값 + 원소의 차이를 더해줬다. 만약 등비수열이라면 마지막 값 * (원소끼리의 배율)을 해줬다. 처음에는 마지막값 * (원소의 차이)로 했는데 실패했다. 1 2 4를 예로 들어봤더니 실패했다. 그래서 / 로 배율을 구해서 곱해줬다.

 

 

 

100. 옹알이(1)

문제

class Solution {
    public int solution(String[] babbling) {
        int answer = 0;
        
        for(int i=0; i<babbling.length; i++){
            String check = babbling[i];
            if(check.matches("^(aya|ye|woo|ma)+$")){
                answer ++;
            }
        }
        
        return answer;
    }
}

<작성한 코드>

어떻게 할까 고민을 했다. 해결에 도움이 될만한 함수를 찾아보다가 spring에서 사용했던 정규식이 있었다. 우선 for문으로 babbling의 길이만큼 반복시켜 줬다. 그 뒤 check에 문자열을 하나씩 넣어주고, matches()을 사용해서 정규식과 한번 이상 일치하는지 확인했다. 이 문제는 얼떨결에 해결됐다. 체크해 두고 다시 한번 풀어봐야 될 문제 같다. 의문이다.

반응형
프로필사진

남건욱's 공부기록