1️⃣ 배열 자르기
문제 설명
정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 2 ≤ numbers의 길이 ≤ 30
- 0 ≤ numbers의 원소 ≤ 1,000
- 0 ≤num1 < num2 < numbers의 길이
입출력 예
numbers | num1 | num2 | result |
[1,2,3,4,5] | 1 | 3 | [2,3,4] |
[1,3,5] | 1 | 2 | [3,5] |
💻 나의 풀이
class Solution {
public int[] solution(int[] numbers, int num1, int num2) {
int[] answer = new int[num2-num1+1]; // 배열 크기 지정
int k = 0;
for(int i=num1; i<=num2; i++){ // num1부터 num2까지 반복
answer[k++] = numbers[i]; // answer에 해당값들 넣어주기
}
return answer;
}
}
배열의 크기를 어떻게 지정해야하나 고민을 했습니다. num2에서 num1을 뺀 값에 1을 더 하는 것으로 배열 크기를 지정했는데 이게 정확히 맞는건지는 잘 모르겠어요.
그 후엔 반복문을 통해 i를 num1부터 num2까지 반복하면서 해당하는 값들을 배열 answer에 넣어주는 식으로 구현했습니다.
분명히 stream이나 string메서드 또는 arrrays 메서드를 이용한 더 간단한 방법이 있을텐데...일단 모든 게 다 일련의 생각하는 과정이라 생각하며 생각이 나는대로 구현해봤습니다. 0단계를 다 풀고나서 가볍게 다시 한번 더 볼 생각인데 그때는 stream이나 다른 메서드를 최대한 이용해서 간단한 방법으로 구현해보고, 익숙해지게 해야겠다는 생각이 드네요.
🔎 다른 사람의 풀이
import java.util.*;
class Solution {
public int[] solution(int[] numbers, int num1, int num2) {
return Arrays.copyOfRange(numbers, num1, num2 + 1);
}
}
+1을 하는 이유는
범위가 from, to인데 from은 <=, to는 < 이기 때문에 +1을 해줘야 to값까지 범위에 들어간다고 합니다.
(from <= Range < to)
2️⃣ 외계행성의 나이
문제 설명
우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.
제한사항
- age는 자연수입니다.
- age <= 1,000
- PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.
입출력 예
age | result |
23 | "cd" |
51 | "fb" |
100 | "baa" |
💻 나의 풀이
import java.util.HashMap;
class Solution {
public String solution(int age) {
String answer = "";
HashMap<Integer, String> map = new HashMap<>();
map.put(0, "a");
map.put(1, "b");
map.put(2, "c");
map.put(3, "d");
map.put(4, "e");
map.put(5, "f");
map.put(6, "g");
map.put(7, "h");
map.put(8, "i");
map.put(9, "j");
StringBuilder sb = new StringBuilder();
while(age>0){
int alpha = age%10; // 10으로 나눈 나머지는 1의 자리
age /= 10; // 다음 자릿수
sb.append(map.get(alpha)); // 현재 자리의 숫자에 해당하는 알파벳을 sb에 추가
}
answer = sb.reverse().toString(); // 1의 자리부터 나왔으니까 반대로 뒤집은 후 문자열로 변환
return answer;
}
}
나이에 따른 알파벳을 어떻게 지정할지에 대한 고민을 많이 했습니다. 생각보다 시간이 아주 오래 걸림;;
생각나는게 hashmap 밖에 없어서...문제에서 지정된 숫자와 문자를 key-value 형태로 넣어줬습니다. 그런데 일일이 작성하다보니 뭔가 이건 아닌거같은데... 하는 생각이 들더라구요. 분명 더 간단한 방법이 있겠지만 이번에도 역시 최대한 내 능력대로 풀어보고자 했습니다. ( 이건 아닌거같은데...를 무한반복하면서 문제 품😂 )
그 후에는 StringBuilder를 사용하기 위해 sb 변수를 생성했고, age의 각 자리 숫자를 추출하기 위한 while 루프를 시작합니다.각 자리마다 숫자를 구하고, 그 숫자에 해당하는 문자를 구해야 하는데 먼저 1의 자리를 구하기 위해 10으로 나눕니다. 10으로 나눈 나머지가 1의 자리가 되겠지요. 그리고나서 다음 자릿수로 넘어가야 하는데 이 부분도 어떻게 구현해야할지 고민이 됐습니다. 10으로 나눈 나머지가 1의 자리가 된다면 몫은 그 다음 자리의 숫자로 넘어가겠구나 싶었습니다. 예를 들어, age가 123 이라면 123%10 = 3 이니 1의 자리 숫자가 3이 되고, 123/10 = 12 이니 age는 12가 됩니다. 그리고 다시 반복합니다. 12%10 = 2가 되고 12/10 = 1 이 됩니다. 마지막으로 1%10 = 1이 되고 1/10은 0이 되어 루프가 끝납니다.
이런 식으로 반복해서 현재 자리의 숫자에 해당하는 알파벳을 StringBuilder sb 변수에 추가합니다.
마지막으로 1의 자리부터 추출해 저장했으니까 반대로 뒤집어줘야 합니다. sb객체를 reverse()로 뒤집은 후, toString()을 사용해 문자열로 변환하여 반환합니다!
🔎 다른 사람의 풀이
import java.util.stream.Collectors;
class Solution {
public String solution(int age) {
return String.valueOf(age).chars().mapToObj(operand -> String.valueOf((char) (49 + operand))).collect(Collectors.joining());
}
}
이번 문제는 정말 다양한 풀이들이 있어서 흥미로웠는데 그 중 스트림으로 푸는 방식은 참 신기하면서도 아직도 익숙해지지 않습니다..스트림은 도대체 어떻게 써야하는 것인가......
class Solution {
public String solution(int age) {
String answer = "";
String[] alpha = new String[]{"a","b","c","d","e","f","g","h","i","j"};
while(age>0){
answer = alpha[age % 10] + answer;
age /= 10;
}
return answer;
}
}
HashMap에 담지않고 각 숫자에 해당하는 알파벳을 배열로 선언했네요. 이렇게 하면 toString()으로 변환해 반환할 필요도 없습니다.
그리고 answer = alpha[age % 10] + answer; 은 현재 자리의 숫자에 해당하는 알파벳을 배열에서 가져와서 현재까지의 결과 문자열 answer의 앞에 덧붙입니다. 이렇게하면 저의 풀이처럼 굳이 reverse()를 이용하지 않아도 됩니다.
조금만 더 생각해보면 이렇게 더 간단히 풀 수 있지 않았을까 합니다.
class Solution {
public String solution(int age) {
StringBuilder sb = new StringBuilder();
while(age > 0) {
sb.insert(0, (char) ((age % 10) + (int)'a'));
age /= 10;
}
return sb.toString();
}
}
sb.insert(0, (char) ((age % 10) + (int)'a'));
현재 자리의 숫자에 해당하는 소문자 알파벳을 StringBuilder의 insert 메소드를 사용하여 StringBuilder의 가장 앞에 추가합니다. (age % 10) + (int)'a'는 현재 자리의 숫자를 소문자 알파벳으로 변환하는 연산입니다.
3️⃣ 진료 순서 정하기
문제 설명
외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 중복된 원소는 없습니다.
- 1 ≤ emergency의 길이 ≤ 10
- 1 ≤ emergency의 원소 ≤ 100
입출력 예
emergency | result |
[3,76,24] | [3,1,2] |
[1,2,3,4,5,6,7] | [7,6,5,4,3,2,1] |
- emergency가 [3, 76, 24]이므로 응급도의 크기 순서대로 번호를 매긴 [3, 1, 2]를 return합니다.
- emergency가 [1, 2, 3, 4, 5, 6, 7]이므로 응급도의 크기 순서대로 번호를 매긴 [7, 6, 5, 4, 3, 2, 1]를 return합니다.
💻 나의 풀이
class Solution {
public int[] solution(int[] emergency) {
int[] answer = new int[emergency.length];
for(int i=0; i<emergency.length; i++){
for(int j=0; j<emergency.length; j++){ // 배열 크기만큼 순회하면서
if(emergency[i] <= emergency[j]){ // 다른 원소보다 작거나 같으면
answer[i]+=1; // 1을 더해준다.
}
}
}
return answer;
}
}
처음엔 sort를 이용해서 오름차순 정렬한 다음 순위를 매겨볼까...하다가 반복문으로 순회해서 본인보다 작거나 같을 경우에 +1씩 해주는 방식으로 구현했습니다.
🔎 다른 사람의 풀이
import java.util.*;
class Solution {
public int[] solution(int[] emergency) {
int[] answer = new int[emergency.length];
int[] sort = Arrays.copyOf(emergency, emergency.length);
Arrays.sort(sort);
Map<Integer, Integer> rank = new HashMap<Integer, Integer>();
int rankIdx = 1;
for (int idx = sort.length - 1; idx >= 0; idx--) {
rank.put(sort[idx], rankIdx++);
}
for (int idx = 0; idx < emergency.length; idx++) {
answer[idx] = rank.get(emergency[idx]);
}
return answer;
}
}
class Solution {
public int[] solution(int[] emergency) {
int[] answer = new int[emergency.length];
for(int i = 0; i < answer.length; i++){
if(answer[i] != 0){
continue;
}
int idx = 1;
for(int j = 0; j < answer.length; j++){
if(emergency[i] < emergency[j]){
idx++;
}
}
answer[i] = idx;
}
return answer;
}
}
이중for문을 쓰는 것보다 좋아보입니다.
4️⃣ 순서쌍의 개수
문제 설명
순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ n ≤ 1,000,000
입출력 예
n | result |
20 | 6 |
100 | 9 |
💻 나의 풀이
class Solution {
public int solution(int n) {
int answer = 0;
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(i*j == n){
answer++;
}
}
}
return answer;
}
}
처음에는 순서쌍에 들어있는 두 개의 숫자를 곱해서 n이 나오면 카운트를 하는 방식으로 생각했습니다. 그래서 이중for문에 if까지 사용해서 구현을 해봤는데 시간초과가 되더라구요.
class Solution {
public int solution(int n) {
int count = 0;
for (int i = 1; i <= n; i++) {
if(n%i==0) {
count++;
}
}
return count;
}
}
그래서 다시 생각해보는 과정 중에 두 숫자의 곱이 n이라면 결국 n의 약수의 갯수를 구하는게 아닌가 싶었습니다. 그럼 굳이 두 숫자를 곱해서 이러쿵저러쿵 할 필요없이 n을 i로 나눴을 때 나누어 떨어진다면 카운트하면 되겠다! 라는 생각이 들어 최종적으로 이런 코드가 완성됐습니다.
'프로그래머스 > 0단계' 카테고리의 다른 글
DAY10 조건문, 배열, 수학, 시뮬레이션 (0) | 2023.11.26 |
---|---|
DAY9 수학, 문자열, 해시, 완전탐색, 조건문 (1) | 2023.11.25 |
DAY7 문자열, 조건문, 수학, 반복문 (1) | 2023.11.24 |
DAY6 문자열, 반복문, 출력, 배열, 조건문 (1) | 2023.11.23 |
DAY5 수학, 배열 (1) | 2023.11.23 |