백준, 보른즈1에 있는 문제들을 포스팅 해보도록 하겠습니다.
(바쁘면 1문제, 최소 3~5문제 목표입니다)
각 문자열 형변환 (모르시는 분들 참고하세요~) 2, 3
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public 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 cp = N;
int count =0;
// N 십의 자릿수는 나누기 10 을 하면 N이 한 자릿수이면 0,
// 그 외에는 십의 자릿수가 그대로 반환.
// N % 10 일의자릿수
do {
N = ((N % 10) * 10) + (((N / 10) + (N % 10)) % 10);
count++;
} while (cp != N);
System.out.print(count);
}
}
import java.io.*;
import java.util.StringTokenizer;
public 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 []arr =new int [N];
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int max=0;
int sum=0;
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
max = Math.max(arr[i], arr[i + 1]);
sum += arr[i];
}
System.out.print(((sum/max)*100)/3));
}
}
바보.
당연한 것이다. 배열의 범위를 넘어가니까 에러가 뜬다. 자바에서는 배열의 범위 초과시 ArrayIndexOutOfBoundsException
에러가 발생합니다.
따라서, 다시 생각해보면 max 와 arr[i]
를 비교해서 max 값에 넣으면 되는. 간단히 소팅하면 됩니다.
수정 후 다시 돌려봤지만 계산이 제대로 되지 않았다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
double []arr =new double [N];
StringTokenizer st = new StringTokenizer(br.readLine()," ");
double max=0;
double sum=0;
// 배열의 길이만큼 반복
for (int i = 0; i < N; i++) {
arr[i] = Double.parseDouble(st.nextToken());
max = Math.max(arr[i], max);
sum += arr[i];
}
System.out.print((double)(((sum/max)*100)/N));
}
}
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int C = Integer.parseInt(br.readLine());
for (int i = 0; i < C; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(br.readLine());
int[] score = new int[N];
int sum =0;
for (int j = 0; j < N; j++) {
score[j] = Integer.parseInt(st.nextToken());
sum += score[j];
}
// 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림해서 소수 3째자리 까지 출력.
// -> 각 케이스마다 평균을 구해야함.
float avg = (float) sum/N;
int count =0;
for (int k = 0; k < N; k++) {
if (score[k] > avg) {
count++;
}
}
float ratio = (count / N) *100;
System.out.printf("%.3f", ratio);
System.out.println("%");
}
}
}
필자들은 왜 에러가 발생하는지 아시겠나요?
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int C = Integer.parseInt(br.readLine());
// 이렇게 해야 계속 문자열 분리해서 받을 수 있음.
StringTokenizer st;
for (int i = 0; i < C; i++) {
st = new StringTokenizer(br.readLine()," ");
// 해당부분.
int N = Integer.parseInt(st.nextToken());
int[] score = new int[N];
int sum =0;
for (int j = 0; j < N; j++) {
score[j] = Integer.parseInt(st.nextToken());
sum += score[j];
}
// 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림해서 소수 3째자리 까지 출력.
// -> 각 케이스마다 평균을 구해야함.
float avg = (float) sum/N;
float count =0;
for (int k = 0; k < N; k++) {
if (score[k] > avg) {
count++;
}
}
float ratio = (count / N) *100;
System.out.printf("%.3f", ratio);
System.out.println("%");
}
}
}
br.readLine()
으로 매 문장으로 반복하니까 런타임이 뜨는 것이다.필자가 생각했을 때에는,
1. 아스키코드
2. 배열 (메서드 활용)
으로 풀 수 있을 것 같다고 생각됩니다.
아스키코드,
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 1번 풀이
int[] arr = new int[26];
String str = br.readLine();
for (int i = 0; i < str.length(); i++) {
// 현재 i번쨰 문자가 소문자 알파벳인지 판단하는 조건
if ('a' <= str.charAt(i) && str.charAt(i) <= 'z') {
// 만약 소문자라면 'a'의 아스키 코드값 97을 빼줌
arr[str.charAt(i) - 97]++;
} else{
// 대문자일경우, 'A' 의 아스키 코드 값
arr[str.charAt(i)-65]++;
}
}
int max = -1;
// char ch =0; 으로 작성해도 무방.
char ch = '?';
// 앞에서 계산한 각 알파벳의 arr 배열(출현빈도)를 바탕으로, 가장 빈도가 높은 알파벳을 출력.
for (int i = 0; i < 26; i++) {
// 가장 높은 빈도 값을 저장하고, ch 변수에는 해당 알파벳을 저장함/
if (arr[i] > max) {
max = arr[i];
ch = (char) (i + 65);
} else if (arr[i]==max) {
ch = '?';
}
}
System.out.print(ch);
}
}
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;
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());
StringBuilder sb = new StringBuilder();
// 아파트에 살 수 있는 최대 값을 배열로 초기화
int[][] APT = new int[15][15];
// 아파트 생성
for (int i = 0; i < 15; i++) {
APT[i][1]=1; // 1 ㅊ으 1호
APT[0][i]= i;// 0층 1호
}
for (int i = 1; i < 15; i++) {
for (int j = 2; j < 15; j++) {
APT[i][j] = APT[i][j - 1] + APT[i - 1][j];
}
}
int T = Integer.parseInt(br.readLine());
for (int k = 0; k < T; k++) {
int a = Integer.parseInt(br.readLine());
int b = Integer.parseInt(br.readLine());
sb.append(APT[a][b]).append("\n");
}
System.out.println(sb);
}
}
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
private static int[][] APT = new int[15][15];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
// 아파트에 살 수 있는 최대 값을 배열로 초기화
make_APT();
int T = Integer.parseInt(br.readLine());
for (int k = 0; k < T; k++) {
int a = Integer.parseInt(br.readLine());
int b = Integer.parseInt(br.readLine());
sb.append(APT[a][b]).append("\n");
}
System.out.println(sb);
}
private static void make_APT(){
// 아파트 생성
for (int i = 0; i < 15; i++) {
APT[i][1]=1; // 1 ㅊ으 1호
APT[0][i]= i;// 0층 1호
}
for (int i = 1; i < 15; i++) {
for (int j = 2; j < 15; j++) {
APT[i][j] = APT[i][j - 1] + APT[i - 1][j];
}
}
}
}
import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;
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()," ");
BigInteger n = new BigInteger(st.nextToken());
BigInteger m = new BigInteger(st.nextToken());
System.out.println(n.divide(m));
System.out.print(n.remainder(m));
}
}
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[]args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
StringBuilder sb = new StringBuilder();
// 입력
for(int i=0; i<T;i++){
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int result = gcd(A,B);
sb.append(A*B/result).append('\n');
}System.out.print(sb);
}
public static int gcd(int A, int B){
while(B!=0){
int r = A % B; // 나머지 구하기
// gcd(a,b) = GCD(b,r)임. 즉, 변환함
// 만약, 이해가 안된다면, 배열 소팅을 생각해보면 됨.
A= B;
B = r;
} return A;
}
}
코드로 이해가 안된다면 유클리드 호제법에 대해 공부를 할 필요가 있습니다.
유클리드 호제법은 최소공배수 및 최대공약수를 구하는 대표적인 방법입니다.
유클리드 호제법에 대해 자세히 포스팅한 블로그가 있어, 도움이 되고자 이렇게 남깁니다.
코딩테스트 연습에 제일 중요한 것은, IDEA로 작성해서 옮기는 것이 아니라 인터넷(코테 사이트)에서 바로 푸는 것이 Best of Best 입니다.
왜냐고요? --> 필자는 코테 볼 때, IDEA가 제공해주는 툴을 사용했는데, 코테에선 이것을 사용하지 못해서 난감했던 경험이 있습니다.
이후부터 필자는 코테 사이트에서 즉시 코드를 작성하여 코테준비를 할 예정입니다.