백준 1312번: 소수 + 1331번: 나이트 투어 + 백준 1340번: 연도 진행바 (Java)

won·2023년 3월 10일
0

알고리즘 문제풀이

목록 보기
23/32

백준 1312번: 소수

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); 
		// 원하는 자리수에서 더이상 나머지를 구하는 것이 아니라 나누기를 하여 몫을 구함
	}
}

백준 1331번: 나이트 투어

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();
	}
}

백준 1340번: 연도 진행바

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;
	}
}
profile
뭐라도 하자

0개의 댓글