- 점의 위치 구하기
사분면의 위치 return
class Solution {
public int solution(int[] dot) {
int answer = 0;
answer = dot[0] > 0 && dot[1] >0 ? 1 : dot[0] < 0 && dot[1] > 0 ? 2 : dot[0] < 0 && dot[1] < 0 ? 3 : dot[0] > 0 && dot[1] < 0 ? 4 : null;
return answer;
}
}
삼항연산자 쓰는 것에 맛들렸는데, 조금 더 보기 좋은 건 if else 이렇게 크게 나누고 그 안에서 작게 나누는 코드인 것 같기도 하다.
- 2차원으로 만들기
1차원 배열을 2차원 배열로 만들라는 문제
class Solution {
public int[][] solution(int[] num_list, int n) {
int[][] answer = new int[num_list.length/n][n];
int i=0;
for (int j=0; j< num_list.length/n; j++){
for (int k = 0; k<n; k++){
answer[j][k] = num_list[i];
i++;
}
}
return answer;
}
}
다른 사람의 풀이
class Solution {
public int[][] solution(int[] num_list, int n) {
int[][] answer = {};
int length = num_list.length;
answer = new int[length/n][n];
for(int i=0; i<length; i++){
answer[i/n][i%n]=num_list[i];
}
return answer;
}
}
몫과 나머지를 이용해서 for문을 하나만 사용했다니!! 진짜 효과적인 코드인 것 같다
- 공 던지기
공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호 return
<처음 코드>
class Solution {
public int solution(int[] numbers, int k) {
int answer = 1;
int num = 1;
for (int i=0; i<k; i++){
num = num % numbers.length;
//+2를 어디다 시켜주지
answer = num;
num+= 2;
if(num > numbers.length) num -= numbers.length;
}
return answer;
}
}
처음에는 나머지 값을 이용하여 계산하려 했다
하지만 두 가지 예제에서 잘못된 답이 나와 정확도가 95.7로 통과하지 못했고,
<수정한 코드>
class Solution {
public int solution(int[] numbers, int k) {
int answer = 0;
int num = 0;
for (int i=0; i< k; i++){
if(num > numbers.length-1) num -= numbers.length;
answer = numbers[num];
num+= 2;
}
return answer;
}
}
out of index 오류가 나지 않게 먼저 해당 case를 if문으로 걸러주었다.
또, 나머지를 구하려 하면, 0을 나누는 경우가 생겨 오류가 생기므로 해당 문장은 없앴다.
<다른 사람 풀이>
class Solution {
public int solution(int[] numbers, int k) {
int answer = 0;
answer = numbers[((1 + ((k-1)*2))%numbers.length) - 1];
return answer;
}
}
k가 1일때는 시작 위치, 즉 값이 1, k가 2부터 2씩 위치 값을 더해주는 것이므로 해당 코드를 작성 가능하다
- 배열 회전시키기
배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return
class Solution {
public int[] solution(int[] numbers, String direction) {
int[] answer = new int[numbers.length];
if(direction.equals("right")){
for (int i=0;i<answer.length; i++){
answer[i] = i-1 < 0 ? numbers[i-1+answer.length] : numbers[i-1];
}
}
else{
for (int i=0;i<answer.length; i++){
answer[i] = i+1 == answer.length ? numbers[i+1-answer.length] : numbers[i+1];
}
}
return answer;
}
}
내 코드에서 같은 for문이 두개나 존재하는데 이럴때는 이 공통의 것을 하나로 묶어서 그 안에 if문을 넣는 것이 효율적. 따로 돌리지 말고.
<다른 사람 풀이>
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
class Solution {
public int[] solution(int[] numbers, String direction) {
List<Integer> list = Arrays.stream(numbers).boxed().collect(Collectors.toList());
if (direction.equals("right")) {
list.add(0, list.get(list.size() - 1));
list.remove(list.size() - 1);
} else {
list.add(list.size(), list.get(0));
list.remove(0);
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
List vs ArrayList
우선, Collection Framework 는
배열을 사용하다보면 정한 크기를 변경할 수 없고 항목을 저장, 삭제, 추가하는 메소드가 없어서 직접 인덱스를 사용해야하는 불편함이 있는데, 이를 해결하기 위해 자바는 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 자료구조 를 만듦. 이러한 자료구조들이 있는 라이브러리가 FrameWork
주요interface로는 List, Set, Map, Queue등이 존재
List 컬렉션
배열과 비슷하게 객체를 인덱스로 관리. 차이점은 저장 용량이 자동으로 증가하며 객체를 저장할 때 자동 인덱스가 부여됨
추가, 삭제, 검색을 위한 다양한 메소드들 제공
List 컬렉션은 객체의 번지를 참조하기 때문에 동일한 객체를 중복 저장할 수 있는데 이 경우 동일한 번지가 참조됨.
null도 저장이 가능하고 이 경우 해당 인덱스는 객체를 참조하지 않음
<코드 설명>
- right
- 위 코드에서 0번 인덱스에 주어진 배열의 값의 마지막 위치에 있던 값이 추가된다
- 하나씩 뒤로 밀리게 되는데, 마지막 값을 제거하면 오른쪽으로 한 칸씩 이동하는 것처럼 보임
- left
- 마지막에 0번 인덱스에 있던 값을 추가한다
- 맨 처음 값을 제거한다
stream 에서 int값으로 다 바꾸고 배열로 다시 바꿔준다
'Algorithms' 카테고리의 다른 글
이코테 - 만들 수 없는 금액(Python) (0) | 2023.11.13 |
---|---|
Programmers Day 11 (0) | 2023.07.27 |
Programmers Day 9 (0) | 2023.07.20 |
Programmers Day 8 (1) | 2023.07.19 |
Programmers Day 7 (0) | 2023.07.18 |