- 특정 문자 제거하기
정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return
class Solution {
public int[] solution(int[] numbers, int num1, int num2) {
int[] answer = new int[num2-num1 + 1];
for (int i= 0; i<answer.length; i++){
answer[i] = numbers[i+num1];
}
return answer;
}
}
for문을 2개 돌리면 되겠지~ 하고 풀다가 안 돼서 머리를 좀 더 굴려봤다.
num1과 num2를 포함하고 그 사이에 있는 원소 개수 만큼의 크기인 answer배열을 만들었으니까 0부터 돌아가는 for문에서 num1 추가하면 된다!
다른 사람 풀이
import java.util.*;
class Solution {
public int[] solution(int[] numbers, int num1, int num2) {
return Arrays.copyOfRange(numbers, num1, num2 + 1);
}
}
Arrays.copyOfRange
전달받은 배열의 지정된 범위에 해당하는 요소를 새로운 배열에 복사하여 반환
Arrays.copyOfRange ( origin_arrays, from_index, to_index )
- 외계 행성의 나이
숫자를 알파벳으로!
for문 돌려서 charAt(i) - 'a' + 1 이런식으로 했을 때 실행시간이 너무 길다는 문제가 있었음. 10초가 넘었다..
class Solution {
public String solution(int age) {
String answer = "";
String s = Integer.toString(age);
String []arr = s.split("");
for (int i=0; i<arr.length; i++){
answer += ((char) (Integer.parseInt(arr[i]) + 97)); //int로 바꾸고 나서 97 더하기
} // a의 아스키코드가 97
return answer;
}
}
만약 age가 23이면 문자열 배열에 원소가 하나씩 들어가고(char 아님)
2라는 값이 우선적으로 정수로 바뀌고 그 후에 97이 더해진다. 그러면 99(2+97) 이 값이 char -> 문자로 바뀌면 알파벳(소문자)이 나오는것!
다른 사람의 풀이
import java.util.stream.Collectors;
class Solution {
public String solution(int age) {
return String.valueOf(age).chars().mapToObj(operand -> String.valueOf((char) (49 + operand))).collect(Collectors.joining());
}
}
stream을 이용한 것인데...
여러가지 궁금한 것이 생겼다
첫번째, 우선 내가 사용한 Integer.parseInt 와 Integer.valueOf의 차이가 무엇일까?
: 둘다 Integer클래스의 static메소드 이지만 차이점이 있다.
parseInt(): 문자열 값을 원시데이터인 int 타입을 반환
valueOf(): 문자열 값을 Integer 래퍼(wrapper)객체를 반환
함수 내부를 살펴보면,
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
결국 valueOf도 내부에서 parseInt를 사용한다.
문자열을 파싱하는 메소드가 같으니 반환값도 같을 수 밖에 없었고, 다만 반환값이 Wrapper 객체인가 아닌가의 차이일뿐
반환값을 Integer 인스턴스로 랩핑해주다는 공식 문서와 동일
두번째, 왜 97을 더하지 않고 49을 더했는데 같은 값이 출력되는가
https://upcake.tistory.com/513
이 분이 작성한 코드를 참고하면, 이 분도 49를 더하셨는데
내 코드와의 차이점은 char type의 charArray에서의 각각의 원소값을 정수로 반환한 값이라는 것이다.
즉, 내 코드에서 String type의 숫자를 int로 변환하면 "2"(String) -> 2 (int)가 되는 것인데
char 에서 int로 변환하면 '1' (char) -> 49(int) 가 되는 것
a가 0이니까 49를 더해준것
추가적으로 새롭게 알게 된 사실
:int를 String으로 바꿔 준 다음에 .toCharArray()를 이용하여 char 배열을 만들어줘야 함
<다른 사람의 풀이 하나씩 살펴보기>
- chars() : 문자열을 구성하고 있는 문자들의 ASCII 코드값을 스트림 형태로 뽑아준다.
IntStream stream = "Hello,World".chars(); //(72, 101, 108, 108, 111, 44, 87, 111, 114, 108, 100)
- .mapToObj : 기본형 특화 스트림을 Stream으로 변환해주는 메소드
https://dev-kani.tistory.com/32
- Collectors.joining() : 객체로 출력되지 않게 해 준다
https://bactoria.tistory.com/74
- 외계 행성의 나이
import java.util.*;
class Solution {
public int[] solution(int[] emergency) {
int[] answer = new int[emergency.length];
Integer[] result = Arrays.stream(emergency).boxed().toArray(Integer[]::new); //Integer 타입이어야 내림차순 정렬 가능
Arrays.sort(result, Collections.reverseOrder());
for (int i=0; i<emergency.length; i++){
for (int j=0; j<emergency.length; j++){
if (emergency[i] == result[j]){
answer[i] = j + 1 ;
}
}
}
return answer;
}
}
오름차순과 다르게 내림차순으로 stream 정렬 사용하려면 Integer 타입으로 배열을 바꿔야 한다.
바꾸고 난 후 collections의 reverseOrder() 사용.
다른 사람의 풀이
import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Collectors;
class Solution {
public int[] solution(int[] e) {
return Arrays.stream(e).map(i -> Arrays.stream(e).boxed().sorted(Comparator.reverseOrder()).collect(Collectors.toList()).indexOf(i) + 1).toArray();
}
}
어렵다...
- 순서쌍의 개수
자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return
class Solution {
public int solution(int n) {
int answer = 0;
for (int i=1; i<= n; i++){
if (n % i == 0)
answer++;
}
return answer;
}
}
그냥 약수의 개수 출력하면 되는 거라! 이렇게
다른 사람의 풀이
import java.util.stream.IntStream;
class Solution {
public int solution(int n) {
return (int) IntStream.rangeClosed(1, n).filter(i -> n % i == 0).count();
}
}
좋다..
filter로 조건, count로 개수 세기..
'Algorithms' 카테고리의 다른 글
Programmers Day 10 (0) | 2023.07.21 |
---|---|
Programmers Day 9 (0) | 2023.07.20 |
Programmers Day 7 (0) | 2023.07.18 |
Programmers Day 6 (0) | 2023.07.17 |
Programmers Day 5 (0) | 2023.07.11 |