TIL) 프로그래머스 기초 트레이닝 21~22 Day & 입문 트레이닝 5~6 Day

2024. 12. 13. 20:05코딩테스트 리뷰(프로그래머스)/코딩 기초 트레이닝 with Java

프로그래머스 기초 트레이닝

1) 뒤에서 5등 위로

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

import java.util.Arrays;
class Solution {
    public int[] solution(int[] num_list) {
        Arrays.sort(num_list);
        return Arrays.copyOfRange(num_list, 5, num_list.length);
    }
}

 

2) 전국 대회 선발 고사

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public int solution(int[] rank, boolean[] attendance) {
	int result = 0;
        int num = 10000;
        int rank_people = 1;
        int cnt = 0;
        do {
            for( int i = 0; i < rank.length; i++ ) { // 등수를 찾는 반복
                if( rank[i] == rank_people ) { // 1~3 등 일 경우
                    if ( attendance[i] ) {
                        result = result + (i * num);
                        num /= 100;
                        rank_people++;
                        cnt++;
                        break;
                    } else {
                        rank_people++;
                    }
                }
            }

        } while( cnt < 3 );
        return result;
    }
}

 

 

3) 정수 부분

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public int solution(double flo) {
        return (int) flo;
    }
}

 

 

4) 문자열 정수의 합

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

import java.util.Arrays;
class Solution {
    public int solution(String num_str) {
        return Arrays.stream(num_str.split("")).mapToInt(Integer::parseInt).sum();
    }
}

 

풀이 과정

일단 해당 문제에서는 문자열을 준다.

그러면 간단하게 생각을 해보면

모든 문자열을 문자로 나누고 그것을 Int 타입으로 만들어서 더하면 정답이다.

 

1. 문자열을 문자로 나눈다 => num_str.split("");

2. int 타입으로 변환한다. => Arrays.stream([배열]).mapToInt(변환 타입)

3. 더한다 => sum()

 

Stream API를 처음 보는 사람이라면 한줄에 너무 많은 정보가 있을 수 있어 보기 어렵다고 생각할 수 있지만,

사용하다보면 프로그래머스 코딩테스트를 하는 입장에서는 좋으나

Stream API 성능이 별로라고 하니 안쓰는 것이 좋겠으나, 사용방법은 알아두는 것이 좋다고 생각한다.

 

 

5) 문자열을 정수로 변환하기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public int solution(String n_str) {
        return Integer.parseInt(n_str);
    }
}

 

 

6) 0떼기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public String solution(String n_str) {
        int index = 0;
        for( int i = 0; i < n_str.length() -1 ; i++ ) {
            if( n_str.charAt(i) != '0' ) break;
            else if( n_str.charAt(i) == '0' && n_str.charAt(i+1) == '0' ) // 현 위치와 다음 위치가 0일때
                continue;
            else {
                index = i+1;
                break;
            }
        }
        return n_str.substring(index);
    }
}

 

풀이 과정 및 다른 해석

앞에서부터 검사를 하면서 index, index+1 이 0이면

다음 위치까지 검색을 하면서 앞에서 마지막 0 인부분까지 찾은다음

index를 기준으로 substring을 만들어서 리턴하면 정답이라고 생각했다.

 

가장 간단한 방법

더보기

타입을 int값으로 변환한다음 String 값으로 리턴하면 끝난다.

return "" + Integer.parseInt(n_str);

모든 값 앞에 ""을 더하면 String값으로 리턴이 되는 것을 까먹고 있었다.

 

다른 사람의 해석을 보니 기가 막힌 공식을 하나 본 것같은 기분이다.

 

7) 두 수의 합

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

import java.math.BigInteger;
class Solution {
    public String solution(String a, String b) {
        BigInteger num_a = new BigInteger(a);
        BigInteger num_b = new BigInteger(b);
        BigInteger result = new BigInteger("0");

        return String.valueOf(result.add(num_a).add(num_b));
    }
}

 

 

풀이 과정

해당 문제에서 가장 큰 문제는 입출력에 주어지는 값의 크기이다.

간단하게 생각해서 

Interger.parseInt([String값])

라고 생각했는데 범위가 18,446,744,073,709,551,615   1.8천경이다.

 

범위를 집고 가면

int => -2,147,483,648 ~ 2,147,483,647 (약 -21억 ~ 21억)

long => -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,808 ( 약 -900경 ~ 900경 )

 

그래서 해당 문제에서 보면 NumberFormatException 이 생기는 모습을 볼수 있다.

Long.parseLong([String값])

Long 값으로 해도 값이 부족해서 안되는 모습을 볼수 있는데

 

제한이 있는 타입들과 다르게 제한이 없이 사용할 수 있는 변수 타입이 있었다.

 

BigInteger 이라는 타입으로 숫자들을 문자열로 저장을 하고 사용한다고 한다.

그렇기 때문에 BigInteger는 초기화를 할 때 String 값을 받는 모습을 확인 할 수있다.

 

이제 더하는 방법은 add를 사용하여 더 할 수 있다.

 

참조

https://lsmman.tistory.com/47

 

Java에서 큰 수 다루기 (BigInteger)

BigInteger 다루기 들어가기 전, BigInteger Java SE 7 공식문서와 coding-factory에서 참고하여 적은 것임을 밝힙니다. BigInteger를 사용해야 하는 이유 우리가 프로그램을 만들 때 조건에 의해 굉장히 큰 수의

lsmman.tistory.com

 

https://lnsideout.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94-NumberFormatException-%EC%9B%90%EC%9D%B8%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%ED%95%B4%EA%B2%B0

 

[JAVA] 자바 NumberFormatException 원인/예외처리해결

[JAVA] 자바 NumberFormatException 원인/예외처리해결 NumberFormatException 은 프로그램 코딩시 종종 일어나는 오류입니다. 영어 그대로 해석하면 숫자형 포맷 오류 발생입니다. 문자를 숫자로 변경시도하

lnsideout.tistory.com

 

8) 문자열로 변환

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public String solution(int n) {
        return String.valueOf(n);
    }
}

 

 

9) 배열의 원소 삭제하기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

import java.util.*;
class Solution {
    public int[] solution(int[] arr, int[] delete_list) {
        
        List<Integer> arr_copy = new ArrayList<>();
        for( int i = 0; i < arr.length; i++ ) {
            arr_copy.add(arr[i]);
        }

        for( int i = 0; i < delete_list.length; i++) {
            if( arr_copy.contains(delete_list[i])) {
                int temp = arr_copy.indexOf(delete_list[i]);
                arr_copy.remove(temp);
            }
        }
        return arr_copy.stream().mapToInt(i -> i).toArray();
    }
}

 

풀이 과정

정적인 변수 타입으로는 수정 삭제를 하는 방법이 걸리적거린다고 생각했다.

동적인 타입으로 만들어주고 arr_copy를 한다음에

arr_copy 목록에 delete_list[i] 값이 있으면 위치를 찾고 삭제하는 과정을 만들었다.

 

배열에 값이 있는 지 확인 => List.contains(값)

배열에 위치를 가져오기 => List.indexOf(값)

 

그리고 Integer과 int의 타입은 서로 다르다.

Integer는 Object타입이다.

 

참조

https://adjh54.tistory.com/137

 

[Java/Short] 배열/리스트 값 제거 방법 : 요소 첫번째/마지막 값 제거, 특정 값 제거

해당 글에서는 배열의 값들을 앞/뒤의 값을 제거하거나 특정 조건에 따라 제거하는 방법에 대해서 공유합니다. 1) 배열/리스트의 앞뒤 값 비우기 1. 배열의 첫번째 값 비우기 💡 해당 방법에서는

adjh54.tistory.com

https://hianna.tistory.com/539

 

[Java] 문자열에 특정 문자 포함 여부 확인하기 - contains, indexOf, matches

문자열에 특정 문자가 포함되어 있는지 확인 하기 위해서 다음의 3가지 메소드를 사용할 수 있습니다. contains() / java.lang.String indexOf() / java.lang.String matches() / java.lang.String 1. contains() public boolean con

hianna.tistory.com

 

 

프로그래머스 코딩 테스트 입문

1) 옷가게 할인 받기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public int solution(int price) {
        if( price >= 500000 ) return (int) (price * 0.8);
        else if ( price >= 300000 ) return (int) (price * 0.9);
        else if ( price >= 100000 ) return (int) (price * 0.95);
        else return price;
    }
}

 

2) 아이스 아메리카노

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public int[] solution(int money) {
        int[] answer = new int[2];
        answer[0] = money / 5500; //몇잔
        answer[1] = money % 5500; //잔돈
        return answer;
    }
}

 

 

3) 나이 출력

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public int solution(int age) {
        return 2022-age+1;
    }
}

 

 

4) 배열 뒤집기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

import java.util.*;
class Solution {
    public int[] solution(int[] num_list) {
        int[] reverse = new int[num_list.length];
        
        for( int i = 0; i < num_list.length; i++) {
            reverse[i] = num_list[num_list.length - 1 - i];
        }
        
        return reverse;
    }
}

 

다른 방법으로 Array 를 활용해서 Collections.reverse를 사용하는 방법 또한 있다.

 

 

5) 문자열 뒤집기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public String solution(String my_string) {
        StringBuilder sb = new StringBuilder(my_string);
        return sb.reverse().toString();
    }
}

 

풀이 과정

StringBuilder 혹은 StringBuffer 을 사용하면 간단하게 해결할 수 있다.

각 두개의 클래스는 reverse를 지원하기 때문이다.

 

 

6) 직각삼각형 출력하기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        for( int i = 0; i < n; i++ ) {
            for( int j = 0; j <= i; j++ ) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

 

 

7) 짝수 홀수 개수

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public int[] solution(int[] num_list) {
        int[] answer = new int[2];
        for( int num : num_list ) {
            if( num % 2 == 0 ) answer[0]++;
            else answer[1]++;
        }
        return answer;
    }
}

 

 

8) 문자 반복 출력하기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

class Solution {
    public String solution(String my_string, int n) {
        StringBuilder sb = new StringBuilder();
        for( int i = 0; i < my_string.length(); i++ ) {
            for( int j = 0; j < n; j++) {
                sb.append(my_string.charAt(i));
            }
        }
        return sb.toString();
    }
}

 

 

 

느낀 점

하루 2일씩 하고 있는데, 쉬운거지만 남이 해석한 것을 볼 때마다, 모르는 것을 찾을 때마다 부족하다고 느낀다.

열심히 해야겠다.

이제 다음은 프로그래머스 1레벨을 도전해보고, PCCP 도 도전해야봐야겠다.