0부터 9까지로 이루어진 배열이 연속적으로 나타나는 숫자는 하나만 남기로 전부 제거하는 문제이다.
ex ) [1, 1, 3, 3, 0, 1, 4, 4, 5] ➡️ [1, 3, 0, 1, 4, 4, 5]
ex ) [2, 2, 2, 5, 5] ➡️ [2, 5]
처음에 문제를 잘못 이해해서 중복된 수가 없는 배열을 만드는 것으로 착각했다.
하지만 연속으로 나오는 수가 없는 배열을 만드는 것이었다.
Stack
/ Queue
문제였고, Stack
으로 풀어보았다.
전에 들어간 수와 비교를 해서 전에 들어간 수와 같으면 들어가지 않도록 하였다.
어떻게 하지 고민을 하다 같이 푸는 팀원이 아이디어를 냈다.
int previousNumber = 0;
for (int i : arr) {
if (i != previousNumber) integerStack.push(i);
previousNumber = i;
}
직전에 들어간 수를 넣는 변수를 선언했고, 그 변수 (previousNumber
) 에 이전값을 넣어서 같지 않으면 Stack
에 push()
를 하도록 하였다.
반복문을 거꾸로 돌려 Stack
을 pop()
해서 answer
에 넣어서 만들었다.
잘 푼 것 같았는데 역시 채점을 한 결과 많이 틀렸다.
반례를 찾기 위해 arr
배열을 막 집어 넣어보았다.
문제를 풀면서 항상 반례는 중간에서 일어나지 않고 양 끝 값의 문제였다.
배열의 맨 앞에 값이 제대로 처리가 되지 않거나 맨 뒤에 값이 제대로 처리되지 않았다.
그래서 배열의 맨 앞과 맨 뒤에 여러 숫자를 넣어보았고,
반례를 찾았다.
역시 맨 앞에서 값이 제대로 처리되지 않았던 것이다.
만약 배열의 맨 앞 element
가 0
일 경우 0
을 담지 않았다.
코드를 다시 보니 previousNumber
가 0
으로 초기화가 되고 있어서 문제가 발생했던 것이었다.
이 배열의 element
들은 0 ~ 9
의 정수였기 때문에
previousNumber
를 10
으로 초기화를 해주었다.
int previousNumber = 10;
이렇게 10
으로 초기화를 해준 결과,
문제를 해결할 수 있었다.
정수 배열에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담는 문제이다.
( * 중복된 수가 당연히 없어야한다. )
중복된 수가 없어야 한다는 것을 알고 Set
을 생각했다.
생각한대로 코드를 작성해보았다.
Set<Integer> integerSet = new HashSet<>();
for (int i = 0; i < numbers.length - 1; i++) {
for (int j = i + 1; j < numbers.length; j++) {
integerSet.add(numbers[i] + numbers[j]);
}
}
이중반복문으로 각각 인덱스에 접근하여 더해질 수 있도록 하였다.
Set
을 다시 int
배열 answer
에 넣어서 완성했다.
틀렸다.
아차차 오름차순인걸 깜빡했다.
Arrays.sort()
를 이용했다.
문제를 해결할 수 있었다.
팀원분이 sort()
대신 TreeSet
을 사용하게 되면 자동으로 오름차순으로 나온다고했다.
그래서 당장 sort()
를 빼고 TreeSet
을 사용하였다.
두 가지를 채점해 본 결과..
HashSet
을 사용하고 나중에 Arrays.sort()
하는 것이... 더 시간이 빨랐다............
그래서 다시 HashSet
으로 했다.
조건문의 조건을 어떻게 해야할지 고민을 많이 했던 것 같다.
일단 이 문제는 동생이 낙서해서 알 수 없는 로또 번호와 보이는 로또 번호로 최고 순위와 최저 순위를 찾는 것이다.
(0
: 동생이 낙서해서 알 수 없는 로또 번호..)
ex ) [내가 가지고 있는 로또 번호], [로또 당첨 번호] ➡️ [최고 순위, 최저 순위]
[44, 1, 0, 0, 31, 25], [31, 10, 45, 1, 6, 19] ➡️ [3, 5]
[0, 0, 0, 0, 0, 0], [38, 19, 20, 40, 15, 25] ➡️ [1, 6]
[45, 4, 35, 20, 3, 9], [20, 9, 3, 45, 4, 35] ➡️ [1, 1]
먼저 각각 정렬을 하고 나의 로또 번호에서 0의 개수와 당첨된 번호의 개수를 찾아주었고,
일반적으로
최고 순위: 7 - 맞은 개수 - 0의 개수
최저 순위: 7 - 맞은 개수
이렇게 된다는 것을 알게 됐다.
이제 0의 개수에 따라 조건문을 만들어 주었고,
조건문을 생각하는게... 조금 어려웠다.
이렇게 해주었다.
if (zeroCount == 6) {
answer[0] = 7 - zeroCount;
answer[1] = 6;
} else if (guessNumberCount == 0 && zeroCount == 0) {
answer[0] = 6;
answer[1] = 6;
} else {
answer[0] = 7 - guessNumberCount - zeroCount;
answer[1] = 7 - guessNumberCount;
}
TreeSet
의 경우 자동으로 오름차순 정렬을 한다.HashSet
과 Sort
를 사용한 것이 더 빨랐다.꾸준히 하고 있는 나.
정말 멋져.