- 나머지 구하기
나의 코드
class Solution {
public int solution(int num1, int num2) {
int answer = -1;
if (0 < num1 && num1 <= 100 && 0 < num2 && num2 <= 100){
answer = num1 % num2;
}
return answer;
}
}
좋아요 45개나 달린 다른 사람의 풀이를 봤는데
class Solution {
public int solution(int num1, int num2) {
while (num1 >= num2) {
num1 = num1 - num2;
}
int answer = num1;
return answer;
}
}
반복문을 사용해서 나누는 수를 계속해서 빼 주고 난 다음의 나머지 return하는 방식.
매개변수로 주어지는 num1과 num2 의 대소 차이까지 고려한 코드. 기발한 것 같기는 한데 이렇게 코드를 작성할 것 같지는 않다.
- 중앙값 구하기
리스트 안에 숫자가 크기 순서대로 정렬되어 있는 것이 아니기 때문에,, 과거 자료구조 시간에 배웠던 여러 정렬법 중 하나를 사용하기로 했다. 시간복잡도는 크지만 기억나는 것이 버블 정렬이었기 때문에,,
내가 쓴 코드
class Solution {
public int solution(int[] array) {
int answer = 0;
if (0 < array.length && array.length < 100){
for (int i = 1; i < array.length; i++){
if (-1000 < array[i] && array[i] < 1000){
for (int j=0; j<i; j++){
if(array[i] < array[j]) {
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
}
}
return array[array.length/2];
}
}
파이썬으로 버블정렬을 다뤘을 때는 flag라는 변수를 사용하여 원소의 교환 여부를 기억했다. 지금 이 코드와 다른 논리라서.. 다시 보고 이해할 필요가 있을 것 같고
다른 사람의 코드
import java.util.Arrays; //라이브러리 써주기 앞으로!
class Solution {
public int solution(int[] array) {
Arrays.sort(array);
return array[array.length >> 1];
}
}
Arrays library의 내장된 sort 함수 사용해서 바로 정렬해버리고, 시프트 연산(비트) 으로 나누기 2를 함. 그런데 성능 차이가 크게 나지 않기 때문에 가독성 측면에서 그냥 /2 쓰기!
- 최빈값 구하기
최빈값 return, 여러 개변 -1 return
내가 쓴 코드
class Solution {
public int solution(int[] array) {
int max = 0; //배열의 수 중 가장 큰 수
int answer = 0; //답
for (int i=0; i <array.length; i++){ //count배열 크기 정하기 위해 가장 큰 수 구하기
if (array[i] > max) {
max = array[i];
}
}
int [] count = new int[max + 1]; //0인 경우 있으므로 +1
for (int i=0; i<array.length; i++){ // 해당 값의 빈도
count[array[i]]++;
}
int mode = 0; //최빈값
for (int j=0; j<count.length; j++){
if(count[j] > mode){
mode = count[j];
answer = j;
}
}
int num = 0;
for (int j=0; j<count.length; j++){ //최빈값 여러개일 경우
if (count[j] == mode){
num++;
}
}
if (num > 1) answer = -1; //-1 return!
return answer;
}
}
배열 하나 더 쓰기 싫었는데... 방법이 생각이 나질..않더라
다른 사람이 쓴 코드 봤는데... 대박 Map을 이용하면 편한 거였어!
import java.util.*;
class Solution {
public int solution(int[] array) {
int maxCount = 0;
int answer = 0;
Map<Integer, Integer> map = new HashMap<>();
for(int number : array){
int count = map.getOrDefault(number, 0) + 1;
if(count > maxCount){
maxCount = count;
answer = number;
}
else if(count == maxCount){
answer = -1;
}
map.put(number, count);
}
return answer;
}
}
- 아주 간편한 문제 제외하고는 처음에 되도록이면 import java.util.* 써주기
- HashMap사용하기!!
- JAVA의 Map-getOrDefault란?
: 찾는 키가 존재하면 키의 값을 반환하고 없다면 기본 값을 반환하는 메소드
map.getOrDefault(number, 0) + 1
number키가 없으면 그 값은 0, 있으면 +1 하기
- 짝수는 싫어요
정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return
내가 쓴 코드
class Solution {
public int[] solution(int n) {
int number = 0;
if (n % 2 == 0){
number = n/2;
}
else {
number = n/2 + 1;}
int[] answer = new int[number];
answer[0] = 1;
if (1 <= n && n <= 100){
for (int i=1; i < answer.length; i++){
answer[i] = 2*i +1;
}
}
return answer;
}
}
금방 풀었는데..
다른 사람이 쓴 코드
import java.util.stream.IntStream;
class Solution {
public int[] solution(int n) {
return IntStream.rangeClosed(0, n).filter(value -> value % 2 == 1).toArray();
}
}
좋아요 많이 받은 코드에서 stream이 많이 보인다..
Stream
: 스트림은 데이터 소스( collection, array, I/O resource)를 추상화하고 자주 사용되는 메소드들( filter, map, reduce, find, match, sort)을 정의해 놓은 것
- 데이터 소스로부터 데이터를 읽기만 할 뿐, 변경하지는 않는다
- 한번 사용하면 닫혀서 재사용 불가
- 작업을 내부 반복으로 처리(:internal iteration. collection은 external iteration으로 명시적으로 한 원소씩 순회)
- 요소의 타입이 T인 스트림은 Stream이지만, 오토박싱/언박싱의 비효율을 줄이기 위해 데이터 소스의 요소를 기본형으로 다루는 InsStream, LongStream, DoubleStream이 제공됨
- 병렬스트림은 내부적으로 fork&join 프레임웍을 이용해서 자동적으로 연산을 병렬로 수행한다. 스트림에 parallel() 메서드를 호출하면 병렬로 연산하고, parallel()을 취소하려면 sequential()을 호출
-> 다음 게시물에서 더 자세히 다뤄야지
[출처]
https://blog.naver.com/iwin1203/223067538285
https://ryan-han.com/post/dev/java-stream/
'Algorithms' 카테고리의 다른 글
Programmers Day 7 (0) | 2023.07.18 |
---|---|
Programmers Day 6 (0) | 2023.07.17 |
Programmers Day 5 (0) | 2023.07.11 |
Programmers Day 4 (0) | 2023.07.09 |
JAVA Stream (0) | 2023.07.09 |