JAVA로 코딩테스트 Level.1, Level.2 문제 풀기 4주 차
2022년 4월 18일 월요일 / 제일 작은 수 제거하기
문제 설명
- 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
제한 조건
- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
입출력 예
arr | return |
[4,3,2,1] | [4,3,2] |
[10] | [-1] |
문제 풀이 및 주석
package progarmmers;
public class 제일작은수제거하기 {
public static void main(String[] args) {
// 배열
int[] answers = {3}; // 결과 : -1
// int[] answers = {1,2,3,4,5}; // 결과 : 2, 3, 4, 5
// int[] answers = {3, 2, 1, 4, 2}; // 결과 : 3, 2, 4, 2
// 제일 작은 수 제거하기
int[] answer = solution(answers);
// 결과 출력
System.out.print("결과 : ");
for (int i=0; i<answer.length; i++) {
if (i>0) System.out.print(", ");
System.out.print(answer[i]);
}
}
// 제일 작은 수 제거하기
public static int[] solution(int[] arr) {
int[] answer = {};
// 배열이 한 개인 경우 -1 리턴
if(arr.length == 1){
answer = new int[] {-1};
return answer;
}
// 최소값 제거한 배열 정의
answer = new int[arr.length -1];
// 최소값 계산
int min = arr[0];
for(int i = 0; i < arr.length; i++){
if(min > arr[i]) min = arr[i];
}
// 최소값 제거한 배열 구하기
int j = 0;
for(int i = 0; i < arr.length; i++){
if(min == arr[i]) continue;
answer[j] = arr[i];
j++;
}
return answer;
}
}
if문을 사용하여 배열이 한 개일 경우에는 -1을 리턴해주었다. for문을 사용해 최솟값을 구하고 최솟값을 제거한 배열을 구해주었다.
2022년 4월 19일 화요일 / 없는 숫자 더하기
문제 설명
- 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ numbers의 길이 ≤ 9
- 0 ≤ numbers의 모든 원소 ≤ 9
- numbers의 모든 원소는 서로 다릅니다.
입출력 예
numbers | result |
[1,2,3,4,6,7,8,0] | 14 |
[5,8,4,0,6,7,9] | 6 |
입출력 예 설명
입출력 예 #1
- 5, 9가 numbers에 없으므로, 5 + 9 = 14를 return 해야 합니다.
입출력 예 #2
- 1, 2, 3이 numbers에 없으므로, 1 + 2 + 3 = 6을 return 해야 합니다.
문제 풀이 및 주석
package progarmmers;
public class 없는숫자더하기 {
public int solution(int[] numbers) {
// 1에서 9까지 더한 수 = 45
int answer = 45;
// 없는 수 더하기 = 45에서 있는 수를 계속 빼준다
for(int num: numbers) answer -= num;
return answer;
}
}
1~9까지 숫자를 모두 더하면 45가 된다. 거기서 없는 숫자를 더하는 것이니 for문을 사용해 있는 숫자들을 빼주었다.
2022년 4월 20일 수요일 / 약수의 개수와 덧셈
문제 설명
- 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ left ≤ right ≤ 1,000
입출력 예
left | right | result |
13 | 17 | 43 |
24 | 27 | 52 |
입출력 예 설명
입출력 예 #1
- 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
수 | 약수 | 약수의 개수 |
13 | 1, 13 | 2 |
14 | 1, 2, 7, 14 | 4 |
15 | 1, 3, 5, 15 | 4 |
16 | 1, 2, 4, 8, 16 | 5 |
17 | 1, 17 | 2 |
- 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.
입출력 예 #2
- 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
수 | 약수 | 약수의 개수 |
24 | 1, 2, 3, 4, 6, 8, 12, 24 | 8 |
25 | 1, 5, 25 | 3 |
26 | 1, 2, 13, 26 | 4 |
27 | 1, 3, 9, 27 | 4 |
- 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.
문제 풀이 및 주석
package progarmmers;
public class 약수의개수와덧셈 {
public static void main(String[] args) {
int left = 24;
int right = 27;
int result = solution(left, right);
System.out.print("결과 : " + result);
}
public static int solution(int left, int right) {
int answer = 0;
// 제곱수인 경우만 약수의 개수가 홀수임
for (int i=left; i<=right; i++) {
int sqr = (int) Math.sqrt(i);
if (sqr * sqr ==i) // 제곱수이면
answer -= i; // 약수의 개수가 홀수인 경우는 뺀다
else
answer += i; // 약수의 개수가 짝수인 경우는 더한다
}
return answer;
}
}
어떤 수가 제곱수인 경우, 약수의 개수가 홀수이다. 이 점에 착안하여 풀었다.
2022년 4월 21일 목요일 / 서울에서 김서방 찾기
문제 설명
- String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
제한 사항
- seoul은 길이 1 이상, 1000 이하인 배열입니다.
- seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
- "Kim"은 반드시 seoul 안에 포함되어 있습니다.
입출력 예
seoul | return |
["Jane", "Kim"] | "김서방은 1에 있다" |
문제 풀이 및 주석
package progarmmers;
public class 서울에서김서방찾기 {
public static String solution(String[] seoul) {
int answer = -1; // 김서방 위치 초기화
// 김서방 위치 찾기
for (int i=0; i<seoul.length; i++) {
if ("Kim".equals(seoul[i])) {
answer = i;
break;
}
}
return "김서방은 " + answer + "에 있다";
}
public static void main(String[] args) {
String[] seoul = {"Jane", "Kim"};
// 김서방 위치
String answer = solution(seoul);
// 결과 출력
System.out.print(answer);
}
}
김서방은 ~에 있다 라는 문자열에 점 하나라도 생기면 틀리게 떠 프로그래머스가 가혹하다 싶었다.
2022년 4월 22일 금요일 / 전화번호 목록
문제 설명
- 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
- 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
입출력 예제
phone_book | return |
["119", "97674223", "1195524421"] | false |
["123","456","789"] | true |
["12","123","1235","567","88"] | false |
입출력 예 설명
- 입출력 예 #1
앞에서 설명한 예와 같습니다. - 입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다. - 입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
문제 풀이 및 주석
package progarmmers;
import java.util.Arrays;
public class 전화번호목록 {
public static boolean solution(String[] phone_book) {
// 전화번호부 정렬
Arrays.sort(phone_book);
// 정렬된 전화번호부 확인
for (int i=0; i<phone_book.length-1; i++) {
// 다음 전화번호의 접두사이면 false
if (phone_book[i+1].startsWith(phone_book[i])) return false;
}
return true;
}
public static void main(String[] args) {
// String[] phone_book = {"119", "97674223", "1195524421"};
String[] phone_book = {"97674223", "1195524421", "119"};
System.out.println(solution(phone_book));
}
}
첫 level.2 문제였다. 코드를 효율성 있게 짜는 것이 어려웠다.
JAVA로 코딩테스트 Level.1, Level.2 문제 풀기 4주 차 완료!!!
'코딩테스트' 카테고리의 다른 글
[6주차] 코딩테스트 풀이 (2022.05.16~2022.05.20) (0) | 2022.05.21 |
---|---|
[5주차] 코딩테스트 풀이 (2022.05.09~2022.05.13) (0) | 2022.05.15 |
[3주차] 코딩테스트 풀이 (2022.04.11~2022.04.15) (6) | 2022.04.16 |
[2주차] 코딩테스트 풀이 (2022.04.04~2022.04.08) (7) | 2022.04.10 |
[1주차] 코딩테스트 풀이 (2022.03.28~2022.04.01) (1) | 2022.04.03 |