[TIL] 230619 (코딩테스트: 정수 내림차순으로 배치하기, 정수 제곱근 판별, 제일 작은 수 제거하기)

CountryGirl·2023년 6월 19일
0

TIL

목록 보기
4/80

📌 정수 내림차순으로 배치하기

문제점 & 시도 & 해결

1 이상 8,000,000,000 이하인 자연수(정수)를 매개변수로 받고 내림차순으로 출력하는 문제이다.

ex ) 118372 ➡️ 873211
한 번에 정수로 받기 때문에 문자열 배열로 바꾸어 sort() 를 하였다.

String[] splitNum = (n + "").split("");
Arrays.sort(splitNum);

이렇게 할 경우 default 로 오름차순으로 정렬이된다.

하지만 내림차순을 해야한다.

내림차순을 하기 위해선

Arrays.sort(splitNum, Collections.reverseOrder());

Collections.reverseOrder()) 을 추가해주어야 했다.

별 거 아니지만 📌 제일 작은 수 제거하기 문제와 비교하기 위해 작성을 해보았다.


📌 정수 제곱근 판별

문제점 & 시도 & 해결

전에 비슷한 문제를 해결한 적이 있다.

내가 처음에 제곱수를 판별하기 위해서

if(n == Math.sqrt(n) * Math.sqrt(n)) ....

이렇게 작성을 하였다.
하지만 계속 오류가 났다.

잘 생각해보니 이렇게 할 경우 정수가 아닌 실수도 나올 수 있다는 것이다.
이 문제에선 양의 정수(자연수) 가 나와야 한다.

반대로

if(n % Math.sqrt(n) == 0) ....

이렇게 한다면 정수만 나올 것이라고 생각했다.

조건을 바꾸었지만 채점 시에 틀리는 테스트가 많아서 Math.sqrt()를 보니

하지만

Math.sqrt(n)

을 하게 될 경우 타입이 double 로 나오게 된다.

long 타입으로 나와야 하기 때문에 형변환을 시켜주었다.

answer = (long)((Math.sqrt(n) + 1) * (Math.sqrt(n) + 1));

📌 제일 작은 수 제거하기

문제점 & 시도 & 해결

정수 배열에서 가장 작은 수를 제거한 후 나머지 정수를 배열로 출력하는 것이다.
ex ) [3, 7, 2, 10, 18] ➡️ [3, 7, 10, 18]

정렬이 되어있지 않고 최소값만 제거한 후 입력 그대로 출력이 되어야한다.

ArrayList로 만들어 remove()를 사용하면 쉽게 풀 수 있는 문제이다.
하지만 ArrayList를 사용하지 않고 문제를 해결하고 싶었다.

1. 먼저 내림차순으로 정렬을 한다.
2. 정렬된 배열에서 맨 뒤 정수만 빼고 배열을 만든다.
3. 처음 입력값의 순서로 돌리기 위해 다시 섞어준다.

📌 정수 내림차순으로 배치하기에서 사용했던 Collections.reverseOrder() 를 사용했다.

int[] answer = new int[arr.length - 1];
Arrays.sort(answer, Collections.reverseOrder());

이렇게 쓴 결과 계속 빨간줄이 그어졌다.
지금 내림차순으로 정렬을 하는 배열은 int 타입의 배열이다.

Collections.reverseOrder()를 사용하기 위해선 참조형 변수 (String, Wrapper Class...) 여야했다.
그것을 모르고 그냥 int[] 을 정렬하려하니 계속 오류가 났던 것이다.

int[]Integer[] 로 변환해주었다.

Integer[] integerArray = Arrays.stream(arr).boxed().toArray(Integer[]::new);

Arrays.stream 을 사용하여야했다.

stream 을 잘 모르지만
보이는 코드만 해석하기 위해 조금 알아보았다.

Integer[] integerArray = Arrays.stream(arr) 		// arr 을 stream 으로 원소 하나하나 돌기
						.boxed()					// 원시타입을 감싸 래퍼클래스로 구성된 stream 으로 만들기
                        .toArray(Integer[]::new);	// Integer Array 로 만들기

Wrapper Class (Integer) 로 만들어준 뒤, Collections.reverseOrder() 를 사용할 수 있었다.

맨 뒤에 있는 값은 출력하지 않도록 for 가 그 앞까지만 돌게 하였다.

입력으로 받은 arr 와 비교하여 원래 순서대로 배치될 수 있도록 코드를 작성하였다.

int k = 0;
for (int i = 0; i < arr.length; i++) {
	int arrayNumber = arr[i];
	for (int j = 0; j < tempArray.length; j++) {
		if (arrayNumber == tempArray[j]) {
			answer[k] = tempArray[j];
			k++;
		}
	}
}

이렇게 했을 때, 만약 arr 의 길이가 1이라면 answer[] 빈 배열로 출력이 되었다.
길이가 1이라면 answerarr 이 그대로 출력이 되어야 하기 때문에
조건문을 걸어 해결할 수 있었다.

if (arr.length == 1) {
	int[] length1 = {-1};
	answer = length1;
}

알게 된 점

  • String[] splitNum = (n + "").split(""); : 정수에 "" 빈 문자열을 더해 문자열로 바꾸어줄 수 있다.
  • Math.sqrt(N) : double 타입이 리턴된다.
  • Arrays.sort() 를 내림차순으로 하고 싶으면 Collections.reverseOrder() 를 사용한다.
  • Collections.reverseOrder() 는 참조형 타입(Wrapper Class, String..) 을 넣어주어야한다.
  • int[]Integer[] 로 바꾸기 위해선 stream을 사용할 수 있다.
    Integer[] integerArray = Arrays.stream(arr).boxed().toArray(Integer[]::new);

회고

매번 문제를 그냥 풀기만 하면 되지라는 생각에 쉽게 풀었던 것다.
배열의 크기를 모르거나 계속 변할 땐 무조건 ArrayList를 사용했었다.
이번에 풀 때는 ArrayList 를 사용하지 않고 풀어보았다.
이번 문제들은 풀면서 다 재미있었다.

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

0개의 댓글