본문 바로가기

Coding Test

(CodingTest) : 8,9일차 손코딩 대비 / 기초 문제1

 

1. 배열의 최대값 최소값 찾기

// 배열의 최대값 최소값 찾기

int[]arr = {1,2,3,4,5};
int max = arr[0];
int min = arr[0];

for(int i = 0; i < arr.length; i++){
    //최대값   
    if(max < arr[i]){ 
        max = arr[i]; 
    }
    //최소값
    if(min > arr[i]){ 
        min = arr[i]; 
    }
}

return max+min;

 

 

2. 중복값 찾기

#학습 필요

- Set<type> list = new HashSet<>(); // 클래스명 HashSet임

- HashSet은 Set내부에 이미 값이 있으면, 값을 중복으로 저장하지 않음 (vs List클래스와 다름)

* Set에는 HashSet, LinkedHashSet, TreeSet이 있으며,

   - HashSet : 중복 허용 x, 순서가 중요하지 않을 때 사용

   - LinkedHashSet : 중복 허용 x, 순서가 중요할 때 사용

   - TreeSet : 중복 허용 x, 오름차순으로 정렬할 때 사용

 

1) 내가 쓴 답 (비효율적)

import java.util.HashSet;
import java.util.Set;

    int[] arr = { 1, 2, 3, 3, 4, 4, 5 };
    Set<Integer> setList = new HashSet<>();
    

    for(int i = 0; i < arr.length; i++){
        for(int j = 0; j < arr.length; j++){
         
            if(i != j && arr[i] == arr[j]){
            setList.add(arr[i]);
            }
          }
        }
    return setList;

 

2) 다른 사람의 풀이

import java.util.HashSet;
import java.util.Set;

    int[] arr = { 1, 2, 3, 3, 4, 4, 5 };
    Set<Integer> setList = new HashSet<>();
    

    for(int i = 0; i < arr.length; i++){
         for(int j =i+1; j < arr.length; j++){ // arr.length는 7
          
             if(arr[i] == arr[j]){
                    setList.add(arr[i]);   
             }
         }
        }
    return setList;

 

 

3. 배열 뒤집기

1) 내가 쓴 답(오답)

# 배열의 절반 부분까지만 반복하면 됨 --> arr.length / 2까지만

# 배열 내부의 값 설정 부분 신경쓰기 --> arr[arr.length]로 설정하면 배열의 범위를 초과함

// 풀이 : arr배열의 i번째 값을 arr.length에 넣고, arr의 i+1의 값을 arr.length-1에 넣으면 될듯

int[] arr = {1, 2, 3, 4, 5};

    for(int i = 0; i < arr.length; i++){
        
        int temp = arr[i]; // arr[i] 예, arr[0]인 1을 temp에 넣어두기
        
        arr[i] = arr[arr.length-i-1]; // i = 0 일 때, arr[0]의 위치에 arr[4]을 넣고,
                                    // i = 1 일 때, arr[1]의 위치에 arr[3]을 넣음
        arr[arr.length-1-i] = temp;
    }

     return arr;

 

2) 다른 사람의 풀이

# 비효율적인 부분 제외 --> i < arr.length / 2 까지 실행

int[] arr = {1, 2, 3, 4, 5};

    for(int i = 0; i < arr.length / 2; i++){
        
        int temp = arr[i]; // arr[i] 예, arr[0]인 1을 temp에 넣어두기
        arr[i] = arr[arr.length-1-i]; // i = 0 일 때, arr[0]의 위치에 arr[4]을 넣고,
                                    // i = 1 일 때, arr[1]의 위치에 arr[3]을 넣음
        arr[arr.length-1-i] = temp;
    }

     return arr;

 

# while문 사용

int[] arr = {1, 2, 3, 4, 5};

 int left = 0;
 int right = arr.length;

 while(left < right){
    int temp = arr[left];
    arr[left] = arr[right-1]; // arr[0]에다가 arr[4]의 값 넣기
    arr[right-1] = temp;
    left++;
    right--;
     
 }
return arr;

 

4. 문자열 뒤집기

1) 내가 쓴 답(오답)

# new StringBuffer()객체 생성 시, new StringBuffer(str); 내부에 변수를 넣어줘야 적용됨.

# sb.reverse()이렇게 반환하면, 여전히 str값이 StringBuffer객체 내부에 뒤집어진 상태로만 남아있어서, toString() 사용해야함

// 문자열 뒤집기

// 해결 : 문자열 변경 도와주는 StringBuffer 사용하기

import java.util.StringBuffer;

    String str = "hello";

    StringBuffer sb = new StringBuffer();

 	sb.reverse(str);
    
return sb;

 

2) 다른 사람이 쓴 풀이(정답)

import java.util.StringBuffer;

    String str = "hello";

    StringBuffer sb = new StringBuffer(str);

    sb.reverse();

return sb.toString();

 

 

5. 중복된 문자열 제거

 

# 모르거나 헷갈리는 부분

- HashSet이 String타입에도 적용되는지? --> 적용 가능

- new HashSet<>();의 경우 초기 크기를 설정 안해도 되는지? --> 안해도 됨, [ ] 배열과 다른 형태임

- HashSet객체에 값을 저장할 때, arr값이 여러개라면, add(arr)를 통하여 값을 바로 저장할 수 없음

   --> arr의 값들을 하나씩 찾아서 저장해야함

- .(new String[0])은 크기가 0인 String 배열을 넘기면 내부적으로 스트림 크기에 맞게 새로운 배열을 생성함

- (String[]::new) --> toArray()가 적절한 크기의 배열을 생성하도록 돕는 역할을 함

  → 즉, (size) -> new String[size]을 간결하게 표현한 것

(String[]::new) 여기서 ::은 메서드 참조를 의미

 

1) 내가 쓴 답(오답)

// 중복된 문자열 제거
// 해결 : HashSet을 통하여, 새로운 배열에 다시 저장해보기 (HashSet이 String에도 적용되는지?)

import java.util.HashSet;
import java.util.Set;

String[] arr = { "p", "e", "o", "p", "l" ,"e" };


 Set<String> strArr = new HashSet<>();  // 크기 설정 안해줘도 되는건지?

 // !! add는 하나의 값만 저장하는 용도이므로, 하나씩 꺼내서 저장해야 함  

 return strArr.add(arr);

 

 

2) 다른 사람의 풀이(정답)

# 특이점

HashSet을 사용하면 순서가 실행할 때마다 바뀔 수 있음

Arrays.stream(arr).distinct()를 사용하면 순서가 유지됨

// 중복된 문자열 제거
// 해결 : HashSet을 통하여, 새로운 배열에 다시 저장해보기 (HashSet이 String에도 적용되는지?)

import java.util.HashSet;
import java.util.Set;

String[] arr = { "p", "e", "o", "p", "l" ,"e" };


 Set<String> strArr = new HashSet<>();  // 크기 설정 안해줘도 되는건지?

 // !! add는 하나의 값만 저장하는 용도이므로, 하나씩 꺼내서 저장해야 함  

        for(String a : arr){
        strArr.add(a);     
        }

 return strArr;

 

import java.util.Arrays;

String[] arr = { "p", "e", "o", "p", "l" ,"e" };
		
		arr= Arrays.stream(arr).distinct().toArray(String[]::new);
		
		System.out.println(Arrays.toString(arr));
			
	}