입력받은 두 수의 최대공약수와 최소공배수를 구하는 문제이다.
class Solution {
public int[] solution(int n, int m) {
int x = n;
int y = m;
while(y!=0) {
int r = x % y;
x = y;
y = r;
}
int[] answer = {x,n*m/x};
return answer;
}
}
a를 b로 나눈 나머지를 n 이라고 했을 때, a 자리에 b값을, b 자리에 n 값을 넣어 n이 0이 될 때까지 반복한다. n이 0일 때의 b의 값이 a, b의 최대공약수이며, 위 방식처럼 구하는 방법을 유클리드 알고리즘이라 부른다. 이를 통해 최대공약수를 구하고, n과 m의 곱을 최대공약수로 나눔으로써 최소공배수까지 구할 수 있다.
입력받은 정수 n의 3진수 표현을 뒤집었을 때 만들어지는 정수를 출력하는 문제이다.
import java.util.*;
class Solution {
public int solution(int n) {
String sb = new StringBuffer(Integer.toString(n,3)).reverse().toString();
return (Integer.parseInt(sb,3));
}
}
Integer의 toString 메소드와 parseInt 메소드의 두 번째 변수에 입력된 정수는 첫 번째 변수를 두 번째 정수의 진수 표현으로 바꿔준다. reverse 활용을 위해 StringBuffer를 사용했고, 이를 다시 parseInt로 3진수에서 10진수로 변환해 주면 간단히 결과를 출력할 수 있다.
여러 개의 단어로 구성된 문자열을 입력 받아 단어마다 홀수번째 단어는 대문자로, 짝수번째는 소문자로 변형한 문자열을 출력하는 문제이다.
class Solution {
public String solution(String s) {
StringBuilder sb = new StringBuilder();
String[] tmp = s.split(" ",-1);
for(String ss:tmp){
for (int i = 0;i<ss.length();i++){
sb.append(i%2==0?Character.toString(ss.charAt(i)).toUpperCase():Character.toString(ss.charAt(i)).toLowerCase());
}
sb.append(" ");
}
if (sb.length() !=0)
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
}
split에 정수형 변수를 추가함으로써 분할하는 횟수를 지정할 수 있다. 기본값은 0이고, 0일 때는 해당되는 모든 문자열 요소를 제거한다. 정수형 변수가 0보다 작을 때는 해당되는 모든 문자열 요소를 제거하는 것은 동일하나, 가장 뒷 열에 존재해 분리할 요소가 없는 문자열은 그대로 두게 된다. 따라서 -1을 붙이면 문자열의 제일 뒤에 붙는 공백을 살릴 수 있게 된다.
문자열을 공백을 기준으로 분할한 뒤, 각 글자를 규칙에 맞게 변형한 후 더해 주는 것으로 문제를 해결할 수 있다.
입력받은 정수형 배열에서 3개의 수를 더했을 때 0이 되는 가짓수를 반환하는 문제이다.
import java.util.*;
class Solution {
public int solution(int[] number) {
int answer = 0;
for (int i = 0; i<number.length-2;i++){
for (int j = i+1; j<number.length-1;j++){
for (int k = j+1; k<number.length;k++){
if(number[i]+number[j]+number[k] == 0){
answer++;
}
}
}
}
return answer;
}
}
3번의 반복문을 통해 더할 수의 위치를 겹치지 않도록 설정한 후 더했을 때 0이 되는 갯수를 반환한다.
정수로 이루어진 문자열 둘을 입력받은 후, 긴 문자열을 짧은 문자열의 길이에 맞게 자른 부분 문자열이 짧은 문자열 이하의 값을 갖는 부분 문자열 갯수를 구하는 문제이다.
class Solution {
public int solution(String t, String p) {
int answer = 0;
int len = p.length();
for (int i = 0;i<t.length()-len+1;i++){
if (Long.parseLong(t.substring(i,i+len))<=Long.parseLong(p))
answer++;
}
return answer;
}
}
substring을 활용해 부분 문자열을 만들고, 이를 짧은 문자열과 비교하는 방법으로 문제를 해결하였다.
직사각형의 가로, 세로 길이가 저장된 배열의 배열을 통해, 해당 직사각형을 모두 덮을 수 있는 최소 직사각형의 크기를 구하는 문제이다.
import static java.lang.Math.max;
class Solution {
public int solution(int[][] sizes) {
int x = 0;
int y = 0;
for (int[] arr:sizes){
int tmpx = arr[0];
int tmpy = arr[1];
if(max(x,tmpx)*max(y,tmpy)<max(y,tmpx)*max(x,tmpy)){
x=max(x,tmpx);
y=max(y,tmpy);
}
else {
x=max(x,tmpy);
y=max(y,tmpx);
}
}
return x*y;
}
}
반환할 직사각형의 가로, 세로 길이를 저장할 변수를 생성한 다음, 해당 숫자와 입력받은 직사각형의 가로 세로 길이 중 큰 값을 취해 곱한다. 이를 가로, 세로를 서로 꼬아서 동일하게 곱해준 다음, 둘 중 어느 쪽이 작은가를 기준으로 더 작은 직사각형의 가로 세로를 저장한다. 이를 반복하여 최소 직사각형의 넓이를 반환해 주었다.
주어진 문자열을 주어진 정수만큼 밀어낸 문자열을 출력하는 문제이다.
class Solution {
public String solution(String s, int n) {
int aint = (int)'a';
int Aint = (int)'A';
String answer = "";
for(int i = 0; i<s.length();i++) {
int tmp = (int) s.charAt(i);
if (tmp < aint + 26 && tmp >= aint) answer += Character.toString((char) ((tmp + n -aint) % 26 + aint));
else if (tmp < Aint + 26 && tmp >= Aint) answer += Character.toString((char) ((tmp + n-Aint) % 26 + Aint));
else answer += Character.toString(s.charAt(i));
}
return answer;
}
}
입력된 문자열의 각 요소를 아스키코드화한 후, 이를 n과 함께 얼만큼 밀려났는지를 계산한 후, 다시 문자열 형태로 만들어 더해 주었다.