SKSDUD

[👩🏻‍💻코딩테스트👩🏻‍💻] 프로그래머스 LV.1 - 기본 문제 정리(1) 본문

프로그래밍/일일코딩

[👩🏻‍💻코딩테스트👩🏻‍💻] 프로그래머스 LV.1 - 기본 문제 정리(1)

NYinJP 2023. 7. 10. 00:13

푼 문제

💡문자열을 정수로 바꾸기

💡x만큼 간격이 있는 n개의 숫자

💡정수 내림차순으로 배치하기

💡문자열 내 p와 y의 개수

 

 ## LV.1 남은 문제 : 67문제 ##


문제 - 문자열을 정수로 바꾸기

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

제한 조건
s의 길이는 1 이상 5 이하입니다.
s의 맨앞에는 부호(+, -)가 올 수 있습니다.
s는 부호와 숫자로만 이루어져 있습니다.
s는 "0"으로 시작하지 않습니다.

 

나의 풀이

class Solution {
    public int solution(String s) {
        String result = "";
        char [] strChar =s.toCharArray();

        if(strChar[0] =='-' || strChar[0] == '+'){
            for (int j = 1; j < strChar.length; j++) {
                result +=strChar[j];
            }
            result = (strChar[0] == '-') ? '-' + result : result;

        }else{
            for(int i = 0; i<strChar.length;i++){
                result +=strChar[i];
            }
        }
        return Integer.parseInt(result);
    }
}

고민한 점

문자열 맨 앞에 부호가 붙을 수도 있다는 점 때문에

if-else 문을 사용해 경우를 나누었다. 

 

🤤 근데 난 정말 바보였다. 입력값으로 들어온 문자열을 그저 Integer.parseInt() 메서드를 이용해 반환해 주면 된다. 부호 +, - 도 알아서 처리해 준다. 내 코드를 봐도 배열로 만들어서 그 배열을 문자열로 만들어서 그 문자열을 Int로 반환하고 있을 뿐이다. 중간에 배열로 만드는 하지 않아도 될 일을 추가하는 바보 같은 짓을 했다. 으악!

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

이렇게 간단하게 풀린다.


 

문제 - x만큼 간격이 있는 n개의 숫자

함수 solution은 정수 x와 자연수 n을 입력받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해 주세요.

제한 조건
x는 -10000000 이상, 10000000(천만) 이하인 정수입니다.
n은 1000 이하인 자연수입니다.

 

나의 풀이

class Solution {
    public long[] solution(int x, int n) {
        long [] result = new long[n];
        for(int i=1;i<=n;i++){
            result[i-1] = (long)i*x;
        }
        return result;
    }
}

테스트 13, 테스트 14에서 실패를 했다. 이유는 데이터형을 크기를 초과하는 수가 저장되었기 때문이다. 

i와 x 모두 정수형으로 곱한 결과도 int 형 일 것이다.

 

하지만 최악의 경우를 따져보았을 때

x = 10000000

i = 1000의 곱한 결과는 

10_000_000_000으로 int 형 표현범위인 2_147_483_647을 넘게 된다. 

따라서 자로형 범위 오류로 엉뚱한 값이 들어가게 된다.

int 형보다 더 큰 범위를 수용할 수 있는 long 데이터형으로 저장될 수 있도록 캐스팅 연산자(괄호)를 통해 형변환 해줘야 한다. 이 오류 해결의 힌트는 수의 크기를 알려준 제한조건과 long 형 리스트로 반환하라는 것에서 확인할 수 있다. 

 

😂 힌트 보고 알았다. 익숙해지도록 하자.


 

문제 - 정수 내림차순으로 배치하기

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰 것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를 들어 n이 118372면 873211을 리턴하면 됩니다.

제한 조건
n은 1 이상 8_000_000_000 이하인 자연수입니다.

 

나의 풀이

import java.util.*;
class Solution {
    public long solution(long n) {
        String s = n+"";
        char[] sNum = s.toCharArray();
        Arrays.sort(sNum);
        String result = "";
        for(int i = 0;i < sNum.length; i++){
            result +=sNum[sNum.length-1-i];
        }
        return Long.parseLong(result);
    }
}

스트림을 이용하면 쉽게 풀릴 거 같은 문제다.

근데 배움이 부족하여 문제 풀이용으로는 아직이다. 쉬운 문제들로 계속 연습해 봐야겠다.

 

배열 정렬은 Arrays.sort() 메서드를 이용하면 편하다. 안 쓰면 문제 복잡하고 코드 길어진다.

내림차순으로 정렬하는 메서드도 있지만 잘 모르겠어서 반복문과 인덱스를 이용해 거꾸로 출력해 주었다.

 

## 헷갈리는 메서드 반환 값
문자열 배열 = 문자열.split("");
문자 배열 = 문자열.toCharArray();

## 문자열로 만드는 방법
1. String.valueOf(만들고 싶은 값);
2. 만들고 싶은 값 + "";
3. Integer.toString(정수한정);

문제 - 문자열 내 p와 y의 개수

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 "pPoooyY"면 true를 return 하고 "Pyy"라면 false를 return 합니다.

제한사항
문자열 s의 길이 : 50 이하의 자연수
문자열 s는 알파벳으로만 이루어져 있습니다.

 

나의 풀이

import java.util.*;
class Solution {
    boolean solution(String s) {
        s = s.toLowerCase();
        char [] arr = s.toCharArray();
        int check_p =0;
        int check_y = 0;
        for(int i =0;i<arr.length;i++){
            if(arr[i]=='p') check_p++;
            else if(arr[i]=='y') check_y++;
            else continue;
        }
            return (check_p==check_y)?true:false;
            
    }
}

대상 문자열을 모두 소문자로 변환해 주는 toLowerCase()를 이용했다. 반대는 toUpperCase()가 있다.

그다음은 그냥 반복문을 돌면서 p이면 check_p를 증가시키고 y이면 check_y를 증가시켜 주었다. 

삼항연산자 익숙해지니까 아주 편하다. 두 값이 같으면 true를 반환하고 다르면 false를 반환한다.

 

💡 그냥 count 변수를 하나 둬서 p면 +, y면 -를 해 count변숫값이 0이면 true를 반환하는 로직도 있다. 와우!

 

 

 

 

아직 정답률이 높아서 그런가 Lv.1이지만 Lv.0과 비슷한 느낌이다. 쉬운 문제 빨리 끝내고 어려운 문제를 해결해보겠다!