Open jaeyyyyy opened 1 year ago
두 정수 사이의 합(https://school.programmers.co.kr/learn/courses/30/lessons/12912)
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
제한 조건
a | b | return |
---|---|---|
3 | 5 | 12 |
3 | 3 | 3 |
5 | 3 | 12 |
import java.util.*;
class Solution {
public long solution(int a, int b) {
long answer = 0;
int[] number = {a,b};
Arrays.sort(number);
for(int i = number[0]; i <= number[1]; i++){
answer += i;
}
return answer;
}
}
arrays.sort를 왜 썼을까요..저도 모르겠습니다. 순서대로 정렬해야된다는 생각에 그만... 다양한 수를 정렬해야한다면 모를까 두 개 밖에 안되는데 if(a<b) 로 조건을 거는게 더 보기편했을거라는 생각이 듭니다..
간단한 문제인데 기록한 이유는 다른 사람의 코드를 보다가 for 문 안에 삼항연산자를 넣은 경우도 있어서이다. 정리해두면 도움이 될 것 같다.
10월 29일 / 문제 3 에서 for 문의 조건문에 i에 대한 조건문이 아닌 다른 조건문을 넣을 수도 있다는 점을 기록했다. 10월 29일 / 문제 1 에서 배열 선언 시, 배열의 길이에 삼항연산자를 넣을 수 있다는 점을 기록했다.
두 가지를 합친 느낌이다. 삼항연산자는 생각보다 훨씬 다양한 곳에서 이용 가능하고, for문도 다양하게 표현 가능하다는 것을 알게 됐다.
class Solution {
public long solution(int a, int b) {
long answer = 0;
for (int i = ((a < b) ? a : b); i <= ((a < b) ? b : a); i++)
// 'a<b'가 참이면 i=a, 거짓이면 i=b, 'a<b'가 참이면 i<=b, 거짓이면 i<=a
answer += i;
return answer;
}
}
아래처럼 for 문안에 메서드를 사용할 수도 있다.
class Solution {
public long solution(int a, int b) {
long answer = 0;
for (int i = Math.min(a, b) ; i <= Math.max(a, b); i++) {
answer += i;
}
return answer;
}
}
1-1. 입력된 수가 짝수라면 2로 나눕니다. 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
- 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.
n | result |
---|---|
6 | 8 |
16 | 4 |
626331 | -1 |
입출력 예 1
입출력 예 2
입출력 예 3
while(i<500)인 동안 주어진 수가 1일 때, 짝수일 때, 홀수일 때를 조건문으로 나누어 작성하면 된다.
class Solution {
public int solution(int num) {
int i = 0;
while (i < 500) {
if(num == 1){ // 주어진 수가 1이 되면
return i;
} else if(num % 2 == 0) { // 주어진 수가 짝수면
num /= 2;
} else {
num = (num * 3) + 1; // 주어진 수가 홀수면
}
i++;
}
return -1;
}
}
이렇게 작성하면 되는데 테스트 케이스 3번은 틀리게 된다. 왜 그럴까? 테스트 3번은 626331를 num값으로 준다. 626331은 계산과정에서 500번을 시도해도 1이 되지 못하고 int의 범위를 넘기게 된다. (※ int의 범위는 -2,147,483,648 부터 2,147,483,647 까지이다.)
이 문제를 해결하려면
새로운 변수를 선언하고 num 값을 넣어주어야 한다. (long a = num;)
class Solution {
public int solution(int num) {
long num2 = num;
int i = 0;
while (i < 500) {
if(num2 == 1){ // 주어진 수가 1이 되면
return i;
} else if(num2 % 2 == 0) { // 주어진 수가 짝수면
num2 /= 2;
} else {
num2 = (num2 * 3) + 1; // 주어진 수가 홀수면
}
i++;
}
return -1;
}
}
## 회고
int와 long 의 최대값, 최소값에 대해 잘 알고 있어야 풀리는 문제였다. 문제를 풀다보면 int 범위를 벗어나는 값을 많이 만나게 될 것 같다. 그때마다 자료형에 유의하며 문제를 풀어야겠다.
문제 1
문제
x
가 하샤드 수이려면x
의 자릿수의 합으로x
가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수x
를 입력받아x
가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.x
는 1 이상, 10000 이하인 정수입니다.입출력 예
입출력 예 1
입출력 예 2
입출력 예 3
입출력 예 4
문제 풀이
자릿수 구하는 방법은 보통 두 가지로 나뉜다. 하나는 문자열로 바꿔서 구하는 방법이고, 나는.. 형 변환하기 싫어서 아래처럼 했다.
숫자를 반복해서 10으로 나눠가면서, 10으로 나머지 연산을 하면 일의 자리를 얻어낼 수 있다. 문제 푸는 데 쓰일 일이 많은데 잘.. 안 외워짐.
회고
문자열로 바꾸는 방법으로도 풀어봤다.