본문 바로가기
내가 배운 것들/알고리즘

항해99 11/8(월) 알고리즘 - 고성범님 담당 분량

by Zabee52 2021. 11. 8.

6. 없는 숫자 더하기

 

코딩테스트 연습 - 없는 숫자 더하기

0부터 9까지의 숫자 중 일부가 들어있는 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요. 제한

programmers.co.kr

class Solution {
    public int solution(int[] numbers) {
    	// 0~9중 없는 숫자를 더하기
        // 0~9까지의 합(45)에서 빼면 됨
        int answer = 45;
        for(int i = 0; i < numbers.length; i++)
            answer -= numbers[i];
        return answer;
    }
}

 

 

10.행렬의 덧셈

 

코딩테스트 연습 - 행렬의 덧셈

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요

programmers.co.kr

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
    	// 행렬에서 대응되는 자리의 수를 더하기
        // [2,3] + [3,4] -> [5, 7]
        int[][] answer = new int[arr1.length][arr1[0].length];
        for(int r = 0; r < answer.length; r++) {
            for(int c = 0; c < answer[0].length; c++)
                answer[r][c] = arr1[r][c] + arr2[r][c];
        }
        return answer;
    }
}

 

 

14. 나누어 떨어지는 숫자 배열

 

코딩테스트 연습 - 나누어 떨어지는 숫자 배열

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하

programmers.co.kr

import java.util.*;
class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = {-1};
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] % divisor == 0) {
                pq.add(arr[i]);
            }
        }
        if(pq.size() == 0) {
            return answer;
        } else {
            answer = new int[pq.size()];
            int i = 0;
            while(!pq.isEmpty()) {
                answer[i] = pq.poll();
                i++;
            }
        }
        return answer;
    }
}

Arrays.sort 사용 후 return하면 끝나지만 시간복잡도를 고려해서 우선순위큐(순서가 존재하는 큐)를 사용하셨다고 한다.

arr를 스캔하여 나뉘는 값을 찾아서 정렬할 경우의 시간 복잡도
arr 스캔: O(n) 추출한 리스트를 array로 변환: O(n) 리턴값 정렬: O(nlogn)
시간 복잡도 결과: 2(O(n)) + O(nlogn)
우선순위큐를 이용할 경우의 시간 복잡도
arr 스캔하면서 우선순위큐에 삽입: O(nlogn) 추출한 값 array에 삽입: O(nlogn)
시간 복잡도 결과: 2(O(nlogn))
퀵정렬의 평균이 nlogn인걸 감안했을때 차이가 없는듯 하다.....

라고 하신다.

 

 

18. 서울에서 김서방 찾기

 

코딩테스트 연습 - 서울에서 김서방 찾기

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니

programmers.co.kr

class Solution {
    public String solution(String[] seoul) {
        String answer = "";
        for(int i = 0; i < seoul.length; i++) {
            if(seoul[i].equals("Kim"))
                return "김서방은 " + i + "에 있다";
        }
        return answer;
    }
}

Kim이 반드시 포함된 배열 속에서 Kim을 찾으면 된다고 한다. 심플하다.

 

 

22. 자릿수 더하기

 

코딩테스트 연습 - 자릿수 더하기

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한사항 N의 범위 : 100,000,000 이하의 자연수 입출

programmers.co.kr

import java.util.*;

public class Solution {
    public int solution(int n) {
        int answer = 0;
        int divider = 10;
        int curVal = 0;
        if (n == 100000000)
            return 1;
        while(divider < 1000000000) {
            curVal = (n % divider);
            if(divider < 100)
                answer += curVal;
            else {
                int temp = curVal / (divider / 10);
                answer += temp;
            }
            divider *= 10;
        }
        return answer;
    }
}

 

 

26. 제일 작은 수 제거하기

 

코딩테스트 연습 - 제일 작은 수 제거하기

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1

programmers.co.kr

import java.util.*;
class Solution {
    public int[] solution(int[] arr) {
        if(arr.length == 1){
            arr[0] = -1;
            return arr;
        } else {
            int[] copy = Arrays.copyOf(arr, arr.length);
            Arrays.sort(copy);
            int min = copy[0];
            ArrayList<Integer> l = new ArrayList<Integer>();
            for(int i = 0; i < arr.length; i++) {
                if(arr[i] != min)
                    l.add(arr[i]);
            }
            int [] answer = new int[arr.length - 1];
            for(int j = 0; j < l.size(); j++) {
                answer[j] = l.get(j);
            }
            return answer;
        }
    }
}

배열에서 제일 작은수를 뺀 나머지를 반환해주면 되는 메소드이다. 만약 length가 1이면 -1을 반환해주도록 되어있다.

 

 

30. 최소 직사각형

 

코딩테스트 연습 - 최소직사각형

[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 120 [[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] 133

programmers.co.kr

class Solution {
    public int solution(int[][] sizes) {
        int col = -1;
        int max = -1;
        
        for(int i = 0; i < sizes.length; i++) {
            for(int j = 0; j < sizes[0].length; j++) {
                if (sizes[i][j] > max) {
                    col = j;
                    max = sizes[i][j];
                }
            }
        }
        
        int otherCol = col == 0 ? 1 : 0;
        int otherMax = -1;
        
        for(int i = 0; i < sizes.length; i++) {
            if(sizes[i][col] < sizes[i][otherCol]) {
                int temp = sizes[i][col];
                sizes[i][col] = sizes[i][otherCol];
                sizes[i][otherCol] = temp;
            }
            if(sizes[i][otherCol] > otherMax)
                otherMax = sizes[i][otherCol];
        }
        
        return max * otherMax;
    }
}

모든 사각형이 들어갈 수 있는 가장 적합한 넓이의 사각형을 만드는 문제이다.

80, 10

20, 30

두 개의 사각형이 있으면, 아래의 사각형을 회전시켜서

80, 10

30, 20

의 꼴을 만들고 80*20의 사각형을 만들어 처리하면 된다.

문제가 심플하지만 생각할 필요가 있는 것 같다.

 

 

34. 모의고사

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

import java.util.*;
class Solution {
    public int[] solution(int[] answers) {
        int[] answerss = {1,2,3};
        int[] numOfCor = {0,0,0};
        int i = 0;
        int num1Index = 0;
        int num2Index = 0;
        int num3Index = 0;
        int [] num1 = {1,2,3,4,5};
        int [] num2 = {2,1,2,3,2,4,2,5};
        int [] num3 = {3,3,1,1,2,2,4,4,5,5};
        while(i < answers.length) {
            int temp1 = i % num1.length;
            int temp2 = i % num2.length;
            int temp3 = i % num3.length;
            if(temp1 != 0) {
                if(answers[i] == num1[num1Index])
                    numOfCor[0]++;
            } else {
                num1Index = 0;
                if(answers[i] == num1[num1Index])
                    numOfCor[0]++;
            }
            if(temp2 != 0) {
                if(answers[i] == num2[num2Index])
                    numOfCor[1]++;
            } else {
                num2Index = 0;
                if(answers[i] == num2[num2Index])
                    numOfCor[1]++;
            }
            if(temp3 != 0) {
                if(answers[i] == num3[num3Index])
                    numOfCor[2]++;
            } else {
                num3Index = 0;
                if(answers[i] == num3[num3Index])
                    numOfCor[2]++;
            }
            i++;
            num1Index++;
            num2Index++;
            num3Index++;
        }
        int max = numOfCor[0];
        if (max > numOfCor[1] && max > numOfCor[2]) {int[] answer = {1};return answer;}           
        else if (max > numOfCor[1] && max == numOfCor[2]){int[] answer = {1, 3};return answer;}         
        else if (max == numOfCor[1] && max > numOfCor[2]){int[] answer = {1, 2};return answer;}         
        else if (max < numOfCor[1] && numOfCor[1] > numOfCor[2]){int[] answer = {2};return answer;}     
        else if (max < numOfCor[1] && numOfCor[1] == numOfCor[2]){int[] answer = {2, 3};return answer;}
        else if (numOfCor[2] > numOfCor[1] && max < numOfCor[2]){int[] answer = {3};return answer;}    
        else if (max == numOfCor[1] && max == numOfCor[2]){int[] answer = {1,2,3};return answer;}
        return answerss;
    }
}

수포자 주제에 찍어서 맞췄을때 등수가 높길 바라는 파렴치한 함수이다. 모든 경우의수를 구해서 계산해줬다.

 

import java.util.*;

class Solution {
    public static int[] solution(int[] answers) {
        int[][] patterns = {
                {1, 2, 3, 4, 5},
                {2, 1, 2, 3, 2, 4, 2, 5},
                {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
        };

        int[] hit = new int[3];
        for(int i = 0; i < hit.length; i++) {
            for(int j = 0; j < answers.length; j++) {
                if(patterns[i][j % patterns[i].length] == answers[j]) hit[i]++;
            }
        }

        int max = Math.max(hit[0], Math.max(hit[1], hit[2]));
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < hit.length; i++)
            if(max == hit[i]) list.add(i + 1);

        int[] answer = new int[list.size()];
        int cnt = 0;
        for(int num : list)
            answer[cnt++] = num;
        return answer;
    }
}

이 코드는 간결하게 만든 코드라고 한다. 이런 코드를 짜는 사람이 되자.

 

 

38. 숫자문자열과 영단어

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 0;
        int len = s.length();
        String[] digits = {"0","1","2","3","4","5","6","7","8","9"};
        String[] alphabets = {"zero","one","two","three","four","five","six","seven","eight","nine"};

        for(int i=0; i<10; i++){
            s = s.replaceAll(alphabets[i],digits[i]);
        }

        return Integer.parseInt(s);
    }
}

one2three4five6seven8nine0 형식으로 나오는 문자를

1234567890으로 바꿔주면 되는 문제이다.

replaceAll 기능을 알고 있다면 순식간에 풀 수 있지만, 모른다면 꽤 많은 고민을 거쳐야 할 것이다.

 

import java.util.*;

class Solution {
    public int solution(String s) {
        
        StringBuilder answer = new StringBuilder();
        HashSet<String> nums = new HashSet<String>();
        
        for(int i = 0; i < 10; i++)
            nums.add(String.valueOf(i));
        
        StringBuilder sb = new StringBuilder();
        for(int j = 0; j < s.length(); j++) {
            sb.append(s.charAt(j));
            if(sb.toString().length() == 1) {
                if(nums.contains(sb.toString())) {
                    answer.append(sb.toString());
                    sb.delete(0, 1);      
                }
            } else if (sb.toString().length() == 3) {
                if(sb.toString().equals("two")){
                    answer.append(2);
                    sb.delete(0, 3);
                } else if(sb.toString().equals("six")) {
                    answer.append(6);
                    sb.delete(0, 3);
                } else if(sb.toString().equals("one")) {
                    answer.append(1);
                    sb.delete(0, 3);
                }
            } else if (sb.toString().length() == 4) {
                if(sb.toString().equals("four")) {
                    answer.append(4);
                    sb.delete(0, 4);
                } else if(sb.toString().equals("nine")) {
                    answer.append(9);
                    sb.delete(0, 4);
                } else if(sb.toString().equals("zero")) {
                    answer.append(0);
                    sb.delete(0, 4);
                } else if(sb.toString().equals("five")) {
                    answer.append(5);
                    sb.delete(0, 4);
                }
            }  else if (sb.toString().length() == 5) {
                if(sb.toString().equals("three")){
                    answer.append(3);
                    sb.delete(0, 5);
                } else if(sb.toString().equals("eight")) {
                    answer.append(8);
                    sb.delete(0, 5);
                } else if(sb.toString().equals("seven")) {
                    answer.append(7);
                    sb.delete(0, 5);
                }
            }
        }
        return Integer.parseInt(answer.toString());
    }
}

이렇게 말이다.

댓글