문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12913
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 땅따먹기

땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟

programmers.co.kr

이 문제의 유형은 다이나믹 프로그래밍이다.

지나온 길의 점수를 합산하여 가장 큰 점수를 구하는 문제이다.

 

처음에는 첫 행부터 차례대로 큰 값을 찾고 지난 위치를 기억하여 지난 위치를 제외해 큰 값을 찾는 방식으로 구현하였으나 실패하였다.

 

다이나믹하지 못해 다른 사람의 풀이를 찾아 보았다.

첫 행에서 무조건 큰 값으로 시작하는것이 아닌 두번째 행부터 모든 열을 거쳤을때를 가정하여 가장 큰 값을 구하는 방식으로 구현하였다.

 

아래와 같이 풀이를 공유합니다.

class Solution {
    int solution(int[][] land) {
        int answer = Integer.MIN_VALUE;
        
        for(int i = 1; i < land.length; i++) {
            for(int j = 0; j < land[0].length; j++) {
                int max = Integer.MIN_VALUE;
                for(int k = 0; k < land[0].length; k++) {
                    if(j == k) continue;
                    max = Math.max(max, land[i][j] + land[i-1][k]);
                }
                land[i][j] = max;
                answer = Math.max(answer, max);
            }
        }

        return answer;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12924
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 숫자의 표현

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

programmers.co.kr

이 문제는 연속된 수로 입력된 값과 같은 값을 구하는 경우의 수를 구하는 문제이다.

1부터 n까지 첫 번째 배열을 돌려 같은 값을 구할 때까지 두 번째 배열을 돌리면 된다.

값을 구하는것이 아니어서 두 번째 배열에서 입력된 값과 같은 값을 구했다면 카운트를 하면 된다.

 

아래와 같이 풀이를 공유합니다.

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(n < sum) break;
                if(n == sum) {
                    answer++;
                    break;
                }
            }
        }
        
        return answer;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12939
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 최댓값과 최솟값

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

programmers.co.kr

이 문제는 문자열에서 최댓값과 최솟값을 구하는 문제이다.

String 배열을 만들어서 하나씩 int로 변환하여 최댓값과 최솟값을 구하면 된다.

 

아래와 같이 풀이를 공유합니다.

class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] str = s.split(" ");
        
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        
        for(int i = 0; i < str.length; i++) {
            int num = Integer.parseInt(str[i]);
            if(num > max) max = num;
            if(num < min) min = num;
        }
        
        answer += String.valueOf(min) + " " + String.valueOf(max);
        return answer;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12909
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 올바른 괄호

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

programmers.co.kr

이 문제는 스택을 활용한 문제로 유명하다.

스택에 첫 번째 문자를 넣고 두 번째 문자부터 배열을 돌려 스택에 있는 문자와 배열의 문자가 괄호를 이루는지 확인하는 문제이다.

스택을 활용하지 않고 int로 괄호가 열렸을 때 증가, 괄호가 닫혔을 때 감소를 하여 최종적으로 int 값이 0을 넘어서는지 확인하면 된다.

아래의 풀이를 보면 쉽게 이해할 수 있을 것이다.

 

아래와 같이 두 가지 풀이를 공유합니다.

 

Stack을 이용한 풀이 1

import java.util.Stack;

class Solution {
    boolean solution(String s) {
        
        char firstChar = s.charAt(0);
        char lastChar = s.charAt(s.length()-1);
        
        if(firstChar == ')' || lastChar == '(') return false;
        
        Stack<Character> stc = new Stack<>();
        
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == '(') {
                stc.push(c);
            }else {
                if(stc.isEmpty()) return false;
                
                stc.pop();
            }
        }

        return (!stc.isEmpty()) ? false : true;
    }
}

 

기본형을 이용한 풀이 2

class Solution {
    boolean solution(String s) {
        
        if(s.charAt(0) == ')') return false;
        
        int basketCount = 0;
        
        for(int i = 0; i < s.length(); i++) {
            char b = s.charAt(i);
            
            if(b == '(') {
                basketCount++;
            }else {
                if(basketCount <= 0) return false;
                basketCount--;
            }
        }

        return (basketCount > 0) ? false : true;
    }
}

+ Recent posts