SKSDUD
[👩🏻💻코딩테스트👩🏻💻] 프로그래머스 LV.0 - 외계행성의 나이, 암호 해독, 문자열 정렬하기(1), 배열 자르기, 숫자 찾기, 숨어있는 숫자의 덧셈 (1), 주사위의 개수, 중복된 문자 제거 본문
[👩🏻💻코딩테스트👩🏻💻] 프로그래머스 LV.0 - 외계행성의 나이, 암호 해독, 문자열 정렬하기(1), 배열 자르기, 숫자 찾기, 숨어있는 숫자의 덧셈 (1), 주사위의 개수, 중복된 문자 제거
NYinJP 2023. 7. 8. 22:101. 문제 - 외계행성의 나이
우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return 하도록 solution 함수를 완성해 주세요.
제한사항
age <= 1,000
정수형 나이를 알파벳으로 바꾸어 말해야 한다.
0~ 9까지의 수를 a ~ j의 소문자 알파벳으로 매칭하면 된다.
나의 풀이
class Solution {
public String solution(int age) {
char[] alpha = {'a','b','c','d','e','f','g','h','i','j'};
String strAge = age+"";
char[] strChar = strAge.toCharArray();
String result = "";
for(int i=0;i<strAge.length(); i++){
int index = strChar[i] -'0';
result += alpha[index];
}
return result;
}
}
a부터 j까지 문자를 저장할 문자배열을 만든다.
정수형 age를 각 자릿수 값 자체를 저장하기 위해(예 235이면 2와 3과 5를 각각 불러오기 위해서)
String ➡️ char 배열로 만들었다.
알파벳 문자배열 값에 접근할 때 age의 각 값을 인덱스로 하여 값을 조회한다.
- Char to Int :
- 문자 '0'을 뺀다. (정수 48을 뺀다)
- int n = Character.getNumericValue(c);
2. 문제 - 암호 해독
군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.
암호화된 문자열 cipher를 주고받습니다.
그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.
문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return 하도록 solution 함수를 완성해 주세요.
나의 풀이
class Solution {
public String solution(String cipher, int code) {
String [] cipherArr = cipher.split("");
String result = "";
int i=1;
while (i*code <= cipherArr.length){
result += cipherArr[i*code -1];
i++;
}
return result;
}
}
- split() 함수는 입력받은 정규표현식 또는 특정 문자를 기준으로 문자열을 나누어 배열에 저장하여 리턴한다.
- while 문에 관하여
- while 문 밖의 초기값
- while 문 괄호 안의 조건식
- while 문 안의 실행문, 증가식
- 조건식 인덱스에 관하여
- i*code -1 이 마지막 배열의 인덱스라면 이 값은 배열길이 -1 (배열 인덱스의 마지막값)과 같거나 작아야 한다.
- 크다면 while 문을 벗어나야 한다.
1. i*code -1 <=cipher.length -1
2. i*code <=cipher.length
배열 마지막값을 가리키는 인덱스는 배열 길이 -1 인 것을 기억해라!
3. 문제 - 문자열 정렬하기 (1)
문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해 보세요.
나의 풀이
import java.util.*;
class Solution {
public int[] solution(String my_string) {
ArrayList <Integer> str = new ArrayList<>();
for(int i=0 ; i < my_string.length() ; i++){
if('0'<=my_string.charAt(i) && my_string.charAt(i)<='9'){
str.add(my_string.charAt(i)-'0');
}
}
int[] arr = str.stream().mapToInt(Integer::intValue).sorted().toArray();
return arr;
}
}
ArrayList 선언
반복문을 이용해 my_string 문자열에 문자 하나씩 접근하면서
만약 숫자라면
ArrayList에 추가합니다.
return이 int형 배열이기 때문에
스트림을 이용해 정렬하고 배열로 변환해 줍니다.
- replaceAll 함수
String my_string = "p2o4i8gj2";
my_string = my_string.replaceAll("[a-z|A-Z]","");
System.out.println(my_string);
// 결과
// 2482
replaceAll 메서드를 쓰면 배열로도 정말 간단하게 풀 수 있다. 위의 정규표현식 의미는
[x-z]
|
range를 표현하며 x ~ z 사이의 문자를 의미한다. |
x|y
|
or 를 표현하며 x 또는 y 문자가 존재함을 의미한다. |
- 스트림 인스턴스 생성 방법
- 배열 : Arrays.stream() 메서드 이용
- 컬렉션의 경우(Collection, List, Set) 인터페이스에 추가된 디폴트 메서드인. stream() 이용
4. 문제 - 배열 자르기
정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해 보세요.
정수형 배열 numbers에서 num1 인덱스부터 num2 인덱스까지 자른 정수형 배열을 return 하세요
나의 풀이
import java.util.*;
class Solution {
public int[] solution(int[] numbers, int num1, int num2) {
ArrayList<Integer> result = new ArrayList<Integer>();
for(int i = num1;i<=num2;i++){
result.add(numbers[i]);
}
return result.stream().mapToInt(Integer::intValue).toArray();
}
}
ArrayList로 인덱스 값들을 add 해준 다음에 다시 int 형 배열로 만들어서 반환하였다.
Arrays.copyOfRage() 메서드를 쓰면 아주 간단해진다...
5. 문제 - 숫자 찾기
정수 num과 k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return 하고 없으면 -1을 return 하도록 solution 함수를 완성해 보세요.
제한사항 : num에 k가 여러 개 있으면 가장 처음 나타나는 자리를 return 합니다.
나의 풀이
class Solution {
public int solution(int num, int k) {
int result=0;
char [] numChar = String.valueOf(num).toCharArray();
for (int i = 0; i < numChar.length; i++) {
if(numChar[i] -'0' == k){
result = i+1;
break;
} result = -1;
}
return result;
}
}
break는 반복문을 빠져나갈 때 쓰는 명령어이다.
제한 사항에서 k값이 여러 개 있을 때 가장 처음 나타나는 자리를 return 하라고 하였기 때문에
break 문으로 바로 반복문을 빠져나가도록 하였다.
Char To Int 공식을 하나 알아서(문자 0 빼기) 쓰다 보니까 계속 쓰게 된다... ㅋㅋㅋ
6. 문제 - 숨어있는 숫자의 덧셈 (1)
문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return 하도록 solution 함수를 완성해 주세요. 문자열 입력값은 대문자, 소문자, 그리고 한자리 자연수로만 이루어져 있습니다.
나의 풀이
class Solution {
public int solution(String my_string) {
my_string = my_string.replaceAll("[a-z|A-Z]","");
char [] strChar = my_string.toCharArray();
int result = 0;
for (int i = 0; i < strChar.length; i++) {
result += strChar[i] -'0';
}
return result;
}
}
정규표현식을 이용해 영문자를 모두 찾아서 ""으로 바꿔 정수만 남긴다.
숫자 다 더하기
6-2. 문제 - 숨어있는 숫자의 덧셈 (2)
문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어 있습니다. my_string안의 자연수들의 합을 return 하도록 solution 함수를 완성해 주세요.
연속된 수는 하나의 숫자로 간주합니다. 0이 연속되는 경우는 없으며 문자열에 자연수가 없는 경우는 0을 return 합니다.
나의 풀이
아직 못 풀었음..!
7. 문제 - 주사위의 개수
머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어 있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해 주세요.
들어갈 수 있는 주사위의 개수
수학문제??
나의 풀이
class Solution {
public int solution(int[] box, int n) {
int x = box[0]/n;
int y = box[1]/n;
int z = box[2]/n;
return x*y*z;
}
}
/ 몫
% 나머지
8. 문제 - 중복된 문자 제거
문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return 하도록 solution 함수를 완성해 주세요. 공백도 하나의 문자로 구분하며 중복된 문자 중 가장 앞에 있는 문자를 남깁니다.
나의 풀이
import java.util.*;
class Solution {
public String solution(String my_string) {
HashMap<Integer, String> str = new HashMap<>();
int index =0;
for (int i = 0; i < my_string.length(); i++) {
if(str.containsValue(my_string.charAt(i)+"")) continue;
str.put(index, my_string.charAt(i)+""); index++;
}
System.out.println(str);
String result = "";
for(int i = 0; i < str.size(); i++){
result += str.get(i);
}
return result;
}
}
풀면 OK 라지만 다른 사람의 풀이를 보니 위의 코드는 부족한 점이 많다.
다른 사람들의 풀이는 스트림을
혹은 문자열 처리를 간단하게 하여 문제를 해결했다.
HashMap까지 이용해서 푼 사람은 없는 듯...
HashMap을 사용한 이유
중복된 문자를 제거에 꽂혔기 때문이다.
입력 문자열을 처리하여 출력하는 것보다
다른 컬렉션을 생성해서 해당하는 값들을 저장하고 최종적으로 출력하는 방식이 익숙한 이유도 있다.
스트림 이용한 풀이
class Solution {
public String solution(String myString) {
return Arrays.stream(myString.split("")).distinct().collect(Collectors.joining());
}
}
distinct() 메소드는 스트림에서 중복되는 요소들을 모두 제거해주고 새로운 스트림을 반환합니다.
Collectors.joining() 메서드는 Collector 입력 요소를 단일 문자열로 연결합니다.
'프로그래밍 > 일일코딩' 카테고리의 다른 글
[👩🏻💻코딩테스트👩🏻💻] 프로그래머스 LV.1 - 기본 문제 정리(2) (0) | 2023.07.11 |
---|---|
[👩🏻💻코딩테스트👩🏻💻] 프로그래머스 LV.1 - 기본 문제 정리(1) (0) | 2023.07.10 |
[일일코딩] 카이사르 암호(시저 암호) 복호화 (0) | 2023.02.09 |
[일일코딩][Java] 정수배열 중에서 3개를 뽑아 곱한 것의 최대값 반환하기 (0) | 2023.02.07 |
[일일코딩][Java] 연속 구간을 반복한 수와 문자로 조합하기 (0) | 2023.02.06 |