모르면 배우면 된다

프로그래머스 level1에서 얻은 지식 - Arrays, Math 본문

알고리즘

프로그래머스 level1에서 얻은 지식 - Arrays, Math

Okguri 2021. 11. 4. 00:26

먼저 성공적으로 풀이한 정수 제곱근 판별부터. 

 

문제 

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

 

나의 풀이

왜 이렇게 풀었냐?

n이 101이라고 치자. 

제곱근을 구하는 함수 Math.sqrt의 자료형은 double이고, 이것을 double 자료형의 sqrt에 대입했다. 프린트로 찍으면 10.049875621121 같이 소수점으로 나올 것이다. 이 sqrt를 int로 변환하면 10으로 나온다. 

double 자료형의 sqrt와 int 자료형의 sqrt는 다르다.

만약 둘이 같다면? 정수라는 의미다. 

따라서 (int)sqrt == sqrt 라는 조건식을 걸었다.

 

Math 내장 함수를 몰랐다면 제곱근을 하나하나 만들어내며 코딩하고 있었을 것이다.

코딩테스트는 힘들지만 나도 몰랐던 다양한 자바의 기능들을 알 수 있어 좋은 거 같다. 

 

친구가 한 방식은 sqrt%1==0을 조건식으로 걸었다.

나머지가 0이면 정수니까.. 말이 된다. 천재같다. 

 

Math 관련 내재함수

https://lktprogrammer.tistory.com/114

==============================================

 

문제 

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

 

이건 풀다가 시간이 부족해서 다 못 푼 문제다. 

 

배열을 내림차순으로 정렬해서 가장 마지막에 있는 숫자를 제거해야겠다고 생각해 야심차게 코드를 짰는데

아 뿔 싸 생각해보니까 기존 배열의 순서를 건드리면 안 됐던 것임^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

인상 깊은 풀이는 다음과 같다. 따라해보느라 뒷부분까지 완벽하게 구현하지는 않았지만,

가장 작은 값을 Arrays 내장함수를 써서 가져온 것이 인상깊었다.

Arrays에는 정렬, 최대값, 최소값 등 다양한 기능이 담겨있다. 중요한 점은 int[], byte[], char[] 등 일반 배열만 쓸 수 있다. list 등은 사용 불가. 난 배열 하면 주로 list를 사용했기 때문에 일반 배열은 익숙하지 않았다. 

찾아보니까 Arrays.stream는 for문 도배 방지를 위해 나왔다고 한다. 공감 공감.. 

.distinct() 중복제거

.sorted() : 정렬 

.sorted(Comparator.reverseOrder()) : 역정렬

.findFirst(): 스트림 처음값 가져오기 

.collect(Collectors.toList()) : 리스트 형태로 반환

등 온갖 유용한 기능이 들어가 있다. 

참고 블로그 

https://wakestand.tistory.com/419

 

코딩테스트를 하면서 드는 생각은

아 이런 게 기능이 없을리가 없는데 싶은 건

웬만하면 있다.. 일단 도전해보고 내장기능이 있는지 꼭 꼭 확인해보자.