알고리즘 연습(두 개 뽑아서 더하기, 가운데 글자 가져오기, 전화번호 목록)

2021. 5. 4. 20:56JAVA

# NOTE

indexOf() 는 특정 문자나 문자열이 앞에서부터 처음 발견되는 인덱스를 반환하며

만약 찾지 못했을 경우 "-1"을 반환

.indexOf( "찾을 특정 문자" , "시작할 위치" ) 이런식으로 사용해 주면된다.

"시작할 위치" 같은경우는 생략이 가능하며 생략할 경우 0번째 즉, 처음부터 찾기 시작한다.

https://mine-it-record.tistory.com/124
substring

//사용법

String.substring(start) 
//문자열  start위치부터 끝까지 문자열 자르기

String.substring(start,end) 
//문자열  start위치 부터 end전까지 문자열 자르기
int 배열을 Integer배열로 변환하는 방법

Integer[] nums = Arrays.stream(대상배열).boxed().toArray(Integer[]::new);
배열을 오름차순으로 정렬하는 방법
Arrays.sort(대상배열);

배열을 내림차순으로 정렬하는 방법
Arrays.sort(대상배열, Collections.reverseOrder());

정렬을 시작하는 위치와, 끝 위치를 지정하고 싶을 때
Arrays.sort(대상배열, 1, 3);
Arrays.sort(대상배열, 1, 3, Collections.reverseOrder());

# 두 개 뽑아서 더하기

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = {};
        List<Integer> rss = new ArrayList<>();
        
        //1. 각 인덱스에서 뽑아 더하기
        for(int i = 0; i < numbers.length; i++){
        	//동일한 배열을 재료로 이중반복을 돌리는 것이므로
        	//두번째 반복문의 시작점은 첫번째 반복문의 시작점보다 1이 커야 함
            for(int k = i+1; k < numbers.length; k++){
                int x = numbers[i]+numbers[k];
                //2. 더한값 중 같은 값은 거르기
                // indexOf() 는 특정 문자나 문자열이 앞에서부터 처음 발견되는 인덱스를 반환
                // 만약 일치값을 찾지 못했을 경우 "-1"을 반환
                // 따라서 rss에 기존 일치값이 없는 경우 새로 추가하는 방식
                if(rss.indexOf(x) < 0){
                    rss.add(x);   
                }
            }
        }
    
        //3. 모든 값을 배열에 담기(오름차순)
        answer = new int[rss.size()];
        
        for(int l = 0; l < answer.length; l++){
            answer[l] = rss.get(l);
        }
        
        Arrays.sort(answer);
        
        return answer;
    }
}

# 가운데 글자 가져오기

// 내가 푼 정답
class Solution1 {
    public String solution(String s) {
        String answer = "";
        
        //String 길이가 짝수인 경우
        if(s.length()%2 == 0) {
        	answer = s.substring(s.length()/2-1, s.length()/2+1);
        }
        //String 길이가 홀수인 경우
        if(s.length()%2 != 0) {
        	int index = (int) Math.floor(s.length()/2);
        	answer = s.substring(index,index+1);
        }
        
        return answer;
    }
}

// 더 간결한 정답
class Solution2 {
    public String solution(String s) {
        String answer = "";
        //나는 소수점 걱정을 했는데 substring()함수에 들어가는 index는 
        //기본적으로 정수로 치환이 되는건가??
        answer = s.substring((s.length()-1)/2, (s.length()/2)+1);
        
        return answer;
    }
}

# 전화번호 목록

// 내가 푼 방식(정확성 X/효율성 X) - 일부 케이스는 통과
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        String baseStr = "";
        String otherStr = "";
        
        //1. 기준 문자열 자르기
        for(int i = 0; i < phone_book.length; i++){
            baseStr = phone_book[i].substring(0);
            //2. 기준 문자열 길이만큼 다른 문자열 자르기
            for(int k = i+1; k < phone_book.length; k++){
                otherStr = phone_book[k].substring(0, baseStr.length());
                //3. 포함했는지 여부 확인
                for(int l = i+1; l < phone_book.length; l++){
                    if(otherStr.equals(baseStr)){
                        return false;
                    }
                }
            }  
        }

        return answer;
    }
}

// 다른 사람 푼 방식(정확성 O/효율성 X)
class Solution2 {
    public boolean solution(String[] phoneBook) {
       for(int i=0; i<phoneBook.length; i++) {
            for(int j=i+1; j<phoneBook.length; j++) {
                if(phoneBook[i].startsWith(phoneBook[j])) {return false;}
                if(phoneBook[j].startsWith(phoneBook[i])) {return false;}
            }
        }
        return true;
    }
}