
프로그래머스 코딩테스트 Lv. 1 Java로 11부터 20까지 풀기 (최신순 정렬 기준)
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
| seoul | return |
|---|---|
| ["Jane", "Kim"] | "김서방은 1에 있다" |
배열에서의 Kim의 위치를 찾으면 될 것 같음.
import java.util.*;
class Solution {
public String solution(String[] seoul) {
return "김서방은 " + Arrays.asList(seoul).indexOf("Kim") + "에 있다";
}
}
indexOf(): 배열에서 가장 첫번째에 있는 특정값의 인덱스 출력
문자열이랑 관련된게 나오면 손이 너무 떨린다
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.(1은 소수가 아닙니다.)
| n | result |
|---|---|
| 10 | 4 |
| 5 | 3 |
딱 에라스토테네스의 체와 관련된 문제가 나옴. 그걸로 풀면 될듯.
class Solution {
public boolean[] checkPrime;
public int solution(int n) {
int answer = 0;
is_prime(n);
for (int i = 0; i <= n; i++) {
if (!checkPrime[i]) answer++;
}
return answer;
}
public void is_prime(int num) {
checkPrime = new boolean[num + 1];
if (num < 2) return;
checkPrime[0] = checkPrime[1] = true;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (checkPrime[i] == true) continue;
for (int j = i * i; j < checkPrime.length; j += i) {
checkPrime[j] = true;
}
}
}
}
마침 딱 어제 공부해서 다행이었네.
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
| n | return |
|---|---|
| 3 | "수박수" |
| 4 | "수박수박" |
n/2를 하면 수박의 개수가 나오는데 이 부분에서 홀수라면 수를 하나 더 출력하고, 그렇지 않으면 바로 반환하도록 하면 될 것 같음.
class Solution {
public String solution(int n) {
return n % 2 == 0 ? "수박".repeat(n/2) : "수박".repeat(n/2).concat("수");
}
}
여기와서 다시 보니깐 변수 정리를 해주면 좋았을 듯.
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
Integer.parseInt() 사용해서 바로 반환되도록 하면 될 듯.
class Solution {
public int solution(String s) {
return Integer.parseInt(s);
}
}
알고리즘 ver
class Solution {
public int solution(String s) {
int answer = 0;
char[] arr = s.toCharArray();
boolean plusOrMinus = true;
for (char ch : arr) {
if (ch == '-') {
plusOrMinus = false;
continue;
} else if (ch == '+') continue;
answer = (ch - '0') + answer * 10;
}
return plusOrMinus == true ? answer : answer * -1;
}
}
뭐지.. 난이도 올라가기 전까지 하루 2문제로 늘려야 하나..
알고리즘으로 바꿔서 풀까 생각을 해봤는데 실무에서 알고리즘의 비중은 생각보다 낮다고 해서 차라리 알고리즘에 투자하기 보다 문법이나 함수 사용을 더 익숙하게 하는 편이 나을 거 같음.
그래도 쉬우니깐 풀었음.
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
| s | n | result |
|---|---|---|
| "AB" | 1 | "BC" |
| "z" | 1 | "a" |
| "a B z" | 4 | "e F d" |
아스키 코드를 사용해야 할 듯.
대문자가 65-90, 소문자가 97-122이니깐 이 범위를 넘어가면 다시 맨 앞으로 돌아가는 형태로 구현해주면 될 듯.
class Solution {
public String solution(String s, int n) {
char[] arr = s.toCharArray();
char ch;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == ' ') continue;
if ((arr[i] <= 90 && arr[i] + n > 90) || (arr[i] <= 122 && arr[i] + n > 122)) arr[i] -= 26;
arr[i] += n;
}
return new String(arr);
}
}
처음에 90과 97 사이에 있으면 -26, 122 넘으면 -26하려고 했는데 대문자 상태에서 +8 이상을 해버리니깐 소문자 영역까지 들어가는 문제가 생겨서 &&와 ||를 사용해서 조건을 만들어줬음.
오늘은 하루 더 풀어봐야겠음. 만약에 1레벨이 계속 이 난이도면 더 풀어야 할 것 같음.
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
n은 0 이상 3000이하인 정수입니다.| n | return |
|---|---|
| 12 | 28 |
| 5 | 6 |
말 그대로 약수 구해서 다 더하면 될 거 같음.
대신 Math.sqrt()까지만 반복되도록 해서 시간 복잡도를 낮춰야 겠음.
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 1; i <= Math.sqrt(n); i++) {
if (n % i != 0) continue;
answer += i;
if (n == 1) continue;
if (i == Math.sqrt(n)) continue;
else answer += n/i;
}
return answer;
}
}
n이 숫자가 적어서 그런지 다들 시간 복잡도 생각 안하고 코드 짠 것 같음.
한 문제만 더 풀어야지
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
| s | return |
|---|---|
| "try hello world" | "TrY HeLlO WoRlD" |
우선 단어 단위로 나눈다음에 인덱스가 짝수면 toUpperCase()하면 될 듯.
class Solution {
public String solution(String s) {
String answer = "";
int cnt = 0;
String[] array = s.split("");
for(String str : array) {
cnt = str.contains(" ") ? 0 : cnt + 1;
answer += cnt % 2 == 0 ? str.toLowerCase() : str.toUpperCase();
}
return answer;
}
}
이건 다른 사람 코드 보고 했음.
split(””)을 쓰면 공백 하나하나를 배열에 저장해서 원본 복구시킬 때 같이 복구됨.
오늘 3문제 풀었는데 점점 난이도 올라가는거 보니깐 걍 1문제씩 풀면 건강에 좋을 듯
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
| N | answer |
|---|---|
| 123 | 6 |
| 987 | 24 |
한 자리 씩 %10 해주면서 계산하면 될 듯?
public class Solution {
public int solution(int n) {
int answer = 0;
while (n > 0) {
answer += n % 10;
n /= 10;
}
return answer;
}
}
while에 true 쓰는 거 별로 좋은 선택은 아니라고 하는데 그러면 while을 쓸 이유가 한 1/2은 없어지는디..
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
| n | return |
|---|---|
| 12345 | [5,4,3,2,1] |
우선 자연수를 split 사용해서 배열로 나눠준 다음에 거꾸로 뒤집으면 될 듯.
class Solution {
public int[] solution(long n) {
String[] arr = Long.toString(n).split("");
int length = arr.length;
int[] answer = new int[length];
for (int i = 0; i < length; i++) {
answer[length - i - 1] = Integer.parseInt(arr[i]);
}
return answer;
}
}
StringBuilder에서 reverse를 사용하거나 %10을 사용하는 등 방법은 많은 듯.
확실히 Integer.parseInt 까지 사용하는게 많이 무거워보이긴 했음.
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
n은 1이상 8000000000 이하인 자연수입니다.| n | return |
|---|---|
| 118372 | 873211 |
이번에는 정렬이 필요해서 배열 변환이 꼭 필요할 것 같음.
배열로 변환해서 람다로 대충 내림차순 만들어주면 될 것 같음.
import java.util.*;
class Solution {
public long solution(long n) {
long answer = 0;
String[] arr = Long.toString(n).split("");
Arrays.sort(arr, (e1, e2) -> {
return Integer.parseInt(e2) - Integer.parseInt(e1);
});
return Long.parseLong(String.join("", arr));
}
}
다른 사람들은 StringBuilder 쓰거나 이런 식으로 한 줄로 끝내버림
public int reverseInt(int n){
res = "";
Integer.toString(n).chars().sorted().forEach(c -> res = Character.valueOf((char)c) + res);
return Integer.parseInt(res);
}
1) 문자열 너무 어렵다..
2) 가끔가면 함수 사용하는게 옳은 것인지, 아니면 알고리즘 풀이 능력을 키워야 하는지 잘 모르겠다. stream으로만 푸는 것도 썩 좋아보이진 않는데, 여러가지 풀이법을 작성해야 하나?