
프로그래머스 코딩테스트 Lv. 1 Java로 21부터 30까지 풀기 (최신순 정렬 기준)
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
| n | return |
|---|---|
| 121 | 144 |
| 3 | -1 |
Math.sqrt(n)에서 소수점이 나오지 않으면 Math.pow((int)Math.sqrt(n)+1, 2) 출력하도록, 그렇지 않으면 -1 출력하도록 하면 될 것 같음.
Math.sqrt(n)가 double로 출력되니깐 Math.sqrt(n)을 int화 한 후 비교해서 같냐 틀리냐 비교하면 될 듯함.
class Solution {
public long solution(long n) {
double sqrtNum = Math.sqrt(n);
return sqrtNum == (int)sqrtNum ? (long)Math.pow((int)sqrtNum + 1, 2) : -1;
}
}
다른 사람 코드 보니깐 잘 짠거 같음.
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
| arr | return |
|---|---|
| [4,3,2,1] | [4,3,2] |
| [10] | [-1] |
크기가 1인 경우에는 -1을 출력하고 그렇지 않으면 min 값을 구해서 빼내는 걸 짜봐야 겠음.
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
if (arr.length == 1) return new int[] {-1};
int min = Arrays.stream(arr).min().getAsInt();
return Arrays.stream(arr).filter(i -> i != min).toArray();
}
}
극찬 받은 코드와 똑같이 풀긴 했는데.. 솔직히 배열 최솟값이랑 최댓값 구할 때, 자꾸 Arrays.stream(arr).min().getAsInt() 사용하는 게 내 마음에 안듦. 속도도 느리고 뭔가뭔가임.
정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.
| num | return |
|---|---|
| 3 | "Odd" |
| 4 | "Even" |
num을 2로 나눠서 나머지가 0이 나오면 Even으로, 아니면 Odd로 하면 될듯.
class Solution {
public String solution(int num) {
return num % 2 == 0 ? "Even" : "Odd";
}
}
삼항연산자가 간단한 연산에서는 용하게 쓰이는 것 같다.
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
| n | m | return |
|---|---|---|
| 3 | 12 | [3, 12] |
| 2 | 5 | [1, 10] |
우선 최대공약수를 구하고 그 다음에 구해진 값으 최소공배수를 구하면 될 듯.
class Solution {
public int[] solution(int n, int m) {
int gcd = GCD(Math.max(n, m), Math.min(n, m));
return new int[] {gcd, n * m / gcd};
}
public int GCD(int num1, int num2) {
if (num1 % num2 == 0) return num2;
else return GCD(num2, num1 % num2);
}
}
식 중에 공통되는 부분이 있다면 길게 쓰지 말고 변수로 묶어서 정리하
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.
num은 1 이상 8,000,000 미만인 정수입니다.| n | result |
|---|---|
| 6 | 8 |
| 16 | 4 |
| 626331 | -1 |
짝수가 나오면 2로 나누고 홀수가 나오면 3을 곱하고 1을 더하는 if 문 추가하기
count라는 변수를 둬서 총 몇번의 단계를 거쳤는지 카운팅하기
만약 count가 500 이상이 됐을 때도 값이 1이 아니라면 -1 출력하기
class Solution {
public static final int FAIL = -1;
public int solution(long num) {
int count = 0;
while (num != 1) {
if (count >= 500) return FAIL;
if (num % 2 == 0) num /= 2;
else num = (num * 3) + 1;
count++;
}
return count;
}
}
값을 곱하다보면 int의 범위를 넘어가기 때문에 그보다 더 높은 long으로 높여줘야 함.
홀수 짝수 구분하는 if 문은 삼항연산자로 대체 가능함.
num = num % 2 == 0 ? num /= 2 : num * 3 + 1;
정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.
| arr | return |
|---|---|
| [1,2,3,4] | 2.5 |
| [5,5] | 5 |
말 그대로 평균 구하기
class Solution {
public double solution(int[] arr) {
double answer = 0;
for (int i = 0; i < arr.length; i++) {
answer += arr[i];
}
return answer/arr.length;
}
}
stream을 써서 할 순 있긴 한데 속도는 줄어든다고 함.
import java.util.*;
class Solution {
public double solution(int[] arr) {
return Arrays.stream(arr).average().getAsDouble();
}
}
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
x는 1 이상, 10000 이하인 정수입니다.| arr | return |
|---|---|
| 10 | true |
| 12 | true |
| 11 | false |
| 13 | false |
우선 x가 아닌 정수를 하나 선언해서 그 안에 자릿수 합을 저장함.
그리고 나눠서 true랑 false 반환해주면 될듯.
class Solution {
public boolean solution(int x) {
int harshad = x;
int sum = 0;
while (x > 0) {
sum += x % 10;
x /= 10;
}
return harshad % sum == 0 ? true : false;
}
}
변수 2개 더 추가하는게 마음에 걸리긴 했는데 이정도 사용해야 하긴 하는듯. 아니면 너무 가독성 떨어지는 방법밖에 없음.
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
| phone_number | return |
|---|---|
| "01033334444" | "*******4444" |
| "027778888" | "*****8888" |
문자열을 대체하기 보다는 문자열 뒷 4자리를 잘라서 붙이는 방식으로 해야 할 것 같음.
class Solution {
public String solution(String phone_number) {
int length = phone_number.length();
String coverNum = "*".repeat(length - 4);
String showNum = phone_number.substring(length - 4, length);
return coverNum.concat(showNum);
}
}
replaceAll 사용 가능함
return phone_number.replaceAll(".(?=.{4})", "*");
근데 솔직히 다른 사람 코드보다 내가 한게 제일 나아보이긴 함.
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
| arr1 | arr2 | return |
|---|---|---|
| [[1,2],[2,3]] | [[3,4],[5,6]] | [[4,6],[7,9]] |
| [[1],[2]] | [[3],[4]] | [[4],[6]] |
중첩 반복문을 사용하면 쉽게 해결 가능할 듯.
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int[][] answer = new int[arr1.length][arr1[0].length];
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[0].length; j++) {
answer[i][j] = arr1[i][j] + arr2[i][j];
}
}
return answer;
}
}
answer에 arr1을 할당한 후 arr2를 더하는 방법도 존재함.
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
| x | n | answer |
|---|---|---|
| 2 | 5 | [2,4,6,8,10] |
| 4 | 3 | [4,8,12] |
| -4 | 2 | [-4, -8] |
등차 수열에 관한 문제를 저번에 풀었던거 같은데 기억 안나니깐 반복문에 넣어서 해봐야겠음.
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
for (int i = 0; i < n; i++) {
answer[i] += (long)x*(i+1);
}
return answer;
}
}
answer[0]에 값을 넣은 다음에 += 하는 코드가 제일 깔끔한 거 같음.
class Solution {
public static long[] solution(int x, int n) {
long[] answer = new long[n];
answer[0] = x;
for (int i = 1; i < n; i++) {
answer[i] = answer[i - 1] + x;
}
return answer;
}
}
1) 루틴 맞춰보겠다고 하루에 몇개씩 풀기도 했는데 다른 공부하려면 코테는 1일 1문제가 제일 나은 듯.
거기에 백준이랑 SQL에 리팩토링까지니 거의 1일 7~8문제긴 함.