스택을 사용하여 문제를 풀었습니다. '(' 는 추가시키고 ')' 는 제거하였습니다. 최종적으로 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 문제로 분류되어 있어서 해당 자료구조를 사용했습니다.
같은 숫자가 연속해서 나타나면 한 번만 저장합니다. 같은 숫자 체크는 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를 사용하여 풀었습니다.
모든 수의 조합을 만들고 그 중에서 소수 갯수를 반환합니다. 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 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.
프로그래머스의 소수 찾기 문제는 완전탐색에 대해 공부가 필요한 문제입니다. 완전탐색을 공부하여 모든 수의 조합을 생성하고 소수를 판별하여 갯수만 반환해주면 됩니다. 완전탐색 + 소수판별.
모든 명함을 수납할 수 있는 가장 작은 지갑을 만들어야 합니다. 매개변수로 주어진 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 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.
프로그래머스의 최소직사각형 문제는 알고리즘 공부를 하지 않았더라도 어렵지 않습니다. 문제를 이해하고 푼다면 누구나 풀 수 있는 문제라고 생각합니다.
문제를 이해하는 것이 중요합니다. 입력 받은 폰켓몬 절반 기준으로 중복 없이 고를 수 있는 수를 반환하면 됩니다.
답은 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)
);
}