모르면 배우면 된다
프로그래머스 level1에서 얻은 지식 - Arrays, Math 본문
먼저 성공적으로 풀이한 정수 제곱근 판별부터.
문제
임의의 양의 정수 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
코딩테스트를 하면서 드는 생각은
아 이런 게 기능이 없을리가 없는데 싶은 건
웬만하면 있다.. 일단 도전해보고 내장기능이 있는지 꼭 꼭 확인해보자.
'알고리즘' 카테고리의 다른 글
알고리즘- 재귀함수 정리 (0) | 2022.06.02 |
---|---|
알고리즘 - 배열을 비교할 때 사용하는 알고리즘 (0) | 2022.05.31 |
알고리즘-배열과 객체의 시간 (0) | 2022.05.30 |
알고리즘- 빅오, 시간복잡도, 공간복잡도 (0) | 2022.05.29 |
StringBuilder의 활용 (0) | 2021.11.17 |