문제 링크 : 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;
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12899
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

이 문제는 3진법을 변형한 문제이다.

1, 2, 4가 들어 있는 배열을 만들어 n의 나머지를 인덱스로 활용해 값을 만드려고 했다.

하지만 그 방법으로는 n을 배열의 길이로 나누어 나머지를 구했을 때 0이 아닌 4가 나와야 돼서 배열의 순서를 4, 1, 2로 변경하였다.

일의 자리는 n을 배열의 길이로 나누어 나머지를 구하면 쉽게 구할 수 있었으나 십의 자리 이상부터는 구현하지 못해 다른 사람의 풀이를 보았다.

풀이의 핵심은 n = (n - 1) / 3이였다.

3으로 나눌 때 한 칸씩 당겨져서 다음 자리의 수를 구할 수 있다.

 

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

class Solution {
    public String solution(int n) {
        StringBuilder sb = new StringBuilder();
        int[] notation = {4, 1, 2};
        
        while(n > 0) {
            sb.append(notation[n % 3]);
            n = (n - 1) / 3;
        }
        
        return sb.reverse().toString();
    }
}
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12941
레벨 : Level 2
분류 : 연습문제
 

코딩테스트 연습 - 최솟값 만들기

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다. 배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱

programmers.co.kr

 

이 문제는 두 배열의 값을 곱셈하여 최소 값을 구하는 문제이다.

최솟값을 구하기 위한 핵심은 한 개의 배열은 오름차순 정렬, 나머지 한 개의 배열은 내림차순 정렬을 해서 차례대로 곱해 나가면 된다.

하지만 내림차순 정렬 시 for문을 사용하지 않고 int[]를 정렬하려다 보니 쉽지 않았다.

stream도 사용해봤지만 해답을 찾지 못해 너무 꼬아서 생각하는 게 아닌가 싶어 일반적인 for문을 이용하여 새로운 Integer형 배열을 만들고 Arrays.sort(sortB, Collections.reverseOrder());를 통해 내림차순으로 정렬하여 로직을 구현하였다.

 

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

import java.util.Arrays;
import java.util.Collections;
class Solution
{
    public int solution(int []A, int []B)
    {
        int answer = 0;
        
        Integer[] sortB = new Integer[B.length];
        
        for(int i = 0; i < B.length; i++) sortB[i] = B[i];
        
        Arrays.sort(A);
        Arrays.sort(sortB, Collections.reverseOrder());
        
        for(int i = 0; i < A.length; i++) {
            answer += A[i] * sortB[i];
        }

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

코딩테스트 연습 - 피보나치 수

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다. 예를들어 F(2) = F(0) + F(1) = 0 + 1 = 1 F(3) = F(1) + F(2) = 1 + 1 = 2 F(4) = F(2) + F(3) = 1 + 2 = 3 F(5) = F(3) + F(4) =

programmers.co.kr

 

이 문제는 시간 초과가 발생할 수 있는 문제이다.

피보나치 수를 구하고나서 1234567의 나머지 값을 구한다면 시간 초과가 발생할 것이다.

또한 재귀함수로 피보나치 수를 구했을 때 배열보다 메모리를 많이 차지하여 시간 초과가 발생한다.

그래서 배열로 피보나치의 수식을 적용하고 각각의 값마다 1234567로 나머지를 구해서 로직을 구현하였다.

 

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

class Solution {
    public int solution(int n) {        
        
        int a = 0;
        int b = 1;
        
        for(int i = 0; i < n; i++) {
            int c = (a+b) % 1234567;
            a = b % 1234567;
            b = c % 1234567;
        }
        
        return a;
    }
}

+ Recent posts