SKSDUD

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

프로그래밍/일일코딩

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

NYinJP 2023. 7. 11. 16:19

푼 문제

자연수 뒤집어 배열로 만들기

음양 더하기

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

 

 

 

 

 

 

 

문제 - 자연수 뒤집어 배열로 만들기

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

제한 조건
n은 10,000,000,000이하인 자연수입니다.

 

나의 풀이

import java.util.*;
class Solution {
    public int[] solution(long n) {
        String str = n+"";
        char[] strArr = str.toCharArray();

        String result = "";
        for(int i=0;i<strArr.length;i++){
            result+=strArr[strArr.length-1-i];
        }
        int [] resultArr = new int[strArr.length];
        for(int i = 0; i < strArr.length; i++){
            resultArr[i] = Integer.parseInt(result.charAt(i));
        }
        return resultArr;
        
    }
}

정말 구린 코드...

StringBuilder의 reverse 메서드

Long.toString();

 

난 무엇을 몰라서 어렵게 푼 것인가?

분석하기!


Math.max(a,b)

Math.min(a,b)

 

Integer.parseInt(String s)

 

long 형 생각할 것!!!!!!!!!!!!!!!!!

아예 입력값을 long으로 다시 선언할 수도 있다!

.equals() 

ㅇㅇ


문제 - 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

 

나의 풀이

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int[] result = new int[absolutes.length];
        for(int i=0;i<absolutes.length;i++){
            
            String sign = "";
            
            if(signs[i]) sign+="+";
            else sign+="-";
            result[i] = Integer.parseInt(sign+absolutes[i]);    
        }
        int sum =0;
        for(int i=0;i<result.length;i++){
            sum+=result[i];
        }
        return sum;
        
    }
}

좋지 않은 코드이다. 가독성도 떨어지고 쓸데없는 연산이 많은 느낌이다. 실행 시간도 평균 19.19ms 정도가 나왔다. 

        int answer = 0;
        for (int i=0; i<signs.length; i++)
            answer += absolutes[i] * (signs[i]? 1: -1);
        return answer;

다른 사람의 풀이에서 엄청 좋은 코드를 발견했다. 실행 시간도 0.n ms 대로 매우 빨라졌으며 코드도 간단하며 가독성도 뛰어나다. 중간에 삼항 연산자로 양수면 1 음수면 -1을 곱해주는 것으로 문제를 단순화 했다.

단순화와 추상화 개발자의 아주 중요한 능력임을 느꼈다.


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

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

모르겠어서 잘 푼 코드를 참고하였다... 😂

 


📝 substring 메서드에 관하여

문제를 풀다보니까 String 클래스의 substring() 메서드가 많이 사용된다고 느꼈다. 잘 써보지 않은 메서드라 정리해보겠다.

위 메서드는 문자열을 원하는 위치에서 자르고 싶을 때 사용한다.

substirng 클래스는 두가지로 오버로딩 되는데 

# 오버로딩(Overloading) : 과적하다. 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라고 매개변수의 개수 또는 타입이 다르다면 같은 이름을 사용해서 메서드를 정의할 수 있다.   

  • 매개변수가 정수형 하나인 경우
  • 매개변수가 정수형 두개가 들어오는 경우

이렇게 나뉜다.

 

1. String substring(int index)

입력받은 index 값을 포함한 이후 문자열을 잘라 리턴한다.

2. String substring(int begin, int end)

시작 인덱스와 끝 인덱스를 입력받아 시작 인덱스를 포함한 끝 인덱스의 이전까지 잘라 리턴한다.

public class main {
    public static void main(String[] args){
        String s = "안녕하세요안녕하세요~";
        String s1 = s.substring(5);
        String s2 = s.substring(5,10);
        System.out.print(s1+"\n"+s2);
    }
}

## 실행 결과
안녕하세요~
안녕하세요

안 녕 하 세 요 안 녕 하 세 요  ~
0  1  2  3  4  5  6  7  8  9  10

 

문자열의 인덱스도 배열과 똑같다. 0부터 시작하는데 매개변수로 들어오는 값은 바로 이 인덱스이다. 주의할 점은 끝 인덱스의 이전까지 리턴한다는 점이다.

 

문자열 s 에서 10번 인덱스는 '~' 값으로 substring 메서드에서 그 이전 번호까지 잘라 반환하므로 5번 인덱스부터 9번 인덱스까지인 "안녕하세요"를 반환하였다.

주의 : 만약 index 범위를 넘어서는 값을 end 인덱스로 두면 오류가 난다.(매개변수가 하나인 메서드에서는 오류 안남)

> Task :main.main() FAILED
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 5, end 12, length 11

 

기타 String 클래스 메서드 

startsWith()

endsWith()

도 유용하게 쓰일거같다.

## 풀이 1
class Solution {
    public int solution(String my_string, String is_suffix) {
        int checkNum = my_string.length()-is_suffix.length();
        if(checkNum<0) return 0;
        String check1 = my_string.substring(checkNum);
        return (check1.equals(is_suffix))?1:0;
        
    }
}

## 풀이 2
class Solution {
    public int solution(String my_string, String is_suffix) {
        if(my_string.endsWith(is_suffix)) {
            return 1;
        } else {
            return 0;
        }
    }
}

삼항 연산자로 바꾸면 더더 간단하게 풀린다.

애초에 이런 메서드를 사용하라고 낸 문제같기도 하다.

기억해둘것!

 

자바는 String 값을 변경할 수 없다. 

String은 불변(immutable)하기 때문에 문자를 수정할 수 없습니다.