#유형 : 구현, 문자열

#난이도 : LV2

# Integer.toString 메소드를 쓰면 쉽게 N진수 변환을 할 수 있다. 해당 메소드는 lowerCase를 리턴하기 때문에 아래 문제에 맞게 upperCase로 변환하고 순서에 맞는 숫자를 골라 출력하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.*;
 
class Solution {
    public String solution(int n, int t, int m, int p) {
        String answer = "";
        int len = m*(t-1)+p;
        int idx = 0;
        
        StringBuffer sb = new StringBuffer();
        
        while(sb.length() < len){
            sb.append(Integer.toString(idx, n).toUpperCase());
            idx++;
        }
        
        StringBuffer tmp = new StringBuffer();
        for(int i=0; i<t; i++){
            tmp.append(sb.toString().charAt(i*m+p-1));
        }
        
        answer = tmp.toString();
        
        return answer;
    }
}
cs

#유형 : 스택

#난이도 : LV2

# '(' 이면 push , ')'면 pop을 하여 처리하는 기본적인 스택문제로,

1) isEmpty

2) 반복문 종료 후, 스택의 크기가 1이상인 경우

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;
 
class Solution {
    boolean solution(String s) {
        boolean answer = true;
        Stack<Character> st = new Stack<>();
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) == '('){
                st.push('(');
            }else{
                if(st.isEmpty()){
                    answer = false;
                    break;
                }else{
                    st.pop();
                }
            }
        }
        if(st.size() > 0)
            return false;
 
        return answer;
    }
}
cs

#유형 : 문자열

#난이도 : LV2

# 주어진 숫자보다 크면서 이진수 변환시 1의 개수가 같은 최소의 수를 찾는 문제로, 입력받는 숫자 n을 2진수 변환 후 반복문을 통해 숫자를 찾으면 된다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.*;
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        String st = Integer.toBinaryString(n);
        int cnt = 0;
        for(int i=0; i<st.length(); i++){
            if(st.charAt(i) == '1')
                cnt++;
        }
        
        for(int i=n+1; i<=10000000; i++)
        {
            String str = Integer.toBinaryString(i);
            int count = 0;
            for(int j=0; j<str.length(); j++){
                if(str.charAt(j) == '1')
                    count++;
            }
            if(count == cnt){
                answer = i;
                break;
            }
                
        }
        
        return answer;
    }
}
cs

#유형 : 시뮬레이션, 탐색

#난이도 : LV2

# 맨 처음에는 문제를 제대로 읽지않고 접근하여 인접한 행으로만 이동 가능한 줄 알았다...

dfs 같은 탐색으로 접근하려다가 시간복잡도가 너무 안좋아서 한 행마다 Math.max로 접근하여 해결하였다.

land[i][1]은 land[i-1][0], land[i-1][2], land[i-1][3]중 가장 큰값과 더하면 된다.

이것을 N의 배열길이 - 1 만큼 반복해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
    int solution(int[][] land) {
        int answer = 0;
 
        for(int i=0; i<land.length-1; i++){
            land[i+1][0+= Math.max(Math.max(land[i][1], land[i][2]), land[i][3]);
            land[i+1][1+= Math.max(Math.max(land[i][0], land[i][2]), land[i][3]);
            land[i+1][2+= Math.max(Math.max(land[i][0], land[i][1]), land[i][3]);
            land[i+1][3+= Math.max(Math.max(land[i][0], land[i][1]), land[i][2]);
        }
        
        for(int i=0; i<4; i++){
            answer = Math.max(answer, land[land.length-1][i]);
        }
 
        return answer;
    }
}
cs

#유형 : 수학

#난이도 : LV2

# 수학적으로 접근하여 풀 수 있을거같으나.. 짱구를 굴려봐도 떠오르지 않아 반복문으로 처리하였다.

굳이 더 효율적인 조건을 두려면 answer = 1로 시작하고,  i<=N 이 아닌 Math.sqrt등으로 사용하여 반복문을 줄일 수 있을것 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=1; i<=n; i++){
            int sum = 0;
            for(int j=i; j<=n; j++){
                sum += j;
                if(sum == n){
                    answer++;
                    break;
                }else if(sum > n){
                    break;
                }
            }
        }
        return answer;
    }
}
cs

#유형 : 수학

#난이도 : LV2

# 각각의 배열에서 가장 큰값 * 가장 작은값들의 곱으로 이루어지면 된다고 생각하여, 배열 정렬 후 가장 짧은 배열의 길이 기준으로 값을 구해주었음. 다른 방법이 있을 듯 하나, 다 비슷하게 푼 것 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.*;
class Solution
{
    public int solution(int []A, int []B)
    {
        int answer = 0;
        Arrays.sort(A);
        Arrays.sort(B);
        
        int min = Math.min(A.length, B.length);
        for(int i=0; i<min; i++){
            answer += A[i] * B[B.length-i-1];
        }
        return answer;
    }
}
cs

#유형 : 수학

#난이도 : LV2

# 행렬의 곱셈 특징을 이용하여 접근하면 된다. (A*B) * (B*C) = (A*C) 행렬의 특징을 이용하여 반복문으로 풀어내면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer;
        // 3x2 2x2 = 3x2
        
        int row = arr1.length;
        int col = arr2[0].length;
        
        answer = new int[row][col];
        
        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
                
                int rs = 0;
                for(int k=0; k<arr1[i].length; k++){
                    rs += arr1[i][k] * arr2[k][j];
                }
                answer[i][j] = rs;
            }
        }
       
        return answer;
    }
}
cs

#유형 : 수학

#난이도 : LV2

# 피보나치 수열 개념을 이용하면 쉽게 풀 수 있다. 맨 처음 재귀를 이용한 탑다운으로 문제를 접근했으나, 시간 초과가 발생하여 배열을 사용하여 바텀업으로 접근하여 해결하였다. 코드는 탑다운, 바텀업 둘다 첨부하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
    static int arr[];
    public int solution(int n) {
        arr = new int[n+1];
        int answer = fibo_arr(n);
        
        return answer;
    }
    
    public static int fibo(int n){
        if(n == 1)
            return 1;
        else if(n == 2)
            return 1;
        else 
            return fibo(n-1+ fibo(n-2);
    }
    
    public static int fibo_arr(int n){
        for(int i=0; i<=n; i++){
            if(i == 0)
                arr[i] = 0;
            else if(i == 1)
                arr[i] = 1;
            else if(i == 2)
                arr[i] = 1;
            else{
                arr[i] = (arr[i-1+ arr[i-2]) % 1234567;
            }
        }
        return arr[n];   
    }
}
cs

+ Recent posts