슬슬 수학적으로 풀어야 할것 같은 느낌이 든다? 아니면 인강을 봐서 속도를 더 올려야 할것 같다.
문제를 먼저 정확히 파악
%를 사용해서 약수를 찾아서 K의 값을 잘 저장해둬서 표현
나의 문제풀이 방식 및 순서
* 나의 다양한 학습이 우선이기 때문에 다양한 방법을 생각 *
3. 소스 인증
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int count = 0;
int kIndexValue = 0;
for (int i = 1; i<= N; i++){
if(N % i == 0){
count++;
if(count == K){
kIndexValue = i;
break;
}
}
}
System.out.println(kIndexValue);
}
}
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if (a == 0 && b ==0 ){
break;
} else if ( a>b && a%b==0){
System.out.println("multiple");
} else if ( a<b && b%a==0){
System.out.println("factor");
} else {
System.out.println("neither");
}
}
}
}
- 나한테 있어서는 문제를 저렇게 수학적으로 파악하기가 너무 어렵다. (이런 문제의 규칙성 및 푸는 방법에 대해서 공유해주시면 감사하겠습니다ㅜ)
문제를 먼저 정확히 파악
목적지 전날까지 일수 계산하는 방법과 최종 목적지를 기준으로 일수 계산하는 방법이 있다.
목적지 전날까지 기준 (정상에 도달하기 전까지 걸리는 일수 계산을 목표)
예시 length 10 up 5 down 2 (높이-up)÷ (up-down) (10-5) ÷ (5-2) 로 하면 올림하여 2일
최종 목적지를 기준 (정상에 도달한 후에 내려오는 일수를 계산하는데 사용)
예시 length 10 up 5 down 2 (높이-down) ÷ (up-down) (10-2) ÷ (5-2) 로 하면 올림하여 3일
나의 문제풀이 방식 및 순서
* 다양한 학습이 우선이기 때문에 다양한 방법을 생각 *
정상에 오르기 전날까지의 날까지 계산을 한다. (v-a) : 달팽이가 정상에 도달하기 전까지 남은 높이 (a-b) : 하루에 올라가는 높이
잘 생각해보면 (하루에 올라가는 높이) 를 총 길이가 아니라 v-a로 해줘야 전날까지 남은 일수가 나온다.
아래의 소스코드를 이해하는데 1시간 이상이 소요됐다..어휴 이유는 예시 5 2 10을 그려보면 이해가 쉽다. int days = (10-5) / (5-2) => 1이 대입이 된다. (기대 값은 2였는데..) 그래서 days++를 해준다.
그리고 마지막에 +1을 해서 마지막 정상까지 올라간다!!!
int days = (v-a) / (a-b);
if((v - a) % (a-b) != 0){
days++;
}
System.out.println(days+1);
실패
아래의 방법으로 풀어보려고 시도함 (총길이 ÷ (Up -Down) ) : 이유는 하루에 올라갈 수 있는 높이이고 총길이 나누면 몫이 Day 겠지!!? 응 아니야..
예시 2 1 5
up : 2 down : 1 length : 5 이면 5 ÷ (2-1) = 5 (4일이 소요됌)
예시 5 1 6
up : 5 down : 1 length : 6 이면 6 ÷ (5-1) = 1 (2일이 소요됌)
예시 100 99 1000000000
1000000000 ÷ 1 = 999999901 읭???????
10 8 2
10 ÷ ( 8-7 ) = 10 일은 절때 아니잖아.. ?? 이게 뭐지 ??
3. 소스 인증
▶ 방법 1
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
//(v-a) : 달팽이가 정상에 도달하기 전까지 남은 높이
//(a-b) : 하루에 올라가는 높이
int days = (v-a) / (a-b); // 달팽이가 정상에 오르기 전날까지의 날
if((v - a) % (a-b) != 0) // 달팽이가 하루에 오르는 높이보다 정상까지의 높이가 짧을때
days++;
System.out.println(days+1); // 마지막날 오른 기록은 계산식에 포함되어있지 않으므로 출력에 1일을 더해준다.
}
}
▶방법 2
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
long up = Long.parseLong(st.nextToken());
long down = Long.parseLong(st.nextToken());
long length = Long.parseLong(st.nextToken());
long day = up-down;
long goal = length-down; //최종목적지
if(goal%day == 0){
System.out.print( (goal/day) ); //낮에 도착
} else {
System.out.print( (goal/day) + 1 ); //하루를 더 가야한다.
}
}
}
Math.pow(6,i) 를 사용하고자 하였다. 하지만 속도의 이슈가 있었다. 단순히 사칙연산으로도 풀 수 있는 문제였고, 이전 문제의 수학함수를 사용해서 풀어보고 싶었다.
3. 소스 인증
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int nRoom = 1;
if (N == 1){
System.out.println(nRoom);
return;
}
int rangeStart = 2;
int rangeEnd = 7;
while(true){
nRoom++;
if ( N >= rangeStart && N <= rangeEnd ){
System.out.println(nRoom);
break;
}
rangeStart = rangeEnd + 1;
rangeEnd = rangeEnd + (6 * nRoom);
}
}
}
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int inputCnt = Integer.parseInt(br.readLine());
StringBuilder st = new StringBuilder();
int [] intAry = {25,10,5,1};
while(inputCnt > 0){
int inputLine = Integer.parseInt(br.readLine());
for(int i = 0; i < 4; i++){
int count = inputLine / intAry[i];
st.append(count);
st.append(" ");
inputLine = (inputLine % intAry[i]);
}
st.append("\n");
inputCnt--;
}
System.out.println(st);
}
}
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int inputCnt = Integer.parseInt(br.readLine());
StringBuilder st = new StringBuilder();
int [] intAry = {25,10,5,1};
while(inputCnt > 0){
int inputLine = Integer.parseInt(br.readLine());
for(int i = 0; i < 4; i++){
int count = inputLine / intAry[i];
st.append(count);
st.append(" ");
inputLine = (inputLine % intAry[i]);
}
st.append("\n");
inputCnt--;
}
System.out.println(st);
}
}
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int inputCnt = Integer.parseInt(br.readLine());
StringBuilder st = new StringBuilder();
double [] intAry = {0.25, 0.10, 0.05, 0.01};
// float [] intAry = {0.25f,0.10f,0.05f,0.01f}; //f 필수!!!
while(inputCnt > 0){
/* (int / int는 정수라서 100.0 double 타입의 리터럴로 나눠줘야함 */
double inputLine = Integer.parseInt(br.readLine()) / 100.0;
for(int i = 0; i < 4; i++){
intputLine = roundFunc(inputLine, 3); //소수점 이하 3째자로 반올림
int count = (int) (inputLine / intAry[i]);
st.append(count).append(" ");
inputLine = (inputLine % intAry[i]);
}
st.append("\n");
inputCnt--;
}
System.out.println(st);
}
private static double roundFunc(double value, int places){
if(places < 0) throw new IllegalArgumentException();
BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
}