📑 문1) 단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.
제한 사항
입출력 예
s | return |
---|---|
"abcde" | "c" |
"qwer" | we |
나의 풀이
package programmers;
public class MeddleLetter {
public static String solution(String s) {
return (s.length() % 2 == 0) ? s.substring(s.length() / 2 - 1 , s.length() / 2 + 1) :
s.substring(s.length() / 2 ,s.length() / 2 + 1);
}
public static void main(String[] args) {
solution("qwer");
}
}
나의 생각
매개변수로 주어지는 문자s
의 길이를 체킹하여, 나누기 2
즉, 길이가 Odd 또는 Even인지를 판별하여, 홀수이면 가운데 문자를 , 짝수이면 가운데 두 개의 문자를 리턴하는 방법을 사용하였다.
📑 문2) 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
제한 사항
n | return |
---|---|
3 | 수박수 |
4 | 수박수박 |
나의 풀이
package programmers;
public class Watermelon {
public static String solution(int n) {
StringBuilder sb = new StringBuilder();
for(int i = 1; i <= n; i++) {
if(i % 2 == 1) {
sb.append("수");
}else {
sb.append("박");
}
}
return sb.toString();
}
public static void main(String[] args) {
solution(50);
}
}
나의 생각
매개변수로 주어지는 n
을 나누기 2
하여 나온 나머지의 값에 따라(0 또는 1
) 홀, 짝으로 나누어, "수","박"
글자를 더하여 간단하게 해결.
번외
처음에 들었던 생각 중에... 이렇게도 될까 라고 생각한것이... 제한사항으로 주어진 n의 크기 10,000
을 전체 String answer = "수박 X 5,000"
실행하여 subString()
메서드를 쓰면 되지않을까 라고 생각했다가... 이런 하드 코딩이 또 어디 있을까 , 웃으면서 넘겼는데 다른 분의 풀이 중에... 놀랍게도 같은 풀이가 존재했다....
class Solution {
String text ="수박 x 5,000 ...(반복)";
public String solution(int n) {
String answer = text.substring(0, n);
return answer;
}
}
📑 문3) 길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1]
입니다. (n은 a, b의 길이)
제한 사항
입출력 예
a | b | result |
---|---|---|
[1,2,3,4] | [-3,-1,0,2] | 3 |
[-1,0,1] | [1,0,-1] | -2 |
입출력 예 설명
a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3
입니다.
a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2
입니다.
나의 풀이
package programmers;
public class DotProduct {
public static int solution(int[] a, int[] b) {
int answer = 0;
for(int i = 0; i < a.length; i++) {
answer += a[i]*b[i];
}
return answer;
}
public static void main(String[] args) {
int[] a = {1,2,3,4};
int[] b = {-3,-1,0,2};
solution(a, b);
}
}
나의 생각
내적이라는 수학적 표현식은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1]
뭔가 어려워 보이지만, 규칙이 있기때문에 이 규칙성만 찾으면 쉽게 해결할 수 있는 로직이였다. 매개변수로 주어지는 a,b 배열의 크기는 동일하기때문에, 반복문을 통해, answer에 해당 index의 결과를 더해주면 쉽게 해결할 수 있었다.
📑 문4) 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
제한 사항
left
≤ right
≤ 1,000입출력 예
left | right | result |
---|---|---|
13 | 17 | 43 |
24 | 27 | 62 |
입출력 예 설명
입출력 예 #1
수 | 약수 | 약수의 개수 |
---|---|---|
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 |
입출력 예 #2
수 | 약수 | 약수의 개수 |
---|---|---|
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 |
나의 풀이
package programmers;
import java.util.ArrayList;
public class NumberOfFactorsAndAddition {
public static int solution(int left, int right) {
int answer = 0;
int cnt = 0;
ArrayList<Integer> factors = new ArrayList<>();
for(int i = left; i <= right; i++) {
while(cnt <= i) {
cnt++;
if((i % cnt) == 0) {
factors.add(cnt);
}
}
if(factors.size() % 2 == 0) {
answer +=i;
}else {
answer -=i;
}
factors.clear();
cnt = 0;
}
return answer;
}
public static void main(String[] args) {
solution(24, 27);
}
}
나의 생각
나는 List
를 하나 만들어, 반복에서 해당 List
의 size
가 ₩짝수이냐
홀수` 이냐에 따라서, 문제를 해결하였는데, 나와 같이, List에 어떤 약수가 들어 있는지 확인하고 싶은 경우가 아니라면 다음과 같이 문제를 풀 수 있을것 같다.
class Solution {
public int solution(int left, int right) {
int answer = 0;
for(int i = left; i<=right; ++i){
int count = 0;
for(int j=1; j<=i; ++j)
if(i%j == 0)
count++;
if(count % 2 == 0)
answer += i;
else
answer -= i;
}
return answer;
}
}
두 번의 for문 반복으로 i가j와 같을 때
약수를 checking
하여 약수의 갯수를 판별할 수 있다.
제곱수의 활용한 방법
내가 풀이한 방법을 잘 보면, 제곱수인 경우 약수가 홀수개로 존재하는 것을 알 수 있다. 예를들어
24 :
1,2,3,4,6,8,12,24
로 짝수 개의 약수가 존재
25 :1,5,25
로 홀수 개의 약수가 존재
26 :1,2,13,26
로 짝수 개의 약수가 존재
27 :1,3,9,27
로 짝수 개의 약수가 존재
이를 로직화 하면 다음과 같다.
class Solution {
public int solution(int left, int right) {
int answer = 0;
for (int i=left;i<=right;i++) {
//제곱수인 경우 약수의 개수가 홀수
if (i % Math.sqrt(i) == 0) {
answer -= i;
}
//제곱수가 아닌 경우 약수의 개수가 짝수
else {
answer += i;
}
}
return answer;
}
}
📑 문5) 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요. s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
제한 사항
입출력 예
s | return |
---|---|
"Zbcdefg" | ``"gfedcbZ" |
나의 풀이
package programmers;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CharacterDescendingOrder {
public static String solution(String s) {
String[] ch = s.split("");
ArrayList<String> list = new ArrayList<>();
for(String a : ch) {
list.add(a);
}
Collections.sort(list, Comparator.reverseOrder());
String answer = String.join("", list);
System.out.println(answer);
return answer;
}
public static void main(String[] args) {
solution("Zbcdefg");
}
}
나의 생각
정렬 하는 방법에는 여러가지가 존재하지만, 나는Collections
클래스의 sort
메서드를
활용하는 방법을 사용하였다. Collections
클래스의 sort
메서드안에는 오름차순
을 내림차순
으로 변환하는 reverseOrder()
가 존재하기 때문에 쉽게 변환이 가능하다는 이점이 있다. 그리고 String answer = String.join("",list)
를 사용하였는데 String.join()
메서드의 사용법을 보면 다음과 같다.
Sting.join(
구분 문자열
,문자열 시퀸스
)
따라서, list의 모든 요소가 그대로 이어져 하나의 문자열이 된다.
다른 풀이
package programmers;
import java.util.Arrays;
public class CharacterDescendingOrder {
public static String solution(String s) {
char[] ch = s.toCharArray();
Arrays.sort(ch);
StringBuilder sb = new StringBuilder();
sb.append(ch);
return sb.reverse().toString();
}
public static void main(String[] args) {
solution("Zbcdefg");
}
}
나의 설명
매개 변수로 문자열 s를 입력받는데, 입력받은 문자열 s를 문자 배열 ch
로 변환하고, 그 배열을 정렬한다. 그리고 StringBuilder
를 사용하여 문자 배열을 다시 문자열로 변환하고, 이문자열을 역순(오름차순 -> 내림차순)으로 정렬한다.