개발 낙서장

[TIL] 내일배움캠프 4일차 - Java로 코딩하기 - 본문

Java/Sparta

[TIL] 내일배움캠프 4일차 - Java로 코딩하기 -

권승준 2023. 12. 27. 19:11

 

 

오늘의 학습 키워드📚

최소직사각형

https://school.programmers.co.kr/learn/courses/30/lessons/86491

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

처음엔 문제 의도가 잘 이해가 안 됐다. 명함을 돌려서라도 최소 직사각형을 찾으면 된다는 것에 꽂혀서 가로를 기준으로 잡고 돌려보고 세로를 기준으로 잡고 돌려봤는데 잘 안 돼서 고민을 많이 했었는데, 알고 보니 문제 의도만 파악하면 쉬운 문제였다.
결국 모든 직사각형을 담을 수 있는 최소 크기의 직사각형을 만들면 되는 것이기에 지갑의 가로는 모든 명함의 가로세로 중 큰 값의 최댓값, 지갑의 세로는 명함의 가로세로 중 작은 값의 최댓값으로 만들면 모든 명함을 포함하면서도 가장 작은 크기의 지갑을 만들 수 있다.

소스 코드

더보기
class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        
        int w_max = 0;
        int h_max = 0;
        
        for(int i = 0; i < sizes.length; i++) {
            w_max = Math.max(w_max, Math.max(sizes[i][0], sizes[i][1]));
            h_max = Math.max(h_max, Math.min(sizes[i][0], sizes[i][1]));
        }
        
        answer = w_max * h_max;
        
        return answer;
    }
}

시저 암호

https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C

 

아스키 코드 - 나무위키

아래 표는 아스키 코드 중 제어 문자와 확장 아스키 코드를 제외한 부호(영문 자판에 사용되는 부호)를 정리한 것이다. 10진수부호10진수부호10진수부호10진수부호0320568080P104h033!0579081Q105i034"058:082

namu.wiki

아스키 코드가 어떤 것인지만 알고 있으면 쉽게 해결할 수 있는 문제다.

소스 코드

더보기
class Solution {
    public String solution(String s, int n) {
        String answer = "";
        StringBuilder sb = new StringBuilder();

        int ascii = 0;
        
        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == ' ') {
                sb.append(s.charAt(i));
                continue;
            }
            
            ascii = (int)s.charAt(i);

            if(ascii >= 97) {
                ascii += n;
                if(ascii > 122) {
                    ascii = 97 + (ascii - 122 - 1);
                }
            }
            else {
                ascii += n;
                if(ascii > 90) {
                    ascii = 65 + (ascii - 90 - 1);
                }
            }

            sb.append((char)ascii);
        }

        answer = sb.toString();
        
        return answer;
    }
}

숫자 문자열과 영단어

https://school.programmers.co.kr/learn/courses/30/lessons/81301?language=java

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

숫자는 그대로, 문자열은 매핑해서 숫자로 출력하면 되므로 Map을 사용했다.
Map에 one-1, two-2, three-3, ... 으로 문자열과 매핑할 숫자를 미리 캐싱해놓는 방식으로 해결했다.

  • Map : Key-Value 쌍으로 이루어진 자료구조.(선언 : Map<자료형, 자료형> 이름 = new HashMap<자료형, 자료형>())
    정렬이 되지 않으며 Key는 중복을 허용하지 않지만 Value는 중복이 가능하다.
    C++의 unordered_map, c#의 Dictionary 등과 매우 유사하다.

소스 코드

더보기

 

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(String s) {
        int answer = 0;
        StringBuilder sb = new StringBuilder();
        StringBuilder number_sb = new StringBuilder();

        Map<String, String> map = new HashMap<String, String>();
        map.put("one", "1");
        map.put("two", "2");
        map.put("three", "3");
        map.put("four", "4");
        map.put("five", "5");
        map.put("six", "6");
        map.put("seven", "7");
        map.put("eight", "8");
        map.put("nine", "9");
        map.put("zero", "0");
        
        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                sb.append(s.charAt(i));
                continue;
            }

            number_sb.append(s.charAt(i));
            if(map.containsKey(number_sb.toString())) {
                sb.append(map.get(number_sb.toString()));
                number_sb.setLength(0);
            }
        }

        answer = Integer.parseInt(sb.toString());
        
        return answer;
    }
}

문자열 내 마음대로 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/12915

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

자바에는 배열을 정렬해주는 Arrays.sort() 함수가 있다.
String 배열 a를 정렬하고자 할 때 오름차순은 Arrays.sort(a), 내림차순은 Arrays.sort(a, Collections.reverseOrder())를 사용하면 된다. 근데 만약 문자열 비교가 아니라 문자열의 길이 순으로 정렬하고 싶다면?
이럴 땐 직접 비교 연산자를 만들어서 정렬해줘야 하는데 Comparable과 Comparator가 있다.

  • Comparable : 정렬하고자 하는 객체의 클래스 내부에 구현하는 인터페이스이다. 파라미터와 자기 자신을 비교하여 return한다.
    반환형이 int인 compareTo(Object o) 메소드를 오버라이드 해야 하며
    오름차순은 return this 객체 - o 객체, 내림차순은 return o 객체 - this 객체이다.
  • Comparator : 클래스 내부에서 구현할 수 없거나 String과 같이 이미 정해진 비교연산자가 있지만 다른 기준으로 정렬하고 싶을 때 별도로 구현하는 인터페이스이다. 두 개의 파라미터를 받아 비교하여 return한다.
    이 역시 반환형이 int인 compare(Object o1, Object o2) 메소드를 오버라이드 해야 하며
    오름차순은 return o1 객체 - o2 객체, 내림차순은 return o2 객체 - o1 객체이다.

간단한 사용법으로는 만약 String 배열을 문자열의 길이를 기준으로 오름차순으로 정렬하고자 한다면

        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if(o1.length() != o2.length())
                    return o1.length() - o2.length();
                else
                    return o1.compareTo(o2);
            }
        });

문자열의 길이가 다르면 문자열의 길이 기준 오름차순으로 정렬하고 문자열의 길이가 같다면 문자열의 크기 기준 오름차순으로 정렬하는 방법이다.
이러한 방식으로 n번재 인덱스의 문자의 크기를 기준으로 문자열을 오름차순 정렬하면 해결되는 문제이다.

소스 코드

더보기

 

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = {};
        
        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if(o1.charAt(n) != o2.charAt(n))
                    return o1.charAt(n) - o2.charAt(n);
                else
                    return o1.compareTo(o2);
            }
        });

        answer = strings;
        
        return answer;
    }
}

K 번째 수

https://school.programmers.co.kr/learn/courses/30/lessons/42748?language=java

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

문제 그대로 몇 번째부터 몇 번째까지 잘라서 가져온 다음 정렬하고 몇 번째 숫자를 꺼내오면 되는 간단한 문제이다.
나는 잘라서 담을 공간을 만들었는데 유동적인 ArrayList를 사용했고 Collections의 sort를 통해 정렬해주었다.

소스 코드

더보기

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        
        List<Integer> sorted_array = new ArrayList<Integer>();

        for(int i = 0; i < commands.length; i++) {
            for(int j = commands[i][0] - 1; j < commands[i][1]; j++) {
                sorted_array.add(array[j]);
            }

            Collections.sort(sorted_array);
            answer[i] = sorted_array.get(commands[i][2] - 1);

            sorted_array = new ArrayList<Integer>();
        }
        
        return answer;
    }
}

두 개 뽑아서 더하기

https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

완전탐색 방식으로 풀었다. List를 만들고 List에 존재하지 않는 값만 넣어서 정렬하고 끝냈다.
검색해보니 자바에는 HashSet이라는 아주 좋은 자료구조가 있었다.

  • HashSet : 중복이 불가능한 순서 없는 저장 공간(선언 : HashSet<자료형> 이름 = new HashSet<자료형>();)
    set.add(값)으로 데이터를 넣을 수 있고 Iterator를 사용해 값을 탐색한다.

해당 문제에서 HashSet을 사용하여 값을 넣었을 경우, 정렬을 위해 List로 변환하여 정렬해야 한다.

소스 코드

더보기

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = {};
        
        List<Integer> sum_array = new ArrayList<Integer>();

        for(int i = 0; i < numbers.length; i++) {
            for(int j = i + 1; j < numbers.length; j++) {
                if(!sum_array.contains(numbers[i] + numbers[j]))
                    sum_array.add(numbers[i] + numbers[j]);
            }
        }
        
        Collections.sort(sum_array);

        answer = new int[sum_array.size()];

        for(int i = 0; i < sum_array.size(); i++)
            answer[i] = sum_array.get(i);
        
        return answer;
    }
}

가장 가까운 같은 글자

https://school.programmers.co.kr/learn/courses/30/lessons/142086

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

이것 역시 Map을 사용했다. Key가 Character형, Value가 Integer 형인 Map을 만들고 해당 글자가 몇번째 인덱스에 있었는지를 캐싱해주고 갱신해주면서 해결했다.

소스 코드

더보기

 

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        
        Map<Character, Integer> map = new HashMap<Character, Integer>();

        for(int i = 0; i < s.length(); i++) {
            if(!map.containsKey(s.charAt(i))) {
                answer[i] = -1;
                map.put(s.charAt(i), i);
            }
            else {
                answer[i] = i - map.get(s.charAt(i));
                map.put(s.charAt(i), i);
            }
        }
        
        return answer;
    }
}

오늘의 회고💬

비교적 쉬운 난이도의 문제들이었지만 자바랑 어느정도 친해진 것 같아서 나름 목표 달성이라고 생각한다.
이제 매일매일 최소 1문제라도 알고리즘 문제를 꾸준히 풀어줘야겠다.
기업 코딩 테스트는 오늘 푼 문제들보다 훨씬 어려운 난이도가 많으니 난이도도 점진적으로 높여가야겠다.

Comments