sm 기술 블로그
[단계별] 백준 (답) java (1~87) 본문
1. 1000
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int a, b;
a = sc.nextInt();
b = sc.nextInt();
System.out.println(a + b);
}
}
2. 1001
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println(sc.nextInt()-sc.nextInt());
}
3. 10171
import java.util.*;
public class Main{
public static void main(String args[]){
System.out.println("\\ /\\");
System.out.println(" ) ( ')");
System.out.println("( / )");
System.out.println(" \\(__)|");
}
}
자바는 역슬래시를 하나만 써주면 인식을 못한다.(바보다) 역슬래시는 \ (원화)
4. 10718
import java.util.*;
class Main{
public static void main(String[] agrs){
System.out.println("강한친구 대한육군");
System.out.println("강한친구 대한육군");
}
}
5. 1330
내가 푼거
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
if(-10000<=A && B<=10000){
if(A>B){
System.out.println(">");
}
else if(A<B){
System.out.println("<");
}
else {
System.out.println("==");
}
}
}
}
실력자들의 답
import java.util.*;
interface Main{
static void main(String[]z){
Scanner s=new Scanner(System.in);
int a=s.nextInt()-s.nextInt();
System.out.print(a>0?">":a<0?"<":"==");
}
}
import java.util.*;
class Main{
public static void main(String[]z){
Scanner s=new Scanner(System.in);
int a=s.nextInt()-s.nextInt();
System.out.print(a>0?">":a<0?"<":"==");
}
}
6. 1008
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
double a= sc.nextDouble();
double b= sc.nextDouble();
System.out.println(a/b);
}
}
실력자들
interface Main{
static void main(String[]a)
throws Exception{
byte[]b={0,0,0};
System.in.read(b);
System.out.print((b[0]-48)/(b[2]-48.));
}
}
// 와.. 이건 난이도가 높네..
// 48.에서 .이 있어야 나옴..
7. 10926
import java.util.*;
class Main{
public static void main(String[]a) {
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
System.out.println(name+"??!");
}
}
import java.util.*;
class Main {
public static void main(String[] args) {
System.out.println(new Scanner(System.in).nextLine()+"??!");
}
}
8. 2525
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
if ( ((a>=0)&&(a<=23)) && ((b>=0)&&(b<=59)) && ((c>=0)&&(c<=1000))) {
int d = a * 60 + b +c;
a = d / 60;
b = d % 60;
if(a >= 24) {
a -= 24;
}
System.out.println(a+" "+b);
}
}
}
9. 10869
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println(a%b);
}
}
import java.util.*;
class Main{public static void main(String[]V){
Scanner S=new Scanner(System.in);
int a=S.nextInt();
int b=S.nextInt();
System.out.print(a+b+"\n"+(a-b)+"\n"+a*b+"\n"+a/b+"\n"+a%b);
}
}
10. 10172
import java.util.*;
class Main{
public static void main(String[] s) {
System.out.print("|\\_/|\n|q p| /}\n( 0 )\"\"\"\\\n|\"^\"` |\n||_/=\\\\__|");
}
}
11. 2884
import java.util.*;
class Main{
public static void main(String[] s) {
Scanner sc=new Scanner(System.in);
int H=sc.nextInt(),M=sc.nextInt();
if((H>=0)&&(H<=23) && (M>=0)&&(M<=59)) {
int a = (H*60)+M-45;
if(a<0) {
a=(24*60)+a;
}
H = a / 60;
M = a % 60;
System.out.println(H+" "+M);
}
}
}
12. 2480
(객체버전)
import java.util.*;
class A{
int a,b,c;
public void setOprand(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
public int compare1() {
if((this.a==this.b)||(this.a==this.c)) {
return this.a;
}
else
return this.c;
}
public int compare2() {
if(this.a > this.b) {
if(this.a > this.c) {
return this.a;
}
else {
return this.c;
}
}
else if(this.c > this.b) {
if(this.c>this.a) {
return this.c;
}
else {
return this.a;
}
}
else {
return this.b;
}
}
}
class Main{
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int a = sc.nextInt() , b = sc.nextInt(), c = sc.nextInt();
if((a==b)&&(b==c)) {
System.out.println(10000+(a*1000));
}
else if ((a==b)||(b==c)||(a==c)) {
A Com1= new A();
Com1.setOprand(a, b, c);
System.out.println(1000+(Com1.compare1())*100);
}
else {
A Com2 = new A();
Com2.setOprand(a, b, c);
System.out.println(Com2.compare2()*100);
}
}
}
간단한 버전
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A=sc.nextInt(),B=sc.nextInt(),C=sc.nextInt();
int P;
if (A==B){
if(B==C) P=(A+10)*1000;
else P=(A+10)*100;
}
else if (B==C || C==A) P=(C+10)*100;
else P=Math.max(Math.max(A,B), C)*100;
System.out.print(P);
}
}
Math.max는 두수를 비교해서 가장 큰수를 return 한다.
13. 9498
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
System.out.println((a>=90)?"A":((a>=80)?"B":(a>=70)?"C":(a>=60)?"D":"F"));
}
}
14. 18108
import java.util.*;
interface Main{
static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(sc.nextInt()-543);
}
}
15. 2753
import java.util.*;
interface Main{
static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
if((a%4==0)&&((a%100!=0)||(a%400==0))){
System.out.println("1");
}
else {
System.out.println("0");
}
}
}
16. 2588
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int A = in.nextInt();
String B = in.next();
in.close();
System.out.println(A * (B.charAt(2) - '0'));
System.out.println(A * (B.charAt(1) - '0'));
System.out.println(A * (B.charAt(0) - '0'));
System.out.println(A * Integer.parseInt(B));
}
}
문자열의 배열로 아스키코드값을 나타낸다. 따라서 0 (32)의 값을 빼줘야 값이 문제없이 나올 수 있다.
ex) B.charAt(2) = 5 여기서 5는 아스키코드값이고 실제 값은 53이고 48인 0의 값을 빼주면 문제 없음
17. 14681
import java.util.*;
interface Main{
static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
if(a>0&&b>0) {
System.out.println(1);
}
else if(a<0&&b>0) {
System.out.println(2);
}
else if(a<0&&b<0) {
System.out.println(3);
}
else{
System.out.println(4);
}
}
}
18. 2739
import java.util.*;
interface Main{
static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a=sc.nextInt();
for(int i=1;i<10;i++) {
System.out.println(a + " * " + i + " = " + a*i);
}
}
}
19. 10950
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int a[]=new int[num];
for(int i=0;num-i>0;i++) {
a[i] = sc.nextInt()+sc.nextInt();
}
for(int i=0;num-i>0;i++) {
System.out.println(a[i]);
}
}
}
배열을 사용하려면 인스턴스화 한 후 사용할 수 있다는것을 기억해 두자.
20. 15552
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine()," ");
bw.write(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken())+"\n");
}
bw.flush();
}
}
st = new StringTokenizer(br.readLine()," "); 받은 값들은 공백없이 받기 때문에 공백을 통해 구분해준다.
bw.flush(); 를 통해서 출력해준다.
21. 2741
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
for(int i=1; i<=a; i++) {
System.out.println(i);
}
}
}
22. 2742
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
for(int i=a; i>0; i--) {
System.out.println(i);
}
}
}
23. 11021
import java.io.*;
import java.util.*;
class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine()," ");
bw.write("Case #"+(i+1)+": "+(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken()))+"\n");
}
bw.flush();
}
}
24. 11022
import java.io.*;
import java.util.*;
class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine()," ");
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
bw.write("Case #"+(i+1)+": "+ A+" + "+B+" = "+(A+B)+"\n");
}
bw.flush();
}
}
25. 2438
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
for(int i=0;i<num;i++) {
for(int j=0;j<=i;j++) {
System.out.print("*");
}
System.out.print("\n");
}
}
}
26. 2439
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
for(int i=1;i<=num;i++) {
for(int j=0;j<num-i;j++) {
System.out.print(" ");
}
for(int k=0;k<i;k++) {
System.out.print("*");
}
System.out.print("\n");
}
}
}
27. 10871
import java.io.*;
import java.util.*;
class Main{
public static void main(String[] args) throws Exception {
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());
StringBuilder sb = new StringBuilder();
//배열을 저장하기 위해서 선언
// 1열 입력
st = new StringTokenizer(br.readLine()," ");
// 입력받은 값에 공백을 추가하여 저장.
for(int i=0;i<A;i++) {
int value = Integer.parseInt(st.nextToken());
// 입력 값을 value에 저장함
if(value < B) {
sb.append(value).append(' ');
// 값과 공백을 집어넣는다. ""가 아닌 ''를 쓴다는 것을 주의하자.
}
}
// 2열 입력
System.out.println(sb);
}
}
28. 10951
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
String str;
while((str=br.readLine())!=null){
st = new StringTokenizer(str," ");
int A=Integer.parseInt(st.nextToken());
int B=Integer.parseInt(st.nextToken());
sb.append((A+B)).append("\n");
}
System.out.print(sb);
}
}
29. 10952
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
while(true) {
st = new StringTokenizer(br.readLine()," ");
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
if(A==0 && B==0) {
break;
}
sb.append((A+B)).append('\n');
}
System.out.println(sb);
}
}
30. 1110
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b=a,c=0,d=0,e=0,i=0;
while(true) {
c=b%10; //1의자리
d=(b-c)/10; //10의자리
e=c+d;
if(e<10) {
b=(10*c)+e;
}
else {
b=(10*c)+(e%10);
}
i++;
if(b==a) {
break;
}
}
System.out.println(i);
}
}
31. 10818
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int ary[] = new int[N];
for(int i=0; i<N;i++) {
ary[i] = sc.nextInt();
}
Arrays.sort(ary);
System.out.println(ary[0] + " " + ary[N-1]);
}
}
32. 2562
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int arr[] = new int[9];
int arr2[] = new int[9];
int N=0;
for(int i=0; i<9;i++) {
arr[i]=sc.nextInt();
arr2[i] = arr[i];
}
Arrays.sort(arr2);
for(int i=0; i<9;i++) {
if(arr2[8]==arr[i]) {
N=i;
}
}
System.out.println(arr[N]+"\n"+(N+1));
}
}
33. 2577
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int value = (sc.nextInt()*sc.nextInt()*sc.nextInt());
String str = Integer.toString(value);
for(int i=0; i<10; i++) {
int count =0;
for(int j=0; j<str.length();j++) {
if((str.charAt(j)-'0')==i) {
count++;
}
}
System.out.println(count);
}
}
}
___.charAt() 은 문자열을 문자로 바꿔준다.
34. 3052
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashSet<Integer> H =new HashSet<Integer>();
for(int i=0;i<10;i++) {
H.add(sc.nextInt()%42);
}
System.out.println(H.size());
}
}
HashSet은
확인
35. 1546
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
double arr[] = new double[N];
double arr2[] = new double[N];
double score=0;
for(int i=0;i<N;i++) {
arr[i]=(double)sc.nextInt();
}
Arrays.sort(arr);
for(int i=0;i<N;i++) {
arr2[i]=(arr[i]/arr[N-1])*100;
score+=arr2[i];
}
score=score/N;
System.out.println(score);
}
}
36. 8958
import java.util.*;
interface Main{static void main(String[]z){
Scanner sc=new Scanner(System.in);
String arr[] = new String[sc.nextInt()];
for(int i=0;i<arr.length;i++) {
arr[i] = sc.next();
}
for(int i=0; i<arr.length;i++) {
int cnt=0;
int sum=0;
for(int j=0; j<arr[i].length(); j++) {
if(arr[i].charAt(j)=='O') {
cnt++;
}
else {
cnt=0;
}
sum +=cnt;
}
System.out.println(sum);
}
}
}
37. 4344
import java.util.*;
interface Main{static void main(String[]z){
Scanner sc=new Scanner(System.in);
int A=sc.nextInt();
int arr[] = new int[A];
double arr3[] = new double[A];
for(int i=0;i<arr.length;i++) {
int B=sc.nextInt();
double arr2[] = new double[B];
int cnt=0;
double sum=0;
for(int j=0;j<B;j++) {
arr2[j]= (double)sc.nextInt();
sum+=arr2[j];
}
arr3[i]=sum/B;
for(int j=0;j<B;j++) {
if(arr2[j]>arr3[i]) {
cnt++;
}
}
arr3[i]=cnt/((double)B);
}
for(int i=0;i<A;i++) {
System.out.printf("%.3f%%\n",arr3[i]*100);
}
}
}
※ println은 (~~~,~~~)가 정의되지 않음. 따라서 printf 로 써줘야함.
※ % 는 뒤에 것을 가져오자 라고 정의, %.3f% 로만 하면 두번째%는 ,뒤에 가져올 것이 없어 에러 발생
※ 따라서 %%로 하면 '%'가 출력 즉, 무엇을 붙이고 싶으면 % 뒤에 써줌 ex) %.3f%a -> 70a
38. 4673
import java.util.*;
class Main{
public static void main(String[] args){
boolean[] check = new boolean[10001];
for (int i = 1; i < 10001; i++){
int n = d(i);
if(n<10001) {
check[n] = true;
}
}
for(int i=1;i<10001;i++) {
if(!check[i]) {
System.out.println(i);
}
}
}
public static int d(int num) {
int sum=num;
while(num!=0) {
sum=sum+(num%10);
num=num/10;
}
return sum;
}
}
39. 1065
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println(A(sc.nextInt()));
}
public static int A(int num) {
int cnt=0;
if(num<100) {
return num;
}
else {
cnt=99;
for(int i= 100;i<=num;i++) {
int hun = i/100;
int ten = (i/10)%10;
int one = i%10;
if((hun-ten)==(ten-one)) {
cnt++;
}
}
}
return cnt;
}
}
한수 => 등차수열인 수 (연속하는 두 수의 차이가 일정한 수열) ex) 321 -> 3-2=1 | 2-1=1 로 한수이다.
※ 1~99는 무조건 한수이다.(비교대상이 자신 혹은 하나밖에 없어서)
40. 11654
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String A = sc.nextLine();
System.out.println((int)A.charAt(0));
}
}
41.11720
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
String A = sc.next();
int sum=0;
for(int i=0;i<N;i++) {
sum+=(A.charAt(i)-'0');
}
System.out.println(sum);
}
}
next()는 스페이스바를 쓰면 입력을 그만받고
nextLine()은 엔터를 쓰면 입력을 그만받는다.
ex)
Hello Wrold
next : Hello
nextLine : Hello Wrold
42. 10809
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String N = sc.nextLine();
int a[] = new int[26];
for(int i=0;i<a.length;i++) {
a[i]=-1;
}
for(int i=0;i<N.length();i++) {
char ch = N.charAt(i);
if(a[ch -'a']==-1) {
a[ch-'a']=i;
}
}
for(int val:a) {
System.out.print(val+" ");
}
}
}
소문자 개수 : 26개
for(int val:a) : for-each문 ... a의 값을 하나씩 꺼내서 val에 집어넣어라.
43. 2675
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for(int i=0;i<N;i++) {
int b = sc.nextInt();
String S= sc.next();
for(int j=0;j<S.length();j++) {
for(int k=0;k<b;k++) {
System.out.print(S.charAt(j));
}
}
System.out.println();
}
}
}
2
3 ABC
AAABBBCCC
5
/HTP
/////HHHHHTTTTTPPPPP
이렇게 나와도 답임
44. 1157
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String S = sc.nextLine();
int A[] = new int[26];
for(int i=0; i<A.length;i++) {
A[i]=0;
}
S=S.toUpperCase();
for(int i=0; i<S.length();i++) {
A[S.charAt(i)-'A']++;
}
int max=0;
char ch='?';
for(int i=0;i<26;i++) {
if(A[i]>max) {
max = A[i];
ch = (char)(i+65);
}
else if(A[i]==max) {
ch = '?';
}
}
System.out.println(ch);
}
}
답은 맞으나, 속도가 느리다.
45. 1152
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String S= sc.nextLine();
int cnt=1;
for(int i=1;i<S.length();i++) {
if(S.charAt(i)==' ') {
cnt++;
}
}
if(S.charAt(S.length()-1)==' ') {
cnt--;
}
System.out.println(cnt);
}
}
46. 2908
(나)
import java.util.Scanner;
class A{
public int Values(String S,int a, int b) {
if(S.charAt(a)>S.charAt(b)) {
return 1;
}
else if(S.charAt(a)<S.charAt(b)) {
return -1;
}
else {
return 0;
}
}
public void Result(String S,int n) {
if(n==1) {
for(int i=2;i>=0;i--) {
System.out.print(S.charAt(i));
}
}
else if (n==-1) {
for(int i=6;i>=4;i--) {
System.out.print(S.charAt(i));
}
}
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String S= sc.nextLine();
A c1=new A();
int num=c1.Values(S, 2, 6);
if(num==0) {
num=c1.Values(S, 1, 5);
if(num==0) {
num=c1.Values(S, 0, 4);
}
}
c1.Result(S, num);
}
}
(전문가)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int A = in.nextInt();
int B = in.nextInt();
in.close();
A = Integer.parseInt(new StringBuilder().append(A).reverse().toString());
B = Integer.parseInt(new StringBuilder().append(B).reverse().toString());
System.out.print(A > B ? A : B);
}
}
append()는 기존에 내용이 있다고 하면 그 뒤에 추가하여 저장 (문자열 마지막에 내용을 추가함)
47. 5622
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String [] D = {"ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"};
String S = sc.next();
int cnt=0;
for(int i=0;i<8;i++) {
for(int j=0;j<S.length();j++) {
if(D[i].indexOf(S.charAt(j))!=-1) {
cnt += 3+i; // 2번부터 시작하고 2번은 3초 걸린다.
}
}
}
System.out.println(cnt);
}
}
48. 2941
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String S = sc.next();
String arr[] = {"c=","c-","dz=","d-","lj","nj","s=","z="};
for(int i=0;i<arr.length;i++) {
S = S.replace(arr[i],"0");
}
System.out.println(S.length());
}
}
replace로 문자열을 치열하고 치열된 개수를 세었음
https://coding-factory.tistory.com/128
49. 1316
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(),cnt=0;
boolean B[] = new boolean[N];
for(int i=0;i<N;i++) {
String S =sc.next();
for(int j=0;j<S.length()-1;j++) {
if(S.charAt(j)!=S.charAt(j+1)) {
for(int k=0;k<=j;k++) {
if(S.charAt(j+1)==S.charAt(k)) {
B[i]=true;
}
}
}
}
}
for(int i=0;i<N;i++) {
if(B[i]==true) {
cnt++;
}
}
System.out.println(N-cnt);
}
}
예를들어 7번과 8번의 문자가 다를때, 8번을 기준으로 1번부터 7번까지 비교후 같은 문자가 있으면 true를 반환하고
입력 수(N)에서 그룹단어가 아닌 수만큼 빼줌
50. 1712
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int arr[] = new int[3];
int cnt=0;
for(int i=0;i<3;i++) {
arr[i]=sc.nextInt();
}
int p = arr[2]-arr[1];
if(p<1){
cnt=-1;
}
else {
cnt = (arr[0])/(arr[2]-arr[1])+1;
}
System.out.println(cnt);
}
}
A는 고정값 C에서 B를 뺀값이 이익임. 고정값을 넘기면 그 이상부터는 순 이익이다.
51. 2292
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N =sc.nextInt();
int cnt = 1;
int ran = 2;
if(N == 1) {
System.out.println(1);
}
else {
while(ran<=N) {
ran = ran +(6*cnt);
cnt++;
}
System.out.print(cnt);
}
}
}
처음을 제외하고 6n 만큼씩 증가함 (1->6->12->18->24-> ...) ran은 범위로 2부터 시작함.
ex ) N=58 이면 ran은 다음과 같이 증가.
cnt | ran | = | ran | + | 6*cnt |
2 | 8 | 2 | + | 6 | |
3 | 20 | 8 | + | 12 | |
4 | 38 | 20 | + | 18 | |
5 | 62 | 38 | + | 24 |
cnt = 5
52. 1193
import java.io.*;
import java.util.*;
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 cnt=1;
int top=1;
int bot=1;
if(N==1) {
System.out.println(top+"/"+bot);
}
else {
while(N>0) {
N=N-cnt; // 어느 그룹에 속하는지 찾음
cnt++; // 그룹의 수는 1씩 증가함
}
cnt--; // 마지막에 1을 한번 더 더해줘서 1을 빼줌
N=cnt+N; // 그룹에 몇번째인지 저장함
if((cnt%2)==0) { // 짝수일때는 그룹에서 순서가 분자 , 몇번째 그룹 - 분자 = 분모
top = N;
bot = (cnt+1)-top;
}
else { // 홀수일때는 그룹에서 순서가 분모 , 몇번째 그룹 - 분모 = 분자
bot = N;
top = (cnt+1)-bot;
}
System.out.println(top+"/"+bot);
}
}
}
그룹(분자 분모 합) | 1 | 2 | 3 | 4 | 5 |
2 | 1/1 (1) | ||||
3 | 1/2 (2) | 2/1 | |||
4 | 3/1 (4) | 2/2 | 1/3 | ||
5 | 1/4 (7) | 2/3 <-(8) | 3/2 | 4/1 | |
6 | 5/1 (11) | 4/2 | 3/3 | 2/4 | 1/5 |
예를 들어 8을 입력 했을 때
결과 N | N | cnt | cnt++ |
7 | 8 | 1 | 2 |
5 | 7 | 2 | 3 |
2 | 5 | 3 | 4 |
-2 | 2 | 4 | 5 |
cnt는 5가 나옴.
여기에 cnt--인 값을 결과N에 더해주면 그룹에 몇번째인지 알 수 있음.
53. 2869
import java.io.*;
import java.util.StringTokenizer;
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 C = Integer.parseInt(st.nextToken());
int day = (C-B)/(A-B) ;
// 정상에 도달하면 미끄러지지 않는다.
// 잔여 높이가 없다면 상관 없지만 만약 잔여 높이가 있다면?
if((C-B)%(A-B)!=0) {
day++;
}
System.out.println(day);
}
}
하루에 한칸씩 올라간다.
그런데 5일이 아니라 4일이 걸린다.
그 이유는 정상에 도달하면 미끄러지지 않기 때문이다.
그래서 마지막에 미끄러지는 날을 한번 총 길이에서 빼주고 오른 미터수 - 내린 미터수를 해준것을 나눠주면 된다.
몫이 딱 떨어지면 좋겠지만 잔여가 남는 경우에는 하루 더 추가해준 것이다.
(총길이-미끄러진 미터 수(도착전 날)) / (오른 미터 수 - 미끄러진 미터 수)
54. 10250
import java.io.*;
import java.util.StringTokenizer;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N =Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i=0;i<N;i++) {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int A = Integer.parseInt(st.nextToken());
st.nextToken(); //필요없는 수
int C = Integer.parseInt(st.nextToken());
if((C%A)==0){
sb.append((A*100)+(C/A)).append('\n');
}
// 존재하는 층수의 배수가 C번째 손님일 경우
// 층수는 A고 호수는 C/A임
else {
sb.append(((C%A)*100)+((C/A)+1)).append('\n');
}
// 배수가 아닌 경우 층수는 (C%A)*100 이고
// 호수는 (C/A)+1 [+1해주는 이유: 0호가 없다(몫이 0부터 존재함)]
}
System.out.println(sb);
}
}
55. 2775
import java.util.StringTokenizer;
import java.io.*;
class Main{
public static int[][] APT = new int [15][15];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
make_APT();
for(int i=0;i<N;i++) {
int A = Integer.parseInt(br.readLine());
int B = Integer.parseInt(br.readLine());
sb.append(APT[A][B]).append('\n');
}
System.out.println(sb);
}
public static void make_APT() {
for(int i=0;i<15;i++) {
APT[i][1] =1;
APT[0][i] =i;
}
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];
}
}
}
}
몇층이든 1호는 1명일 수 밖에 없음.
원하는 층 , 원하는 호에 살기 위해서는 원하는 층의 전 호수와 원하는 전 층 원하는 호수에 합이다.
56. 2839
import java.io.*;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
cnt(N);
}
public static void cnt(int N) {
if((N==7)||(N==4)) {
System.out.println(-1);
}
else if((N%5)==1||(N%5)==3) {
System.out.println((N/5)+1);
}
else if((N%5)==2||(N%5)==4) {
System.out.println((N/5)+2);
}
else if(N%5==0) {
System.out.println(N/5);
}
}
}
색으로 표시한 부분에 규칙이 보인다.(안보이면 바보임.) -> 파랭이들 : 몫 +1 노랭이들 : 몫 +2
57. 10757
import java.io.*;
import java.math.BigInteger;
import java.util.StringTokenizer;
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 A = new BigInteger(st.nextToken());
BigInteger B = new BigInteger(st.nextToken());
A=A.add(B);
System.out.println(A.toString());
}
}
BigInteger은 long을 넘어서는 값을 받을 때 쓰인다.
이때, 더하기는 +가 아닌 .add()를 쓴다.
이 문제는 함수로 간단하게 처리 할 수도 있지만, 더하기 로직을 직접 짜서 만들 수 있다. 그건 더 익숙해지면 학습하자.
https://st-lab.tistory.com/199
58. 1978
소수는 약수가 1과 자기자신 뿐이다.
이걸 이용해서 풀면
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int t,ans=0;
t=scan.nextInt();
while(t>0){
t--;
int a,cnt=0;
a=scan.nextInt();
for(int i=1;i<=a;i++){
if(a%i==0)cnt+=1;
}
if (cnt==2) ans+=1;
}
System.out.println(ans);
}
}
1과 자기자신을 약수로 가지는 수만 ans해준다.
정석으로 풀면
import java.io.*;
import java.util.*;
class Main{
static int arr[]= new int[1000];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
int cnt=0;
StringTokenizer st = new StringTokenizer(br.readLine()," ");
while(st.hasMoreTokens()) {
boolean result = true;
int num = Integer.parseInt(st.nextToken());
if(num==1) {
continue;
}
for(int i=2;i<= Math.sqrt(num);i++) {
if(num % i == 0) {
result = false;
break;
}
}
if(result) {
cnt++;
}
}
System.out.println(cnt);
}
}
위와 같다.
Math 함수는 아래를 보자.
https://blog.naver.com/lamkid90/222704646166
hasMoreTokens는 아래에서 확인하자
https://crazykim2.tistory.com/473
(StringTokenizer에 토큰이 있어? => true 없어? =>false)
소수에는 규칙이 있다.
11의 값이 들어왔다고 하자. 11의 제곱근은 약 3.46이다. 4이상 부터는 2 또는 3이 몫이 되어서 약수가 되지 않거나, 나누어 떨어져서 약수가 되어 검사할 필요가 없다.
53을 보자. 53은 소수이다. 제곱근은 약7.29이며, 2,3,4,5,6,7 중에서 나누어 떨어지지 않는다면 그 이상에서도 나누어 떨어지지 않는다.
그러면 약수가 아닌 52를 보자. 52의 제곱근은 약 7.28이다. 2,3,4,5,6,7중 2,4는 벌써 52의 약수이다. 7 이후의 수를 나눠주는 것은 의미가 없다.
수학적으로 접근하면
12( 제곱근:3.46 )을 2 x 3 의 합성수라고 보면 2는 1보다 크고 3은 12보다 작다. ( 1 ≤ 2, 3 < 12 )
만약 여기서 2와 3이 제곱근 보다 커진다면 4 x 5는 12보다 커져 12가 될 수 없다.
단순하게 생각하자. 소수는 제곱근 보다 큰 수에서 비교할 필요가 없다.
+ 제곱근 이상의 수는 구하고자하는 수의 값을 넘어서서 절대 약수가 될 수 없다. 그래서 비교 의미가 없다.
12 => 3 * 3 =9 4 * 4 =16 (모순)
이것 말고도 다른 방법이 있으나 아직 어렵다.
시간은 아래가 더 빠른다.
59. 2581
import java.io.*;
import java.util.*;
class Main{
static int arr[]= new int[1000];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int M= Integer.parseInt(br.readLine());
int N= Integer.parseInt(br.readLine());
int sum=0,first=0;
for(int num=M;num<=N;num++) {
int cnt=0;
for(int i=1;i<=num;i++) {
if(num % i == 0) {
cnt+=1;
}
}
if(cnt==2) {
sum+=num;
} // 소수인 아이들 더해줌
if(sum==num) {
first=num;
} // 처음 값은 first에 저장해줌
}
if(sum==0) {
System.out.println(-1);
}
else {
System.out.println(sum);
System.out.println(first);
}
}
}
솔직히 소수는 위와 같은 방법이 편한거 같다.
import java.io.*;
import java.util.*;
class Main{
static int arr[]= new int[1000];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int M= Integer.parseInt(br.readLine());
int N= Integer.parseInt(br.readLine());
int sum=0,first=0;
for(int num=M;num<=N;num++) {
int cnt=0;
boolean result = true;
if(num==1) {
continue;
}
for(int i=2;i<=Math.sqrt(num);i++) {
if(num % i == 0) {
result =false;
break;
}
}
if(result) {
sum+=num;
} // 소수인 아이들 더해줌
if(sum==num) {
first=num;
} // 처음 값은 first에 저장해줌
}
if(sum==0) {
System.out.println(-1);
}
else {
System.out.println(sum);
System.out.println(first);
}
}
}
시간은 이게 더 빠름
60. 11653
import java.io.*;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
for(int i=2;i<=Math.sqrt(N);i++) {
while((N%i)==0) {
sb.append(i).append('\n');
N /= i;
}
}
if(N != 1) {
sb.append(N); //제곱근 까지 반복문이 수행되므로, 나머지 값을 저장.
}
System.out.println(sb);
}
}
61. 4948
import java.io.*;
import java.util.StringTokenizer;
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 M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
for(int num=M;num<=N;num++) {
boolean B = true;
if(num==1) {
continue;
}
for(int i=2;i<=Math.sqrt(num);i++) {
if(num%i==0) {
B = false;
break;
}
}
if(B) {
System.out.println(num);
}
}
}
}
크게 설명이 필요하지 않다.
62. 4948
import java.io.*;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while(true) {
int n = Integer.parseInt(br.readLine());
int cnt =0;
if(n==0) {
break;
}
for(int num=(n+1);num<=(2*n);num++) {
boolean B = true;
if(num==1) {
continue;
}
for(int i=2;i<=Math.sqrt(num);i++) {
if(num%i==0) {
B = false;
break;
}
}
if(B) {
cnt++;
}
}
sb.append(cnt).append('\n');
}
System.out.println(sb);
}
}
다 좋은데 시간이 조금 느리다.
63. 9020
import java.io.*;
class Main{
public static boolean[] arr = new boolean[10001];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
get_prime(); // 배열에 소수가 아니면 true, 소수면 false을 입력
int T = Integer.parseInt(br.readLine());
for(int i=0;i<T;i++) {
int n = Integer.parseInt(br.readLine());
int A = n/2, B = n/2;
while(true) {
if(!arr[A]&&!arr[B]) {
sb.append(A).append(' ').append(B).append('\n');
break;
}
A--;
B++;
}
}
System.out.println(sb);
}
public static void get_prime() {
arr[0]=arr[1]=true;
for(int i=2;i<Math.sqrt(arr.length);i++) {
if(arr[i]) {
continue;
// 이미 판별된 값들은 지나친다.
// (i가 4일때, 2의 배수로 소수를 판멸하여 건너뛴다.)
}
for(int j = i*i;j<arr.length;j+=i) {
arr[j]=true;
// i의 배수들은 i를 약수로 가져 소수가 아니다.
}
}
}
}
기존 제곱근 방법을 이번 문제에 적용시키면 알고리즘이 복잡해지고 시간이 많이 걸릴 것이다.
그래서 블로그에서 소개시켜준 마지막 방법을 사용해봤다.
에베르토스테네스의 체이다.
2의 배수는 2의 약수여서 소수가아니다.
3의 배수는 3의 약수여서 소수가아니다.
4는 이미 2를 약수로 갖는다.
5의 배수는 5의 약수여서 소수가아니다........
이 방법을 이용한 것이고, 제곱근 이후 값은 (1978)번 문제에서 설명한 것과 같이 비교가 필요 없다.
따라서 시간이 많이 절약된다. O(N(log(logN)))
64. 1085
매우 간단하지만 math.min함수를 모르면
import java.io.*;
import java.util.StringTokenizer;
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 x=Integer.parseInt(st.nextToken());
int y=Integer.parseInt(st.nextToken());
int w=Integer.parseInt(st.nextToken());
int h=Integer.parseInt(st.nextToken());
int A=x-0,B=w-x,C=y-0,D=h-y;
if(A<=B && A<=C && A<=D) {
System.out.println(A);
}
else if(B<=A && B<=C && B<=D) {
System.out.println(B);
}
else if(C<=A && C<=B && C<=D) {
System.out.println(C);
}
else {
System.out.println(D);
}
}
}
A,C는 안써줘도 됨
만약 math.min 함수를 안다면
import java.io.*;
import java.util.StringTokenizer;
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 x=Integer.parseInt(st.nextToken());
int y=Integer.parseInt(st.nextToken());
int w=Integer.parseInt(st.nextToken());
int h=Integer.parseInt(st.nextToken());
int x_min = Math.min(x, w-x);
int y_min = Math.min(y, h-y);
System.out.println(Math.min(x_min, y_min));
}
}
65. 3009
어렵지는 않다.
비트연산자를 이용하면 (XOR 연산자 -> ^)
import java.io.*;
import java.util.StringTokenizer;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int x=0,y=0;
for(int i=0;i<3;i++) {
st = new StringTokenizer(br.readLine()," ");
x ^= Integer.parseInt(st.nextToken());
y ^= Integer.parseInt(st.nextToken());
}
System.out.println(x+" "+y);
}
}
근데 신기한게. xor 연산을 쓰지 않고 풀이한게 더 빠르다;;
import java.io.*;
import java.util.StringTokenizer;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int x[]=new int[6];
for(int i=0;i<6;i+=2) {
st = new StringTokenizer(br.readLine()," ");
x[i] = Integer.parseInt(st.nextToken());
x[i+1] = Integer.parseInt(st.nextToken());
}
if(x[0]==x[2]) {
sb.append(x[4]).append(' ');
}
else if(x[2]==x[4]){
sb.append(x[0]).append(' ');
}
else {
sb.append(x[2]).append(' ');
}
if(x[1]==x[3]) {
sb.append(x[5]);
}
else if(x[3]==x[5]){
sb.append(x[1]);
}
else {
sb.append(x[3]);
}
System.out.println(sb);
}
}
어쨋든 연산자 추가적인 공부는 아래를 참조하자.
https://phantom.tistory.com/19
66. 4153
import java.io.*;
import java.util.StringTokenizer;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while(true) {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int C = Integer.parseInt(st.nextToken());
if(A==0 && B==0 && C==0) {
break;
}
if(((A*A+B*B)==C*C)||((A*A+C*C)==B*B)||((C*C+B*B)==A*A)) {
sb.append("right").append("\n");
}
else {
sb.append("wrong").append("\n");
}
}
System.out.println(sb);
}
}
무지 쉽다. 근데 right를 rigth로 써서 틀렸다.. ㅋㅋㅋ;;;;
67. 3053
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double R = Double.parseDouble(br.readLine());
double pi = Math.PI;
System.out.printf("%.6f\n",pi*R*R);
System.out.printf("%.6f",R*R+R*R);
}
}
68. 1002
import java.io.*;
import java.util.StringTokenizer;
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 x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int r1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
int r2 = Integer.parseInt(st.nextToken());
sb.append(target(x1, y1, r1, x2, y2, r2)).append('\n');
}
System.out.println(sb);
}
public static int target(int x1, int y1, int r1,int x2, int y2, int r2) {
int distance = (int)((Math.pow(x2-x1, 2)) + (Math.pow(y2-y1, 2)));
if(x1 == x2 && y1 == y2 && r1==r2) return -1;
else if(distance > Math.pow(r1+r2, 2)) return 0;
else if(distance < Math.pow(r2-r1, 2)) return 0;
else if(distance == Math.pow(r2-r1, 2)) return 1;
else if(distance == Math.pow(r1+r2, 2)) return 1;
else return 2;
}
}
1) 위치 가능성 무한대
𝑥₁ = 𝑥₂, 𝑦₁ = 𝑦₂, 𝑟₁ = 𝑟₂
2) 위치 가능성 없음
(𝑥₂ - 𝑥₁)² + (𝑦₂ - 𝑦₁)² > (𝑟₁ + 𝑟₂)²
(𝑥₂ - 𝑥₁)² + (𝑦₂ - 𝑦₁)² < (𝑟₂ - 𝑟₁)²
3) 위치 가능성 1
(𝑥₂ - 𝑥₁)² + (𝑦₂ - 𝑦₁)² = (𝑟₂ - 𝑟₁)²
(𝑥₂ - 𝑥₁)² + (𝑦₂ - 𝑦₁)² = (𝑟₂ + 𝑟₁)²
69. 10872 (팩토리얼)
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
System.out.println(pactorials(N));
}
public static int pactorials(int N) {
if(N < 1) {
return 1;
}
else {
int n=N-1;
return N*pactorials(n);
}
}
}
재귀함수 활용
70 . 10870 (피보나치 수열)
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
System.out.println(fibonacci(n));
}
public static int fibonacci(int n){
if(n==1 || n==2) {
return 1;
}
else if (n==0) {
return 0;
}
else {
return fibonacci(n-1)+fibonacci(n-2);
}
}
}
재귀함수 활용
71. 2447
쉬운데 느림
import java.io.*;
class Main{
static StringBuilder sb = new StringBuilder();
public static void star(int x, int y, int n) {
if((x / n) % 3 == 1 && (y / n) % 3 == 1){
sb.append(" ");
}
else if(n / 3 == 0) {
sb.append("*");
}
else {
star(x, y, n/3);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
star(i, j, n);
}
sb.append('\n');
}
System.out.println(sb);
}
}
어려운데 빠름
import java.io.*;
class Main{
static char[][] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
arr = new char[N][N]; //정사각형
star(0, 0, N, false); // 초기값
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
sb.append(arr[i][j]);
}
sb.append('\n');
}
System.out.println(sb);
}
public static void star(int x, int y, int N, boolean blank){
if(blank) {
for(int i=x; i< x+N; i++) {
for(int j = y; j<y+N; j++) {
arr[i][j] = ' ';
}
}
return;
}
if(N == 1) { //더이상 3으로 나눠지지 않을 때
arr[x][y] = '*';
return;
}
int size = N / 3;
int cnt = 0;
for(int i=x; i<x+N; i+=size) {
for(int j=y; j<y+N; j+=size) {
cnt++;
if(cnt == 5) {
star(i, j, size, true);
}
else {
star(i, j, size, false);
}
}
}
}
}
배열을 이용한 방법과 나머지를 이용한 방법이다.
두 방법 모두 자바는 나누기를 따로 선언하지 않으면 소수점은 버리는 점을 이용한 것이다.
예를 들어 10/3 은 3.xx 나오지만 0.xx는 버려 3이 나온다.
쉬운 로직으로 설명하면.
위의 그림에서 x축과 y축을 3으로 나눴을 때 1이 나왔을 경우를 만족 했을 때 *이 표시 되지 않는다.
그 점을 이용한 것이다.
만약 위 조건이 해당되지 않는다면 *을 표시한다. 해당 되지 않는 조건은 입력받은 n을 3으로 계속 나눠주면서
마지막에 1/3 는 0이 표시 되기 때문에 n==0이면 *을 표시하는 것이다.
반복문을 통해도 처리가 가능하지만, 재귀 함수를 이용한 처리 방식이다.
72. 11729
import java.io.*;
class Main{
static int cnt = 0;
static StringBuilder sb = new StringBuilder();
public static void Hanoi(int n, int top, int mid, int bot) {
cnt++;
if(n==1) {
sb.append(top).append(' ').append(bot).append('\n');
return;
}
else {
Hanoi(n-1, top, bot, mid); // 1 3 2
sb.append(top).append(' ').append(bot).append('\n');
Hanoi(n-1, mid, top, bot); // 2 1 3
}
//print는 top , bot 고정 시킨 후 이동
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Hanoi(N, 1, 2, 3);
System.out.println(cnt + "\n" + sb);
}
}
출력 결과는 몇번에서 몇번으로 이동했는지를 표시해준다.
다음 같이 진행된다.
print 에서 top bot 위치는 고정이다.
1 2 가 출력 되기 위해 top bot mid 1 3 2 로 바꿔줘야한다.
3 2 가 출력 되기 위해 위에 1 3 2 에서 3 1 2 로 바꿔 줘야 한다.
위 표를 보면 mid -> top , top -> mid로 바꿔준 것을 알 수 있다.
따라서 mid top bot이 된다.
(실제 실행 순서는 6번 5번으로 진행됨)
73. 2798
import java.io.*;
import java.util.*;
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 M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
int max = 0;
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
for(int i=0; i<N-2; i++) {
for(int j=1+i; j<N; j++) {
for(int k=1+j; k<N; k++) {
int sum = arr[i]+arr[j]+arr[k];
if(sum > max && sum <= M) {
max = sum;
}
}
}
}
System.out.println(max);
}
}
조금 생각해보면 크게 어렵지 않은 문제
74. 17478
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Main{
static String under = "";
public static void re(int N) {
String line = under;
if(N==0) {
System.out.println(line + "\"재귀함수가 뭔가요?\"");
System.out.println(line + "\"재귀함수는 자기 자신을 호출하는 함수라네\"");
System.out.println(line + "라고 답변하였지.");
return;
}
System.out.println(line +"\"재귀함수가 뭔가요?\"");
System.out.println(line +"\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.");
System.out.println(line +"마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.");
System.out.println(line +"그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"");
under += "____";
re(N-1);
System.out.println(line+"라고 답변하였지.");
}
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
re(N);
}
}
재귀함수가 뭔지 알 수 있는 문제
75. 25083
class Main{
public static void main(String[] args) {
System.out.println(" ,r'\"7");
System.out.println("r`-_ ,' ,/");
System.out.println(" \\. \". L_r'");
System.out.println(" `~\\/");
System.out.println(" |");
System.out.println(" |");
}
}
76. 2231
import java.io.*;
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 result = 0;
for(int i=0; i<N; i++) {
int num = i;
int sum = 0;
while(num!=0) {
sum += num % 10;
num /= 10;
// 각 자리수를 더해주기 위함
}
if((sum + i)==N) {
result = i;
break;
}
}
System.out.println(result);
}
}
브루트 포스 : 하나씩 대입하면서 암호를 해독 하는 방법
77. 7568
import java.io.*;
import java.util.StringTokenizer;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int cnt;
int arr_1[] = new int[N];
int arr_2[] = new int[N];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine(), " ");
arr_1[i] = Integer.parseInt(st.nextToken());
arr_2[i] = Integer.parseInt(st.nextToken());
}
for(int i=0; i<N; i++) {
cnt=1;
for(int j=0;j<N; j++) {
if(arr_1[i]<arr_1[j] && arr_2[i]<arr_2[j]) {
cnt++;
}
}
sb.append(cnt).append(' ');
}
System.out.println(sb);
}
}
문제만 이해하면 크게 어렵지 않다.
78. 1018
import java.io.*;
import java.util.StringTokenizer;
class Main{
public static boolean[][] arr;
public static int min = 64;
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 M = Integer.parseInt(st.nextToken());
arr = new boolean[N][M];
for(int i=0; i<N; i++) {
String str = br.readLine();
for(int j=0;j<M;j++) {
if(str.charAt(j)=='W') {
arr[i][j] = true;
}
else {
arr[i][j] = false;
}
}
}
int N_row = N-7;
int M_col = M-7;
for(int i=0; i< N_row; i++) {
for(int j=0;j< M_col;j++) {
find(i,j);
}
}
System.out.println(min);
}
public static void find(int x, int y) {
int end_x = x + 8;
int end_y = y + 8;
int cnt = 0;
boolean TF = arr[x][y];
for(int i=x; i<end_x; i++) {
for(int j=y;j<end_y;j++) {
if(arr[i][j] != TF) {
cnt++;
}
TF=(!TF); /다음 패턴은 W면 B가 B면 W가 되므로,
}
TF=(!TF);
}
cnt = Math.min(cnt, 64 - cnt);
min = Math.min(min, cnt);
}
}
처음 접해서 어려웠음. 근데 쉬운 문제래...
8*8의 체스판을 만들기 위함으로 8*8 WB혹은 BW 패턴에서 맞지 않는 패턴이 가장 적은 쪽을 잘라서 사용함.
먼저 boolean을 통해서 입력받은 값을 저장하고, 비교를 한다.
그후 find 에서 비교하기 되는데 로직은 그림처럼 진행된다.
(로직이 N-7, M-7이 나오는 이유는 8*8체스판을 찾기 위함이고 아래 그림을 보면 더 이해가 갈것이다.)
검정 -> 주황 -> 빨강 -> .... 순으로 가장 체스판 패턴과 적합한 부분을 찾는다(Math.min을 통해서)
결과 값은 찾은 가장 적합한 체스판 패턴에서 고쳐야 할 부분이다.
따라서,
다음과 같이 중간에 체스판 패턴이 있으니 맨뒤에 WWW가 있든 말든 다시 칠해야 할 부분은 0 이 된다.
79. 1436
import java.io.*;
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 num = 666;
int cnt = 1;
while(cnt != N) {
num++;
if(String.valueOf(num).contains("666")) {
cnt++;
}
}
System.out.println(num);
}
}
※ contains() : 찾고자하는 문자열이 있는지 확인한다.
문자열 변환 함수는 toString() , String.valueof(), (String)이있다.
하지만 다음과 같은 문제가 있다.
int intNum = 1;
Object objNull = null;
Object objnum = new Integer(1);
// toString
String str1 = intNum.toString(intNum); // 컴파일 에러
String str2 = objNull.toString(); // NullPointerException
String str3 = objnum.toString();
// (String)
String str4 = (String)intNum; // 컴파일 에러
String str5 = (String)objNull;
String str6 = (String)objnum; // ClassCastException
// String.valueOf()
String str7 = String.valueOf(intNum);
String str8 = String.valueOf(objNull);
String str9 = String.valueOf(objnum);
즉, String.valueOf()가 문자열 변환이 어떠한 것이든 문제 없이 가능하다.
속도가 느리지만 간단한 코드. (666x x666 x666x)만 비교하는 방법은 후에 살펴보자.
80. 2750
import java.io.*;
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];
int temp = 0;
for(int i=0;i<N;i++) {
arr[i] = Integer.parseInt(br.readLine());
}
for(int i=0;i<N;i++) {
for(int j=i;j<N;j++) {
if(arr[j] < arr[i]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for(int i=0; i<N; i++) {
System.out.println(arr[i]);
}
}
}
삽입 정렬.
81. 2751
(1) 컬렉션 프레임 워크 이용 (Collections.sort())
import java.io.*;
import java.util.*;
class Main{
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
ArrayList<Integer> al = new ArrayList<>();
for(int i=0;i<N;i++) {
al.add(Integer.parseInt(br.readLine()));
}
Collections.sort(al);
for(int i : al) {
sb.append(i).append('\n');
}
System.out.println(sb);
}
}
(2) counting sort 이용
import java.io.*;
import java.util.*;
class Main{
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
boolean[] arr = new boolean[2000001];
// 기준점 0 = 1000000 범위는 -1000000~ 1000000
int N = Integer.parseInt(br.readLine());
for(int i=0; i < N; i++) {
arr[Integer.parseInt(br.readLine())+1000000] = true;
}
for(int i=0; i < arr.length; i++) {
if(arr[i]) {
sb.append((i-1000000)).append('\n');
}
}
System.out.println(sb);
}
}
(2) 의 알고리즘은 아래와 같다.
Collections.sort는 Timsort 기반으로 O(N) ~ O(NlogN) 의 시간복잡도를 보장한다.
카운팅 정렬은 O(N)의 시간 복잡도를 보장한다.
백준에서는 카운팅 정렬을 이용하자. (실생활에서는 퀵정렬이나 팀 정렬을 이용한다.)
82. 10989
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int [] B = new int[10001];
int N = Integer.parseInt(br.readLine());
for(int i=0; i<N; i++){
B[Integer.parseInt(br.readLine())]++;
}
for(int i=1; i<B.length; i++){
while(B[i] > 0){
sb.append(i).append('\n');
B[i]--;
}
}
System.out.println(sb);
}
}
인덱스 값을 따져줌. 중복이 나오면 해당 인덱스의 값은 1이 증가하고 마지막에 배열에 저장할 때, 인덱스의 값에 따라 저장해 줄 수 있음..
83. 2108
package BackJoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int [] arr = new int[8001];
int N = Integer.parseInt(br.readLine());
int sum = 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int median = 10000;
int mode = 10000;
for(int i=0; i<N; i++){
int value = Integer.parseInt(br.readLine());
sum += value;
arr[value + 4000]++;
if(max < value){
max = value;
}
if(min > value){
min = value;
}
}
int cnt = 0;
int mode_max = 0;
boolean flag = false;
for(int i = min + 4000; i <= max + 4000; i++ ){
if(arr[i] > 0){
if(cnt < (N+1) / 2 ) {
cnt += arr[i];
median = i - 4000;
}
if(mode_max < arr[i]){
mode_max = arr[i];
mode = i - 4000;
flag = true;
}
else if(mode_max == arr[i] && flag == true){
mode = i - 4000;
flag = false;
}
}
}
System.out.println((int)Math.round((double)sum / N));
System.out.println(median);
System.out.println(mode);
System.out.println(max - min);
}
}
84. 1427
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int [] arr = new int[101];
String S = br.readLine();
for(int i=0;i<S.length();i++){
arr[Character.getNumericValue(S.charAt(i))]++;
}
for(int i=arr.length-1;i>=0;i--){
while(arr[i] > 0){
sb.append(i);
arr[i]--;
}
}
System.out.println(sb);
}
}
char -> Int 변환
https://frhyme.github.io/java/java_basic02_char_to_int/
85. 11650
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int [][] arr = new int [N][2];
StringTokenizer st;
for(int i=0; i < N; i++){
st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
// Comparator
// 오버라이딩
Arrays.sort(arr, (e1, e2) ->{
if(e1[0] == e2[0]){
return e1[1] - e2[1];
// 두 객체를 비교, e1이 크면 양수를 작으면 음수를 같으면 0을 리턴함
} else {
return e1[0] - e2[0];
}
});
// 리턴된 값이 Arrays.sort로 인해 순서가 정리됨.
// 양수 : 위치를 바꿈 0, 음수 : 위치를 바꾸지 않음
for(int i = 0; i < N; i++){
sb.append(arr[i][0]+ " " +arr[i][1]+"\n");
}
System.out.println(sb);
}
}
람다식을 이용하였다.
람다함수 : 코드를 보다 단순하게 표현하는 방법이다.
만약 람다식으로 쓰지 않았다면
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] e1, int[] e2) {
if(e1[0] == e2[0]) { // 첫번째 원소가 같다면 두 번째 원소끼리 비교
return e1[1] - e2[1];
}
else {
return e1[0] - e2[0];
}
}
});
Comparator의 개념
https://st-lab.tistory.com/243
86. 11651
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
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;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int [][] arr = new int[N][2];
for(int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine()," ");
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr , (e1, e2)->{
if(e1[1] == e2[1]){
return e1[0] - e2[0];
}
else{
return e1[1] - e2[1];
}
});
// 0이 x 1이 y 이므로 이전 문제에서 위치만 바꿔줌
for(int i = 0; i < N; i++){
sb.append(arr[i][0] + " " + arr[i][1] + "\n");
}
System.out.println(sb);
}
}
87. 1181
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
String[] s = new String[N];
for(int i = 0; i < N; i++){
s[i] = br.readLine();
}
Arrays.sort(s, new Comparator<String>() {
//override
public int compare(String s1, String s2){
if(s1.length() == s2.length()){
return s1.compareTo(s2); // 사전 순으로 정렬함.
}
// 길이가 같지 않은 경우
else{
return s1.length() - s2.length();
}
}
});
sb.append(s[0] + "\n");
for(int i = 1; i < N; i++){
if(!s[i].equals(s[i-1])) {
sb.append(s[i] + "\n");
}
}
System.out.println(sb);
}
}
만약 람다식으로 바꾼다면
Arrays.sort(s, (s1 ,s2)-> {
//override
if(s1.length() == s2.length()){
return s1.compareTo(s2); // 사전 순으로 정렬함.
}
// 길이가 같지 않은 경우
else {
return s1.length() - s2.length();
}
});
정렬하기 글을 봐 보자
https://www.daleseo.com/java-comparable-comparator/
'문제 > 백준_자바' 카테고리의 다른 글
93. 10816(숫자 카드2) (0) | 2022.06.20 |
---|---|
92. 1620(나는야 포켓몬 마스터 이다솜) (0) | 2022.06.19 |
91. 14425 (문자열 집합) (0) | 2022.06.19 |
90. 10815(숫자카드) (0) | 2022.06.19 |
[단계별] 백준 (답) java (88~) (0) | 2022.05.06 |