프로그래머스 #2 재활 치료
4. 하샤드 수
https://programmers.co.kr/learn/courses/30/lessons/12947
코딩테스트 연습 - 하샤드 수
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하
programmers.co.kr
class Solution {
public boolean solution(int x) {
boolean answer = true;
char[] arr = Integer.toString(x).toCharArray();
int sum = 0;
for(int i=0; i<arr.length; i++){
sum += arr[i]-48;
} // 모든 자릿수의 합을 구하기
if(x%sum!=0) answer=false;
return answer;
}
}
1) int인 x를 String으로 변환(Integer.toString( )) -> char array에 넣음(toCharArray())
2) for문으로 각자리 수의 값을 더함 (char형을 int형으로 형변환 시 아스키 코드 값이 저장되므로 -48을 빼주거나(1의 아스키코드값은 49, 2는 50 ... 이므로) Character.getNumericValue() 함수를 통해 연산될 수 있도록 함
3) x와 sum의 나누기 연산의 결과가 0이 아니라면( 나머지가 있다면 ) answer = false
5. 평균 구하기
https://programmers.co.kr/learn/courses/30/lessons/12944
코딩테스트 연습 - 평균 구하기
정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요. 제한사항 arr은 길이 1 이상, 100 이하인 배열입니다. arr의 원소는 -10,000 이상 10,000 이하인 정수입니다. 입출력 예 arr
programmers.co.kr
class Solution {
public double solution(int[] arr) {
double answer = 0;
int sum = 0;
for(int i=0; i<arr.length; i++) {
sum += arr[i];
}
answer = (double)sum/arr.length;
return answer;
}
}
int와 int 연산의 결과는 int가 나오기 때문에 (소수점 이하 자리는 절삭됨) 두 변수 중 하나라도 doublue로 형변환 해줘야 결과가 제대로 나온다고 배웠었는데 다른 사람의 풀이를 봤을 때 형변환 하신분이 없는 것 같음... 흐으음...
근데 저 형변환을 안하면 통과가 안되던데 뭐지 내가 눈치 못채고 있는 다른게 있는건가
아래는 for each 문을 써보라는 조언을 보고 고쳐본 코드
class Solution {
public double solution(int[] array) {
int sum=0;
for(int i: array){
sum += i;
}
return (double)sum/array.length;
}
}
foreach 문이 정말 편하긴한데 왜 이렇게 머리에 안들어오는지 모르겠다 ㅠㅠ
6. 콜라츠 추측
https://programmers.co.kr/learn/courses/30/lessons/12943
코딩테스트 연습 - 콜라츠 추측
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2
programmers.co.kr
class Solution {
public int solution(int num) {
long target = num;
int count = 0;
while(target != 1) {
if(target%2==0) target /= 2;
else target = target*3+1;
count ++;
if(count>=500) {
count = -1; break;
}
}
return count;
}
}
1) num은 1이상 8,000,000 이하의 수 이므로 홀수일 경우 *3 연산에서 int 범위를 넘어간다 (int형의 범위 -2,147,483,648 ~ 2,147,483,647) -> long 변수로 num을 옮겼다
2) while문으로 제시된 명령을 target이 1이 될 때 까지 반복 + 할때마다 count++ -> count 가 500이 넘을 경우 break로 while문을 빠져나간다
7. 최대공약수와 최소공배수
https://programmers.co.kr/learn/courses/30/lessons/12940
코딩테스트 연습 - 최대공약수와 최소공배수
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의
programmers.co.kr
class Solution {
public int[] solution(int n, int m) {
int divisor = 0;
int a = n<=m ? n : m;
//최대 공약수
for(int i=1; i<=a; i++) {
if(n%i==0 && m%i==0) divisor = i;
}
//최소 공배수
int multiple = (n/divisor) * (m/divisor) * divisor;
int[] answer = {divisor, multiple};
return answer;
}
}
1) 최대 공약수는 두 수 중 작은 수보다 클 수 없으므로 n과 m 중 작은 수를 찾는다 ( int a )
2) a보다 크지 않은 수 중 둘 다 나누어 떨어지게 할 수 있는 가장 큰 값을 찾는다
3) 최대 공약수를 알기 때문에 최소 공배수는 단순 계산으로 구할 수 있다 ( 주어진 두 수를 각각 최대 공약수로 나눈 몫 끼리 곱하고 거기에 최대 공약수를 곱하면 최소 공배수가 나온다 )
4) 배열에 넣고 return