2023.08.17 - 알고리즘

mjjin·2023년 8월 17일
0

알고리즘

문제 출처 : 프로그래머스

코드 처리하기

class Solution {
    public String solution(String code) {
        String answer = "";
        char mode = '0';
        for (int i = 0; i < code.length(); i++) {
            if(code.charAt(i) == '1') mode = mode == '0' ? '1' : '0';
            if (mode == '0') {
                if(code.charAt(i) != '1') { if(i % 2 == 0) answer += code.charAt(i); }
            } else {
                if(code.charAt(i) != '1') { if(i % 2 == 1) answer += code.charAt(i); }
            }
        }
        return answer != "" ? answer : "EMPTY";
    }
}

mode를 토글식으로 전환해서 조건에 맞는 식을 전개했다.
풀고 보니까 연산자들을 이용해서 식을 더 간소화 시킬 수도 있었을 것 같다.

등차수열의 특정한 항만 더하기

class Solution {
    public int solution(int a, int d, boolean[] included) {
        int answer = 0;
        for(int i = 0; i < included.length; i++) {
            if (included[i]) answer += a + (i * d);
                
        }
        return answer;
    }
}

등차수열은 첫항 + (n-1)공차로 구한다.
문제에서는 첫째항이 a, 공차가 d로 주어졌으므로
a + (n-1) d로 기본적인 식을 세우고,
included[i]가 i + 1항을 의미하므로
a + (i
d);를 answer에 더했다.

주사위 게임 2

class Solution {
    public int solution(int a, int b, int c) {
        int answer = 0;
        if (a != b && a != c && c != b) return a+b+c;
        if (a == b && a == c) { answer += (a+b+c) * ((a*a)+(b*b)+(c*c)) * ((a*a*a)+(b*b*b)+(c*c*c)); }
        else answer += (a+b+c) * ((a*a)+(b*b)+(c*c));
        return answer;
    }
}

Math.pow() 메서드가 거듭제곱을 구하는 메서드로 알고는 있지만,
제곱수가 크지 않아 그냥 열심히 곱해줬다..

원소들의 곱과 합

class Solution {
    public int solution(int[] num_list) {
        int sum = 1;
        int mul = 0;
        for (int i = 0; i < num_list.length; i++) {
            sum *= num_list[i];
            mul += num_list[i];
        }
        return sum < Math.pow(mul,2) ? 1 : 0; 
    }
}

이어 붙인 수

class Solution {
    public int solution(int[] num_list) {
        String odd = "";
        String even = "";
        for (int i = 0; i < num_list.length; i++) {
            if (num_list[i] % 2 == 0) odd += String.valueOf(num_list[i]);
            else even += String.valueOf(num_list[i]);
        }
        return Integer.valueOf(odd) + Integer.valueOf(even);
    }
}

마지막 두 원소

import java.util.*;
class Solution {
    public int[] solution(int[] num_list) {
        int[] answer = Arrays.copyOf(num_list, num_list.length+1);
        if(num_list[num_list.length-1] > num_list[num_list.length-2]) {
            answer[num_list.length] = num_list[num_list.length-1] - num_list[num_list.length-2];
        } else {
            answer[num_list.length] = num_list[num_list.length-1] * 2;
        }
        return answer;
    }
}

수 조작하기 1

class Solution {
    public int solution(int n, String control) {
        for(int i = 0; i < control.length(); i++) {
            switch (control.charAt(i)) {
                case 'w': n += 1;
                    break;
                case 's': n -= 1;
                    break;
                case 'd': n += 10;
                    break;
                case 'a': n -= 10;
                    break;
            }
        }
        return n;
    }
}

if로 쓰면 복잡해 보일 것 같아 switch문으로 풀었다.

수 조작하기 2

class Solution {
    public String solution(int[] numLog) {
        String answer = "";
        for(int i = 1; i < numLog.length; i++) {
            switch(numLog[i]-numLog[i-1]) {
                case 1: answer += "w";
                    break;
                case -1: answer += "s";
                    break;
                case 10: answer += "d";
                    break;
                case -10: answer += "a";
            }
        }
        return answer;
    }
}

수 조작하기 1이랑 크게 다르지 않아서 비슷한 방식으로 풀었다.

수열과 구간 쿼리 3

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int arrint = 0;
        for(int i = 0; i < queries.length; i ++) {
            arrint = arr[queries[i][0]];
            arr[queries[i][0]] = arr[queries[i][1]];
            arr[queries[i][1]] = arrint;
        }
        return arr;
    }
}

문제 이해를 못해서 한참을 헤맸다;

수열과 구간 쿼리 2

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        for (int i = 0; i < queries.length; i++) {
            int s = queries[i][0];
            int e = queries[i][1];
            int k = queries[i][2];
            int min = Integer.MAX_VALUE;
            for (int j = s; j <= e; j++) {
                if ((arr[j] < min) && (k < arr[j])) {
                    min = arr[j];
                }
            }
            if (min != Integer.MAX_VALUE) {
                answer[i] = min;
            } else {
                answer[i] = -1;
            }
        }
        return answer;
    }
}

Integer.MAX_VALUE은 정수의 최대값을 출력한다.
자매품으로 최소값을 출력하는 Integer.MIN_VALUE도 있다.

1개의 댓글

comment-user-thumbnail
2023년 8월 17일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기