[TIL] 230620 (코딩테스트: 같은 숫자는 싫어, 두 개 뽑아서 더하기, 로또의 최고 순위와 최저 순위)

CountryGirl·2023년 6월 20일
0

TIL

목록 보기
5/80

📌 같은 숫자는 싫어

문제점 & 시도 & 해결

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) 에 이전값을 넣어서 같지 않으면 Stackpush() 를 하도록 하였다.

반복문을 거꾸로 돌려 Stackpop() 해서 answer에 넣어서 만들었다.

잘 푼 것 같았는데 역시 채점을 한 결과 많이 틀렸다.

반례를 찾기 위해 arr 배열을 막 집어 넣어보았다.
문제를 풀면서 항상 반례는 중간에서 일어나지 않고 양 끝 값의 문제였다.

배열의 맨 앞에 값이 제대로 처리가 되지 않거나 맨 뒤에 값이 제대로 처리되지 않았다.

그래서 배열의 맨 앞과 맨 뒤에 여러 숫자를 넣어보았고,
반례를 찾았다.

역시 맨 앞에서 값이 제대로 처리되지 않았던 것이다.

만약 배열의 맨 앞 element0일 경우 0을 담지 않았다.

코드를 다시 보니 previousNumber0으로 초기화가 되고 있어서 문제가 발생했던 것이었다.
이 배열의 element 들은 0 ~ 9 의 정수였기 때문에
previousNumber10으로 초기화를 해주었다.

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의 개수에 따라 조건문을 만들어 주었고,
조건문을 생각하는게... 조금 어려웠다.

  • 0이 0개이고 맞은 개수가 0이면 무조건 6등 낙첨
  • 0이 6개이면 하나도 맞지 않아서 6등 낙첨이거나 모두 다 맞아서 1등이거나
    나머지는 최고 순위: (7 - 맞은 개수 - 0의 개수), 최저 순위: (7 - 맞은 개수)

이렇게 해주었다.

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 의 경우 자동으로 오름차순 정렬을 한다.
  • 배열의 길이마다 상이하겠지만 이번엔 HashSetSort를 사용한 것이 더 빨랐다.

회고

꾸준히 하고 있는 나.
정말 멋져.

profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글