문제

표준 입력으로 받은 값을 각각 위 식의 W, R에 넣어 1RM을 출력하는 문제이다. 이는 아래와 같은 조건이 있다.

코드
import java.util.Scanner;
class Main {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int W = scanner.nextInt();
int R = scanner.nextInt();
int RM = (int)(W * (1 + (double)R / 30));
System.out.println(RM);
}
}
풀이
java.util.Scanner에 있는 Scanner 객체를 생성하여 표준 입력을 인자로 준다. 정수이면 nextInt() 메서드를 사용하고, 문자열이라면 nextLine()을 사용한다.
각각 W와 R에 할당 받은 뒤 RM을 구한다. 사실 직관적으로 생각하면 문제에 주어진 수식을 그대로 작성하기만 하면 된다고 생각한다.
RM = W * (1 + R / 30)
그러나 예시 중에 100, 10을 넣었을 때 133이 되는 테스트 케이스가 있다. 이 말은 'R / 30'에서 소수점이 보존된 상태로 연산이 되어야 한다는 이야기이다. 정수끼리 계산하며 소수점을 남기는 방법은 여러 가지가 있지만 가장 간단한 것이 type casting이 있다. 컴파일러는 서로 다른 타입일 때 타입이 갖는 메모리가 더 큰 친구를 선택하게 된다. 컴퓨터는 연산하고 저장할 때 메모리에 저장하게 되는데, 저장된 메모리 중 어디부터 어디까지 해당 데이터인지 알기 위해서 데이터가 갖는 메모리 양을 알고 있어야 한다. W는 100만, R은 100 밖에 되지 않는 범위를 갖고 있으므로 두 변수는 큰 타입을 갖지 않아도 된다. 때문에 int 타입을 할당했다.
100, 10인데 133이 나오려면 'W * (1 + R / 30)'에서 소수점까지 살려서 계산을 해야 한다. 이후 할당할 때 정수로 할당을 하게 되면 소수점을 버리고 변수에 할당 되므로 소수점을 버리는 로직을 구현하지 않아도 된다. 이때 타입 변환을 명시하지 않고 컴파일하면 할당하려는 변수와 수가 서로 타입이 다르다는 오류가 발생한다. 때문에 형변환을 해줘야 하고, int RM = (int)(W * (1 + (double)R / 30)); 이와 같은 형식의 코드가 된다.
'알고리즘' 카테고리의 다른 글
[구름톤 챌린지, JAVA] 1주차 합 계산기 (1) | 2024.02.07 |
---|---|
[구름톤 챌린지, JAVA] 1주차 프로젝트 매니징 (1) | 2024.02.06 |
문제

표준 입력으로 받은 값을 각각 위 식의 W, R에 넣어 1RM을 출력하는 문제이다. 이는 아래와 같은 조건이 있다.

코드
import java.util.Scanner;
class Main {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int W = scanner.nextInt();
int R = scanner.nextInt();
int RM = (int)(W * (1 + (double)R / 30));
System.out.println(RM);
}
}
풀이
java.util.Scanner에 있는 Scanner 객체를 생성하여 표준 입력을 인자로 준다. 정수이면 nextInt() 메서드를 사용하고, 문자열이라면 nextLine()을 사용한다.
각각 W와 R에 할당 받은 뒤 RM을 구한다. 사실 직관적으로 생각하면 문제에 주어진 수식을 그대로 작성하기만 하면 된다고 생각한다.
RM = W * (1 + R / 30)
그러나 예시 중에 100, 10을 넣었을 때 133이 되는 테스트 케이스가 있다. 이 말은 'R / 30'에서 소수점이 보존된 상태로 연산이 되어야 한다는 이야기이다. 정수끼리 계산하며 소수점을 남기는 방법은 여러 가지가 있지만 가장 간단한 것이 type casting이 있다. 컴파일러는 서로 다른 타입일 때 타입이 갖는 메모리가 더 큰 친구를 선택하게 된다. 컴퓨터는 연산하고 저장할 때 메모리에 저장하게 되는데, 저장된 메모리 중 어디부터 어디까지 해당 데이터인지 알기 위해서 데이터가 갖는 메모리 양을 알고 있어야 한다. W는 100만, R은 100 밖에 되지 않는 범위를 갖고 있으므로 두 변수는 큰 타입을 갖지 않아도 된다. 때문에 int 타입을 할당했다.
100, 10인데 133이 나오려면 'W * (1 + R / 30)'에서 소수점까지 살려서 계산을 해야 한다. 이후 할당할 때 정수로 할당을 하게 되면 소수점을 버리고 변수에 할당 되므로 소수점을 버리는 로직을 구현하지 않아도 된다. 이때 타입 변환을 명시하지 않고 컴파일하면 할당하려는 변수와 수가 서로 타입이 다르다는 오류가 발생한다. 때문에 형변환을 해줘야 하고, int RM = (int)(W * (1 + (double)R / 30)); 이와 같은 형식의 코드가 된다.
'알고리즘' 카테고리의 다른 글
[구름톤 챌린지, JAVA] 1주차 합 계산기 (1) | 2024.02.07 |
---|---|
[구름톤 챌린지, JAVA] 1주차 프로젝트 매니징 (1) | 2024.02.06 |