https://www.acmicpc.net/problem/1312
새로운 알고리즘을 알게되었다..
눈으로 로직을 보니 대충은 알겠는데 완전한 이해는 되지 않아서 기록용으로 적어둔다.
package problem_solved;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class n1312 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int A= Integer.parseInt(st.nextToken());
int B= Integer.parseInt(st.nextToken());
int N= Integer.parseInt(st.nextToken());
int sum = A%B; //정수 영역의 나머지 구하기
for(int i=0; i<N-1;i++) {
sum*=10; //나머지에 10을 곱해 다음 자리 나머지 구함
sum%=B;
}
sum *= 10;
System.out.println(sum/B);
// 원하는 자리수에서 더이상 나머지를 구하는 것이 아니라 나누기를 하여 몫을 구함
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class n1312 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int A= Integer.parseInt(st.nextToken());
int B= Integer.parseInt(st.nextToken());
int N= Integer.parseInt(st.nextToken());
int sum = A%B; //정수 영역의 나머지 구하기
System.out.println("A%B= "+ sum);
for(int i=0; i<N-1;i++) {
sum*=10; //나머지에 10을 곱해 다음 자리 나머지 구함
System.out.println("sum * 10 =" + sum);
sum%=B;
System.out.println("sum % B =" + sum);
}
sum *= 10;
System.out.println("sum * 10 =" + sum);
System.out.println(sum/B);
// 원하는 자리수에서 더이상 나머지를 구하는 것이 아니라 나누기를 하여 몫을 구함
}
}
https://www.acmicpc.net/problem/1331
문제를 잘 읽자는 교훈을 얻게 됨..
1. 이미 방문한 칸을 방문하면 Invalid
2. 나이트가 갈 수 있는 방법 룰과 다르게 가면 Invalid
그리고 또 한가지 조건이 있었다.
3. 마지막으로 방문하는 칸에서 시작점으로 돌아올 수 있는 경로가 아니면 Invalid
문제를 제대로 안 읽어서 문제에 있는 예제조차 정답이 제대로 안나왔었다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
boolean chess[][] = new boolean[6][6];
int first_a= 0;
int first_b=0;
int past_a = 0;
int past_b = 0;
int a_diff = 0;
int b_diff = 0;
for (int i = 0; i < 36; i++) {
String str = br.readLine();
int a = (int) (str.charAt(0)) - 65;
int b = (int) (str.charAt(1)) - 49;
if (i == 0) {
chess[a][b] = true;
past_a = a;
past_b = b;
first_a=a;
first_b=b;
continue;
}
a_diff = Math.abs(a - past_a);
b_diff = Math.abs(b - past_b);
if ((a_diff == 2 && b_diff == 1) || (a_diff == 1 && b_diff == 2)) {
if (!chess[a][b]) {
chess[a][b] = true;
past_a = a;
past_b = b;
if (i == 35) {
a_diff = Math.abs(a - first_a);
b_diff = Math.abs(b - first_b);
//마지막으로 방문하는 칸에서 시작점으로 돌아올 수 있는 경로
if((a_diff == 2 && b_diff == 1) || (a_diff == 1 && b_diff == 2)) {
bw.write("Valid");
}else {
bw.write("Invalid");
}
}
} else {
bw.write("Invalid");
break;
}
} else {
bw.write("Invalid");
break;
}
}
bw.flush();
bw.close();
br.close();
}
}
https://www.acmicpc.net/problem/1340
https://www.acmicpc.net/problem/1308
1308번 문제에서 애를 많이 먹어서 비슷한 문제인 이 문제는 쉽게 풀었다.
주어진 날짜만큼의 분/ 1년간 총 분수 * 100
으로 풀었다.
윤년일 때의 1년 총 분, 2월일 때 이런 경우들만 조심하면 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st= new StringTokenizer(br.readLine());
String[] months = {"January","February","March","April",
"May","June","July","August","September","October",
"November","December"};
int[] month_day= {31,28,31,30,31,30,31,31,30,31,30,31};
int totalday=0;
int totalminute=0;
String str="";
str = st.nextToken();
int month=0;
for(int i=0;i<months.length;i++) {
if(months[i].equals(str)) {
month=i;
break;
}
}
str= st.nextToken();
int day= Integer.parseInt(str.substring(0,2));
int n=0;
int year = Integer.parseInt(st.nextToken());
if(is_leap(year)) {
n=527040;
}else {
n=525600;
}
for(int i=0;i<month;i++) {
totalday+=month_day[i];
if(i==1) {
if(is_leap(year)) {
totalday+=1;
}
}
}
totalday+=day-1;
totalminute= totalday* 24 * 60;
String arr[] = (st.nextToken()).split(":");
int time = Integer.parseInt(arr[0]);
int minute = Integer.parseInt(arr[1]);
totalminute += time*60 + minute;
double result = (double)totalminute/n * 100;
bw.write(String.valueOf(result));
bw.flush();
bw.close();
br.close();
}
public static boolean is_leap(int year) {
if(year%4==0) {
if(year%100 == 0) {
if(year%400==0) {
return true;
}else {
return false;
}
}
return true;
}
return false;
}
}