Open SDeung01 opened 1 year ago
최근 길거나 복잡한 문제를 위주로 풀다보니 사소한 실수가 잦은 듯 하여 기본적인 문제를 다시 풀어보았다.
- absolutes의 길이는 1 이상 1,000 이하입니다.
- absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
- signs의 길이는 absolutes의 길이와 같습니다.
- signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.
answer += signs[i] ? absolutes[i] : -1 * absolutes[i];
이렇게 작성하는 방식과answer += (signs[i] ? 1 : -1) * absolutes[i] ;
이렇게 작성하는 방식 중 어느쪽이 좀 더 가독성이 높을까 고민하였는데 개인적으론 아래의 코드에 작성한 방식이 좀 더 직관적으로 와닿는 듯했다.
class Solution {
public int solution(int[] absolutes, boolean[] signs) {
int answer = 0;
for(int i = 0; i < signs.length; i++){
answer += signs[i] ? absolutes[i] : -1 * absolutes[i];
}
return answer;
}
}
import java.util.stream.IntStream;
class Solution { public int solution(int[] absolutes, boolean[] signs) { int answer = IntStream.range(0,signs.length) .map(i -> signs[i] ? absolutes[i] : -1 * absolutes[i]) .sum(); return answer; } }
## 회고
- 간단한 문제 일수록 코드를 간결하고 가독성있게 작성하는 것에 대해 생각해보기 좋은 듯 하여 앞으로도 종종 풀어봄이 좋을 듯하다. 물론 가능하다면 이번처럼 stream과 같이 여러가지 방식으로 접근해보는 것 또한 함께 하는 것이 좋을 듯 하다.
- stream을 사용함에 있어 삼항연산자의 사용이 가능한지 긴가민가 했는데 전혀 문제가 없었다. 아무래도 람다 표현식에 좀 더 익숙해질 필요를 느꼈다.
- 배열 arr의 크기 : 1,000,000 이하의 자연수
- 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
import java.util.*;
public class Solution { public int[] solution(int []arr) { int[] temp = new int[arr.length]; Arrays.fill(temp, Integer.MAX_VALUE); int idx = 0; for(int i = 0; i < arr.length; i++){ int prevNum = i == 0 ? Integer.MAX_VALUE : temp[idx - 1]; if(prevNum != arr[i]){ temp[idx] = arr[i]; idx++; } }
return Arrays.copyOfRange(temp, 0, idx);
}
}
![image](https://github.com/enoch012/JavaBasicStudy/assets/145359737/3f0877e4-6bf3-4c5e-8d9e-6e65d1b4adef)
![image](https://github.com/enoch012/JavaBasicStudy/assets/145359737/bc5d6b70-cb27-4a64-99c0-48459f7ff1f7)
## 회고
- 다음은 앞서 얘기했던 List를 사용한 일반적인 방법으로 작성한 코드이다.
- 정확성 테스트(위)에서는 앞서 작성한 코드와 마찬가지로 큰 편차없이 고르게 빠른 속도를 보여주지만 효율성 테스트(아래)에서는 앞서 작성한 코드가 조금 더 빠른 것을 확일 할 수 있다. 여기서 int배열로 전환하기 위해 for문이 아닌 stream을 썼다면 차이가 더 크게 났을 듯 하다.
```java
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
ArrayList<Integer> tempList = new ArrayList<Integer>();
int preqNum = Integer.MAX_VALUE;
for(int num : arr) {
if(preqNum != num) tempList.add(num);
preqNum = num;
}
int[] answer = new int[tempList.size()];
for(int i=0; i<answer.length; i++) {
answer[i] = tempList.get(i).intValue();
}
return answer;
}
}
문제1 : 문자열 나누기
문제
입출력 예
s | result -- | -- "banana" | 3 "abracadabra" | 6 "aaabbaccccabba" | 3문제풀이
주어진 조건을 충족하면 문자열을 substring()으로 잘라 반환하는 메소드를 만들고 그것을 남은 부분이 없거나 더이상 읽을 글자가 없을 때 까지 반복한다.
회고
반복문을 중첩하지 않고 코드를 작성하면 다음과 같이 작성할 수 있으나 이런 경우 메소드를 어떤 식으로 분리하면 좋을지에 대해서는 잘 감이 오지 않는다. 다만 코드가 충분히 간결하고 하나의 기능을 수행하는 것으로 볼 수 있기 때문에 별도로 메소드를 분리하여 작성할 필요는 없을 듯 하다.