프로그래머스의 올바른 괄호 문제를 풀어봤습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

괄호가 올바르게 만들어지면 true
괄호가 올바르게 만들어지지 않으면 false

올바른 경우
'()'  true

올바르지 않은 경우
')('  false
')'  false
'('  false


스택을 사용하여 문제를 풀었습니다.
'(' 는 추가시키고 ')' 는 제거하였습니다.
최종적으로 Stack에 아무것도 남아있지 않아야 올바른 괄호라고 판단했습니다.
최초에 ')' 가 먼저 들어오면 올바른 괄호가 아닙니다.

boolean solution(String s) {
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if ('(' == c) {
            stack.add(c);
            continue;
        }
        if (')' == c) {
            if (stack.empty()) return false;
            stack.pop();
            continue;
        }
    }
    return stack.empty();
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

프로그래머스 올바른 괄호 문제는 stack, queue 문제로 분류되어 있어서 해당 자료구조를 사용했습니다.

프로그래머스의 같은 숫자는 싫어 라는 문제를 풀어봤습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

 

같은 숫자가 연속해서 나타나면 한 번만 저장합니다.
같은 숫자 체크는 Stack을 사용하였고
숫자 저장은 Queue를 사용했습니다.

Stack에 숫자를 저장하고 pop(담긴 숫자 반환)으로 같은 숫자인지 확인합니다.
이 때 Stack에 아무것도 담겨있지 않은 상태에서 pop을 사용할 수 없으니 Stack에 값이 없는 경우는 별도로 처리하였습니다.
Stack에 담겨있지 않은 숫자만 Queue에 저장하여 반환하였습니다.

public int[] solution(int []arr) {
    Stack<Integer> stack = new Stack<>();
    Queue<Integer> queue = new LinkedList<>();

    for (int a : arr) {
        if (stack.empty()) {
            stack.add(a);
            queue.add(a);
            continue;
        }
        if (stack.pop() == a) {
            stack.add(a);
            continue;
        }
        stack.add(a);
        queue.add(a);
    }
    return queue.stream().mapToInt(m -> m).toArray();
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

프로그래머스의 "같은 숫자는 싫어"는 stack, queue 유형의 문제로 분류되어 있어서 stack과 queue를 사용하여 풀었습니다.

프로그래머스 소수 찾기를 풀어보았습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/42839

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이


모든 수의 조합을 만들고 그 중에서 소수 갯수를 반환합니다.
1. 모든 수의 조합 생성
2. 소수 갯수 반환

 


 

1. 모든 수의 조합 생성
createdNumber 함수에 모든 수의 조합을 생성하는 로직을 만들었습니다.
재귀함수를 이용하여 모든 수의 조합을 만들었습니다.

HashSet<Integer> set = new HashSet<>();

public void createdNumber(String com, String numbers) {
    if (!"".equals(com)) set.add(Integer.parseInt(com));
    for (int i = 0; i < numbers.length(); i++) {
        if (!"".equals(com)) set.add(Integer.parseInt(com));
        createdNumber(com + numbers.charAt(i), numbers.substring(0, i) + numbers.substring(i+1));
    }
}

....
....

반복문을 사용하여 모든 경우의 수를 생성합니다.
이 때 중복되는 수가 있으니 set을 이용하여 중복은 제거합니다.

con 값이 공백이 아닐경우 set에 담아줍니다.

if (!"".equals(com)) set.add(Integer.parseInt(com));

이 if문이 두 번 똑같이 나와서 setCom 함수로 따로 만들었습니다.

public void setCom(String com) {
    if (!"".equals(com)) set.add(Integer.parseInt(com));
}
public void createdNumber(String com, String numbers) {
    setCom(com);
    for (int i = 0; i < numbers.length(); i++) {
        setCom(com);
        createdNumber(com + numbers.charAt(i), numbers.substring(0, i) + numbers.substring(i+1));
    }
}

 

 

2. 소수 갯수 반환
중복을 제거한 수의 조합 중에 소수인 수의 갯수를 반환합니다.
스트림의 filter를 이용하여 소수인 수만 count 하였습니다.


// 2. 소수 갯수 반환
return (int) set.stream().filter(n -> isPrime(n)).count();

 

isPrime 함수는 소수인지 판별해주는 함수입니다.

public boolean isPrime(int num) {
    if (num < 2) return false;

    int limit = (int) Math.sqrt(num);

    for (int i = 2; i <= limit; i++)
        if (num % i == 0)
            return false;

    return true;
}

 

전체코드

HashSet<Integer> set = new HashSet<>();

public boolean isPrime(int num) {
    if (num < 2) return false;

    int limit = (int) Math.sqrt(num);

    for (int i = 2; i <= limit; i++)
        if (num % i == 0)
            return false;

    return true;
}

public void setCom(String com) {
    if (!"".equals(com)) set.add(Integer.parseInt(com));
}

public void createdNumber(String com, String numbers) {
    setCom(com);
    for (int i = 0; i < numbers.length(); i++) {
        setCom(com);
        createdNumber(com + numbers.charAt(i), numbers.substring(0, i) + numbers.substring(i+1));
    }
}

public int solution(String numbers) {
    // 1. 모든 수의 조합 생성
    createdNumber("", numbers);

    // 2. 소수 갯수 반환
    return (int) set.stream().filter(n -> isPrime(n)).count();
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

프로그래머스의 소수 찾기 문제는 완전탐색에 대해 공부가 필요한 문제입니다.
완전탐색을 공부하여 모든 수의 조합을 생성하고 소수를 판별하여 갯수만 반환해주면 됩니다.
완전탐색 + 소수판별.

프로그래머스의 모의고사를 풀어보았습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

각 수포자의 답안지 작성 패턴에 따른 정답 수를 계산하고 최고 득점자를 반환합니다.
1. 답안지 작성 패턴
2. 각 수포자 정답 수 계산
3. 최고 득점자 출력

 


 

1. 답안지 작성 패턴
각 수포자의 답안지 작성 패턴을 변수로 선언했습니다.

public int[] solution(int[] answers) {

    // 1. 답안지 작성 패턴
    int[] person1 = {1, 2, 3, 4, 5};
    int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5};
    int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

}

 

2. 각 수포자 정답 수 계산
답안지와 일치하는 각 수포자들의 정답 수를 계산했습니다.

public int[] solution(int[] answers) {

    // 1. 답안지 작성 패턴
    int[] person1 = {1, 2, 3, 4, 5};
    int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5};
    int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    // 2. 각 수포자 정답 수 계산
    int[] cnt = new int[3];
    for(int i=0; i < answers.length; i++){
        if(answers[i] == person1[i%5]) cnt[0]++;
        if(answers[i] == person2[i%8]) cnt[1]++;
        if(answers[i] == person3[i%10]) cnt[2]++;
    }

}

 

3. 최고 득점자 출력
최고 점수와 동일한 수포자를 구했습니다.
먼저 각 수포자 중 최고 점수를구합니다.

public int maxScore(int[] cnt) {
    return Math.max(cnt[0], Math.max(cnt[1], cnt[2]));
}

최고 점수와 일치하는 수포자를 모두 찾습니다.

public List<Integer> maxIntegers (int max, int[] cnt) {
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < cnt.length; i++) {
        if(max == cnt[i]) list.add(i+1);
    }
    return list;
}

결과를 반환합니다.

public int[] solution(int[] answers) {

    // 1. 답안지 작성 패턴
    int[] person1 = {1, 2, 3, 4, 5};
    int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5};
    int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    // 2. 각 수포자 정답 수 계산
    int[] cnt = new int[3];
    for(int i=0; i < answers.length; i++){
        if(answers[i] == person1[i%5]) cnt[0]++;
        if(answers[i] == person2[i%8]) cnt[1]++;
        if(answers[i] == person3[i%10]) cnt[2]++;
    }

    // 3. 최고 득점자 출력
    return maxIntegers(maxScore(cnt), cnt)
            .stream()
            .mapToInt(Integer::intValue)
            .toArray();
}

 

전체코드

public List<Integer> maxIntegers (int max, int[] cnt) {
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < cnt.length; i++) {
        if(max == cnt[i]) list.add(i+1);
    }
    return list;
}

public int maxScore(int[] cnt) {
    return Math.max(cnt[0], Math.max(cnt[1], cnt[2]));
}

public int[] solution(int[] answers) {

    // 1. 답안지 작성 패턴
    int[] person1 = {1, 2, 3, 4, 5};
    int[] person2 = {2, 1, 2, 3, 2, 4, 2, 5};
    int[] person3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    // 2. 각 수포자 정답 수 계산
    int[] cnt = new int[3];
    for(int i=0; i < answers.length; i++){
        if(answers[i] == person1[i%5]) cnt[0]++;
        if(answers[i] == person2[i%8]) cnt[1]++;
        if(answers[i] == person3[i%10]) cnt[2]++;
    }

    // 3. 최고 득점자 출력
    return maxIntegers(maxScore(cnt), cnt)
            .stream()
            .mapToInt(Integer::intValue)
            .toArray();
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

문제를 이해하고 풀면 누구나 풀 수 있는 문제입니다.

프로그래머스의 문자열을 정수로 바꾸기 문제를 풀어보았습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/12925

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

Integer.parseInt 함수를 사용하여 풀었습니다.
해당 함수에는 첫 번째 문자가 마이너스(-) 기호라면 마이너스 값으로 반환해주고 있습니다.
그렇기 때문에 해당 함수를 사용한다면 맨 앞에 마이너스(-) 기호 걱정없이 정수로 바꿀 수 있습니다.

public int solution(String s) {
    return Integer.parseInt(s);
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

[프로그래머스] 문자열을 정수로 바꾸기 문제는 어렵지 않습니다.
문제를 푼 사람들 중에서는 Integer.parseInt 함수를 사용하지 않고 푸는 분들도 있습니다.
Integer.parseInt 함수 내부를 확인하시면 참고가 됩니다.

프로그래머스의 최소직사각형을 풀어보았습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/86491

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

모든 명함을 수납할 수 있는 가장 작은 지갑을 만들어야 합니다.
매개변수로 주어진 sizes에서 가로, 세로 각각 최대 값으로 지갑을 만들어야 합니다.
하지만 가로, 세로 값은 변경될 수 있다는 점을 고려해서 만들어야 합니다.
ex. 
A명함: 가로(60), 세로(50)
B명함: 가로(40), 세로(80)

A명함과 B명함의 가로 최대 값(60), 세로 최대 값(80)으로 만들면 
60*80 = 4800
4800이라는 결과 값이 나옵니다.
하지만 B명함의 방향을 눕혀서 가로와 세로 길이를 바꾼다면 달라집니다.
ex. 
A명함: 가로(60), 세로(50)
B명함: 세로(80), 가로(40)

위의 상황이라면 가로 최대 값(80), 세로 최대 값(50)으로
80*50 = 4000
4000이라는 결과 값이 나옵니다.

모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 가장 작게 만들 수 있는 지갑의 크기를 구하면 됩니다.
1. 각 명함의 가로, 세로 길이를 큰 값과 작은 값으로 구분합니다.
2. 저장되어 있는 큰 길이와 현재 명함의 큰 길이 값을 비교하여 현재 명함 길이가 더 크다면 현재 명함의 큰 값으로 바꿔줍니다.
3. 저장되어 있는 작은 길이와 현재 명함의 작은 길이 값을 비교하여 현재 명함 길이가 더 크다면 현재 명함의 작은 값으로 바꿔줍니다.
4. 모든 명함 값을 체크한 후 저장되어 있는 큰 길이와 작은 길이를 곱해서 결과를 반환합니다.

public int solution(int[][] sizes) {
    int max = 0;
    int min = 0;
    for (int[] size : sizes) {
        max = Integer.max(Integer.max(size[0], size[1]), max);
        min = Integer.max(Integer.min(size[0], size[1]), min);
    }
    return max * min;
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

프로그래머스의 최소직사각형 문제는 알고리즘 공부를 하지 않았더라도 어렵지 않습니다.
문제를 이해하고 푼다면 누구나 풀 수 있는 문제라고 생각합니다.

프로그래머스의 완주하지 못한 선수를 풀어보았다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이


참여자 명단과 완주자 명단을 비교하여 완주하지 못한 선수를 찾으면 됩니다.
변수에 참여자를 저장하고 완주는 제거해주면 마지막에 남아있는 선수가 완주하지 못한 선수입니다.

playerCheck 함수에 기능을 구현했습니다.

public void playerCheck(HashSet<String> set, String[] players) {
    for (String p : players) {
        if (set.contains(p)) {
            set.remove(p);
            continue;
        }
        set.add(p);
    }
}

 

매개변수를 받으면 playerCheck 함수를 사용하여 완주하지 못한 선수를 선별합니다.

public String solution(String[] participant, String[] completion) {
    String answer = "";
    HashSet<String> set = new HashSet<>();
    playerCheck(set, participant);
    playerCheck(set, completion);
    answer = set.toString();
    return answer.substring(1, answer.length()-1);
}

 

 

전체코드

public void playerCheck(HashSet<String> set, String[] players) {
    for (String p : players) {
        if (set.contains(p)) {
            set.remove(p);
            continue;
        }
        set.add(p);
    }
}

public String solution(String[] participant, String[] completion) {
    String answer = "";
    HashSet<String> set = new HashSet<>();
    playerCheck(set, participant);
    playerCheck(set, completion);
    answer = set.toString();
    return answer.substring(1, answer.length()-1);
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

[프로그래머스] 완주하지 못한 선수를 Arrays.sort 함수를 이용하여 반복문을 돌리면 쉽게 풀었지만
해쉬 문제였기 때문에 해쉬로 다시 풀었다.
둘 다 해보는 것 추천

프로그래머스의 폰켓몬 문제가 추가돼서 풀어보았다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/1845

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

문제를 이해하는 것이 중요합니다.
입력 받은 폰켓몬 절반 기준으로 중복 없이 고를 수 있는 수를 반환하면 됩니다.

답은 2가지 중 하나입니다.
1. 중복 없이 고를 경우: 입력 받은 폰켓몬 수 / 2
2. 중복이 있을 경우: 중복 제거한 입력 받은 폰켓몬 수

ex1. 
{1, 2, 3, 4, 5, 6}
위의 경우 입력 받은 폰켓몬의 수는 6개, 절반은 3개입니다.
절반(3개)만큼 고를 때 중복 없이 고를 수 있으므로 정답은 3입니다.

ex2.
{1, 1, 1, 2, 2, 2}
위의 경우 입력 받은 폰켓몬의 수는 6개, 절반은 3개입니다.
절반(3개)만큼 고를 때 중복 없이 고를 경우 최대 2개 입니다.
정답은 2입니다.

// 스트림을 사용.
// boxed(): int -> Integer, double -> Double
// collect: 데이터 타입 지정.
// Collectors.toSet().size(): set으로 중복 제거 후 Count
// (nums.length / 2): 입력 받은 폰켓몬 수 절반
public int solution(int[] nums) {
    return Integer.min(
            Arrays.stream(nums)
                    .boxed()
                    .collect(Collectors.toSet()).size(), (nums.length / 2)
    );
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

[프로그래머스] 폰켓몬은 자료구조를 공부한 후 접한다면 어렵지 않게 풀 수 있습니다.

+ Recent posts