SKSDUD
[👩🏻💻코딩테스트👩🏻💻] 프로그래머스 LV.1 - 기본 문제 정리(2) 본문
푼 문제
자연수 뒤집어 배열로 만들기
음양 더하기
문자열 내 마음대로 정렬하기
문제 - 자연수 뒤집어 배열로 만들기
자연수 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)하기 때문에 문자를 수정할 수 없습니다.
'프로그래밍 > 일일코딩' 카테고리의 다른 글
[👩🏻💻코딩테스트👩🏻💻] 프로그래머스 LV.1 - K번째 수, 두 개 뽑아서 더하기 (0) | 2023.07.11 |
---|---|
[👩🏻💻코딩테스트👩🏻💻] 프로그래머스 LV.1 - 기본 문제 정리(1) (0) | 2023.07.10 |
[👩🏻💻코딩테스트👩🏻💻] 프로그래머스 LV.0 - 외계행성의 나이, 암호 해독, 문자열 정렬하기(1), 배열 자르기, 숫자 찾기, 숨어있는 숫자의 덧셈 (1), 주사위의 개수, 중복된 문자 제거 (1) | 2023.07.08 |
[일일코딩] 카이사르 암호(시저 암호) 복호화 (0) | 2023.02.09 |
[일일코딩][Java] 정수배열 중에서 3개를 뽑아 곱한 것의 최대값 반환하기 (0) | 2023.02.07 |