1️⃣ 자릿수 더하기
문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
제한사항
- N의 범위 : 100,000,000 이하의 자연수
입출력 예
N | answer |
123 | 6 |
987 | 24 |
입출력 예 #1
문제의 예시와 같습니다.
입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.
💻 나의 풀이
import java.util.*;
public class Solution {
public int solution(int n) {
int answer = 0;
while (n > 0) {
answer += n % 10; // 1의 자리부터 더하기
n /= 10; // 다음 자릿수로 넘어가게 함
}
return answer;
}
}
2️⃣ 문자열 내 p와 y의 개수
문제 설명
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
제한사항
- 문자열 s의 길이 : 50 이하의 자연수
- 문자열 s는 알파벳으로만 이루어져 있습니다.
입출력 예
s | answer |
"pPoooyY" | true |
"Pyy" | false |
입출력 예 #1
'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.
입출력 예 #2
'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.
💻 나의 풀이
class Solution {
boolean solution(String s) {
boolean answer = true;
s = s.toLowerCase(); // 소문자로 변환
int cntP = 0;
int cntY = 0;
for(int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
if (ch == 'p') cntP++;
if (ch == 'y') cntY++;
}
if(cntP == cntY) {
answer = true;
} else {
answer = false;
}
return answer;
}
}
삼항연산자로 변경한 코드
class Solution {
boolean solution(String s) {
boolean answer = true;
s = s.toLowerCase(); // 소문자로 변환
int cntP = 0;
int cntY = 0;
for(int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
if (ch == 'p') cntP++;
if (ch == 'y') cntY++;
}
answer = (cntP == cntY) ? true : false; // 삼항 연산자
return answer;
}
}
3️⃣ 자연수 뒤집어 배열로 만들기
문제 설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한사항
- n은 10,000,000,000이하인 자연수입니다.
입출력 예
n | return |
12345 | [5,4,3,2,1] |
💻 나의 풀이
class Solution {
public int[] solution(long n) {
String s = String.valueOf(n);
int[] answer = new int[s.length()];
for(int i=0; i < answer.length; i++) {
answer[i] = Integer.parseInt(s.substring(answer.length-1-i, answer.length-i));
}
return answer;
}
}
먼저 String.valueOf() 메소드를 통해 정수를 문자열로 변환해 변수 s에 저장해줍니다.
문자열 s의 길이와 동일한 길이의 int배열 answer를 초기화 해줍니다.
이제 for 반복문을 사용해서 문자열 s의 길이만큼 순회해줄건데, 먼저 substring(beginIndex, endIndex) 메소드를 통해 문자열의 끝에서부터 순서대로 추출하도록 해줍니다.
이 부분을 더 자세히 설명해보겠습니다.
시작 인덱스 (beginIndex): answer.length-1-i
- answer.length: 배열 answer의 길이입니다.
- -1: 배열의 인덱스는 0부터 시작하므로, 마지막 인덱스는 배열의 길이에서 1을 빼야 합니다.
- -i: 반복문에서 i 값이 증가함에 따라 시작 인덱스가 감소합니다. 이는 문자열의 끝에서부터 시작하여 앞쪽으로 이동하는 방향을 의미합니다.
종료 인덱스 (endIndex): answer.length-i
- answer.length: 배열 answer의 길이입니다.
- -i: 반복문에서 i 값이 증가함에 따라 종료 인덱스도 감소합니다.
즉, 반복이 진행됨에 따라 i의 값이 증가하면서 beginIndex는 감소하게 되고, endIndex는 변동없이 동일한 값을 유지합니다. 이러한 과정을 통해 문자열의 마지막 문자부터 순서대로 담을 수 있게 됩니다.
그 후엔 추출된 문자열을 다시 정수로 변환하여 answer 배열에 저장해줍니다.
4️⃣ 정수 제곱근 판별
문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한사항
- n은 1이상, 50000000000000 이하인 양의 정수입니다.
입출력 예
n | return |
121 |
144 |
3 | -1 |
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
💻 나의 풀이
class Solution {
public long solution(long n) {
long answer = 0;
if(Math.floor(Math.sqrt(n)) < Math.sqrt(n)) {
answer = -1;
} else {
answer = (long) Math.pow((long) Math.sqrt(n) + 1, 2);
}
return answer;
}
}
완전 제곱수를 찾는 문제입니다.
먼저, 완전 제곱수란? 어떤 정수를 제곱하여 얻을 수 있는 수를 의미합니다. ( n= m² )
이 문제는 Math 클래스에서 제공하는 몇 가지 메소드를 알아야 풀 수 있습니다.
- static double floor(double a) : 전달된 double형 값의 소수 부분이 존재하면 소수 부분을 무조건 버리고 반환
- static double pow(double base, double exponent) : 전달된 두 개의 double형 값을 가지고 제곱 연산한 값을 반환. base는 밑에 해당하는 숫자. exponent는 지수에 해당하는 숫자. => base 숫자를 exponent만큼 거듭제곱.
- static double sqrt(double a) : 전달된 double형 값의 제곱근 값을 반환
Math.sqrt(n) : 숫자 n의 제곱근을 계산합니다.
Math.floor( Math.sqrt(n) ) : 제곱근의 정수 부분만을 반환합니다.
따라서, Math.floor(Math.sqrt(n))는 n의 제곱근보다 작은 가장 큰 정수 값입니다.
이 정수 값과 Math.sqrt(n)을 비교하여, n이 완전 제곱수인지 확인합니다. 만약 n이 완전 제곱수가 아니라면 (Math.floor(Math.sqrt(n))와 Math.sqrt(n)가 같지 않다면), answer를 -1로 설정합니다.
(else부분) 만약 n이 완전 제곱수라면 answer를 다음 큰 완전 제곱수로 설정합니다.
다음 큰 완전 제곱수는 n의 제곱근에 1을 더한 값의 제곱입니다. 이 값을 Math.pow() 함수를 사용하여 계산하고, 그 결과를 answer에 할당합니다.
Math 클래스의 메소드를 아직 미숙하게 알고 있어서 구글링을 해서 풀었습니다.
이 문제를 기회로 Math클래스의 메소드를 정리해봅니다!
static 타입 메소드명(타입 parameter, ...) | 설명 |
static double random() | 0.0 이상 1.0 미만의 범위에서 임의의 double형 값을 하나 생성하여 반환함. |
static double abs(double a) static double abs(float a) static double abs(int a) static double abs(long a) |
전달된 값이 음수이면 그 값의 절댓값을 반환하며, 전달된 값이 양수이면 인수를 그대로 반환함. |
static double ceil(double a) | 전달된 double형 값의 소수 부분이 존재하면 소수 부분을 무조건 올리고 반환함. |
static double floor(double a) | 전달된 double형 값의 소수 부분이 존재하면 소수 부분을 무조건 버리고 반환함. |
static long round(double a) static int round(float a) |
전달된 값을 소수점 첫째 자리에서 반올림한 정수를 반환함. |
static double rint(double a) | 전달된 double형 값과 가장 가까운 정수값을 double형으로 반환함. |
static double max(double a, double b) static float max(float a, float b) static long max(long a, long b) static int max(int a, int b) |
전달된 두 값을 비교하여 큰 값을 반환함. |
static double min(double a, double b) static float min(float a, float b) static long min(long a, long b) static int min(int a, int b) |
전달된 두 값을 비교하여 작은 값을 반환함. |
static double pow(double base, double exponent) | 전달된 두 개의 double형 값을 가지고 제곱 연산한 값을 반환. base는 밑에 해당하는 숫자. exponent는 지수에 해당하는 숫자. => base 숫자를 exponent만큼 거듭제곱. |
static double sqrt(double a) | 전달된 double형 값의 제곱근 값을 반환함. |
static double sin(double a) static double cos(double a) static double tan(double a) |
전달된 double형 값에 해당하는 각각의 삼각 함숫값을 반환함. |
static double toDegrees(double angrad) | 호도법의 라디안 값을 대략적인 육십분법의 각도 값으로 변환함. |
static double toRaidans(double angdeg) | 육십분법의 각도 값을 대략적인 호도법의 라디안 값으로 변환함. |
🔍 다른 사람의 풀이
class Solution {
public long solution(long n) {
if (Math.pow((int)Math.sqrt(n), 2) == n) {
return (long) Math.pow(Math.sqrt(n) + 1, 2);
}
return -1;
}
}
이 접근법이 훨씬 쉬운 것 같습니다!
5️⃣ 정수 내림차순으로 배치하기
문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
제한사항
- n은 1이상 8000000000 이하인 자연수입니다.
입출력 예
n | return |
118372 |
873211 |
💻 나의 풀이
import java.util.Arrays;
class Solution {
public long solution(long n) {
String[] arr = String.valueOf(n).split("");
Arrays.sort(arr); // 오름차순 정렬
StringBuilder sb = new StringBuilder();
for(String answer : arr) {
sb.append(answer); // 값 하나씩 합치기
}
return Long.parseLong(sb.reverse().toString()); // 반대로 내림차순 정렬
}
}
내림차순을 하려면 오름차순 sort() 메소드 실행 후, StringBuilder의 reverse() 메소드를 통해 역순 정렬을 해주어야 한다는 것을 알아야 한다!
먼저 sort() 메소드는 배열에서 사용 가능하기 때문에 새로운 문자열 배열인 arr을 생성합니다.
그 후, 자연수 n을 String.valueOf()를 통해 문자열로 바꾸고, split() 메소드로 문자 하나씩 분리해주어 arr에 담습니다.
그렇게 분리한 arr을 sort() 메소드를 통해 오름차순 정렬을 해줍니다.
문자를 다시 합치기 위해 StringBuilder sb = new StringBuilder()로 객체를 선언해준 후, for문으로 arr배열을 돌면서 append()를 사용해 하나씩 합칩니다.
이제 reverse() 메서드로 내림차순으로 변경하고, toString() 메서드를 통해 문자열로 변환해줍니다.
반환 값이 long형이기 때문에 Long.parseLong으로 데이터 타입을 변환하여 반환해줍니다.
'프로그래머스 > 1단계' 카테고리의 다른 글
3진법 뒤집기 / 예산 / 이상한 문자 만들기 / 크기가 작은 부분문자열 / 삼총사 (1) | 2024.01.24 |
---|---|
문자열 다루기 기본 / 행렬의 덧셈 / 직사각형 별찍기 / 최대공약수와 최소공배수 / 같은 숫자는 싫어 (0) | 2024.01.22 |
가운데 글자 가져오기 / 수박수박수박수박수박수? / 약수의 개수와 덧셈 / 문자열 내림차순으로 배치하기 / 부족한 금액 계산하기 (0) | 2024.01.20 |
나누어 떨어지는 숫자 배열 / 없는 숫자 더하기 / 핸드폰 번호 가리기 / 제일 작은 수 제거하기 / 내적 (1) | 2024.01.15 |
하샤드 수 / 두 정수 사이의 합 / 콜라츠 추측 / 음양 더하기 / 서울에서 김서방 찾기 (1) | 2024.01.13 |