728x90

-----------------------------------백준------------------------------

(1)별 찍기 - 1

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

 

내답 ) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package stringTest;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class 별찍기1 {
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.valueOf(reader.readLine());
        StringBuilder sb = new StringBuilder(n*(n+1)/2+n);
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=i;j++
                sb.append('*');
            sb.append('\n');
        }
        System.out.println(sb);
        //test
        System.out.println("sb.capacity() : "+sb.capacity());
        System.out.println("sb.length() : "+sb.length());
    }
}
 
cs

문자열 끝부분 추가이벤트가 빈번하여 StringBuilder를 이용해주었고 ,

StringBuilder의 새로운배열 생성을 막기위해서 기본크기를 n*(n+1)/2 + n  으로 지정해주었다

 

 

(2)더하기 사이클

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력

첫째 줄에 N의 사이클 길이를 출력한다.

 

내 1차답 ) - 문자열 , char , 숫자 혼용하여 풀었다.. 어우 복잡해.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class 더하기사이클 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String nString=reader.readLine();
        String baseString=new String(nString);
        
        for(int i=1;;i++) {
            char first= (baseString.length()>1) ? baseString.charAt(0) : '0'
            char second=(baseString.length()>1) ? baseString.charAt(1) : baseString.charAt(0);
            char[] cs = {second, (char)((first+second-'0'-'0')%10 +'0') };
            baseString=(second!='0') ? new String( cs ) : new String( cs[1]+"") ; 
            if(nString.equals(baseString)) {
                System.out.println(i);
                break;
            }
        }
    }
}
 
cs

 

내 2차답 ) -  숫자로 변환하여 처리  ( 효율적 ) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class 더하기사이클 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int nInt=Integer.valueOf(reader.readLine());
        int baseInt = nInt;
        for(int i=1;;i++) {
            int firstInt = (baseInt>=10)?baseInt/10:0;
            int secondInt = baseInt%10;     
            int sumInt = firstInt + secondInt;        
            baseInt=secondInt*10+sumInt%10;
            if(baseInt==nInt) {
                System.out.println(i);
                break;
            }
        }
    }
}
 
cs

 

bea1799 님의 답안 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.*;
import java.util.*;
 
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 X = N;
        int cycle = 0;
        do{
            cycle++;
            if(N < 10){
                N = (N * 10+ N;
                //System.out.println(N);
            } else{
                N = (N % 10* 10 + (((N / 10+ (N % 10)) % 10);
                //System.out.println(N);
            }
 
        }while(X != N);
        System.out.println(cycle);
    }
}
cs

내 답안 2와 형식이 비슷하다.

 

 

 

(3)숫자의 개수 (下)

문제

세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

출력

첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class 숫자의개수 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
        int[] ansAry=new int[10]; 
        int total=1;
        for(int i=1;i<=3;i++)
            total*=Integer.valueOf(reader.readLine());
        String totalStr=String.valueOf(total);
        for(int i=0;i<totalStr.length();i++) {
            int idx=totalStr.charAt(i)-'0';
            ansAry[idx]+=1;
        }
        for(int i : ansAry)
            System.out.println(i);
    }
}
 
cs

별거없다 , 문자열 기초 문제였다.

 

(4) 숫자의합 (下)

문제

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

출력

입력으로 주어진 숫자 N개의 합을 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class 숫자의합 {
    public static void main(String[] args) throws IOException{
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        int nLen=Integer.valueOf(reader.readLine());
        String nStr=reader.readLine();
        int answer=0;
        for(int i=0;i<nLen;i++) {
            answer+=nStr.charAt(i)-'0';
        }
        System.out.print(answer);
    }
}
cs

문자열통으로 읽어와서 하나하나더해준 것이 끝,  기초 문자열 문제

 

ksj3452 님의 답 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.IOException;
import java.io.InputStream;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        InputStream is = System.in;
        while(is.read() != '\n');
        int sum = 0;
        int cur;
        while ((cur = is.read()) != '\n') {
            sum += cur - 48;
        }
        System.out.println(sum);
    }
 
}
cs

이 분은 Stream으로 입력을 받아오게 코드 하셨다.

InputStream은 JDK 1.0  1996년에 출현하셨다.

is.read() 는 1바이트를 읽어와서 아스키값(int)를 반환한다.

8 줄 같이 작성하신건 , 첫입력값인 N이 필요없어서 날리는 작업을 진행하신것이다.

 

InputStream에 대한 참고용도 사이트

 

(5) OX퀴즈 (中下)

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력

각 테스트 케이스마다 점수를 출력한다.

 

내답 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class OX퀴즈 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        int caseNum=Integer.valueOf(reader.readLine());
        for(int i=1;i<=caseNum;i++) {
            StringTokenizer tokenizer=new StringTokenizer(reader.readLine(), "X");//X가 1개든 , X가 2개이상이든 내가원하는 대로 구분해줌
            int total=0;
            while(tokenizer.hasMoreTokens()) {
                int seqLen=tokenizer.nextToken().length();
                total+= seqLen*(seqLen+1)/2;
            }
            System.out.println(total);
        }
    }
}
cs

StringTokenizer를 이용하여 연속된 'O'의 갯수를 구분해주었다.

15 번째 줄의 n(n+1)/2 공식을 이용하여 연속된 O일 경우의 성적을 도출 하였다.

출력시간 136 ms.

ps1)  BuildWriter를 이용해보았으나 , 더 많은 시간이 들었다. 아마 BuildWriter를 이용하기 위해 생성하는 객체의 코스트가 기존출력비용보다 더 높은 것 같다.

ps2) StringBuilder 를 이용하여 total 와 '\n' 을 메서드체이닝하여 append 해줘봤으나  기존코드와 큰 차이가 없었다.

 

결론 .  알고리즘 구조가 랭커들 코드보다 아주 약간 성능이 떨어지는것 같다. 

 

 

tkddnjs8521 님의 답 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 test_case = Integer.parseInt(br.readLine());
        for(int i = 0; i < test_case; i++) {
            int cnt = 0;
            int sum = 0;
            for(byte value : br.readLine().getBytes()) {
                if(value == 'O') {
                    cnt++;
                    sum += cnt;
                }
                else {
                    cnt = 0;
                }
            }
            sb.append(sum).append("\n");
        }
        System.out.println(sb);
    }
}    
cs

13 번재 줄의 br.readLine() 의 결과값은 String ,    getBytes() 는 String 을 byte[] 로 반환해준다.

13 번재 줄의 반복문을 보면 , OX 문장한줄의 원소하나씩 접근해서 처리해주었다.

22 번재 줄에서는 메소드 체이닝으로 sum과 '개행문자'를 넣어주었다.

 

(6) 단어의 개수(中)

문제

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

출력

첫째 줄에 단어의 개수를 출력한다.

 

내답1 ) 

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class 단어의개수{
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String string=reader.readLine().trim();
        StringTokenizer tokenizer = new StringTokenizer(string, " ");
        System.out.println(tokenizer.countTokens());
    }
}
cs

문자열을 한줄 받고 -> 공백으로 토큰을 구분해주고 -> tokenizer.countTokens() 를 이용하여 토근들의 갯수를 반환

메모리 19392KB  , 248ms 소요

 

하지만 탑랭커에 비해서 보다많은 메모리와 ,시간이 소요 되었다 ,  

trim내부 substring의 코스트와 ,  StringTokenizer 자체의 토큰들 생성에 코스트가 있는것 같다. 

 

내답 2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package stringTest;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class 단어의개수{
    public static void main(String[] args) throws IOException{
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        int curInt;
        int beforeInt;
        int cnt=0;
        beforeInt=reader.read();
        cnt+=(beforeInt!=' ')?1:0//첫시작이 문자일경우 바로 1추가
        while( (curInt=reader.read())!='\n') {
            if(beforeInt==' ' && curInt!=' ')
                cnt++;
            beforeInt=curInt;
        }
        System.out.println(cnt);
    }
}
 
cs

원소 하나하나씩 접근으로 풀어보았다 

분기점은 이전문자값(beforeInt)==공백이면서 현재문자값(curInt)==문자 일경우 , cnt++ 해주었음

14 번재줄을 보면 , 문자열의 첫 시작이 문자인 경우는 예외 케이스로 정하였기 때문에 따로 처리 해줌

메모리 16932KB  , 212ms 소요로 개선하였음

 

otis 님의 답 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException
    {
        int previous_ch = 32;//공백 ASCII
        int count =0;
        while(true)
        {
            int ch = System.in.read();
            if(ch==32)//공백 ASCII
            {
                if(previous_ch!=32)
                    count++;
            }
            if(ch==10//LF = 개행 
            {
                if(previous_ch!=32)
                    count++;
                break;
            }
            previous_ch = ch;  
        }
        System.out.println(count);
    }
}
cs

이분은 입력값을 하나하나 읽는 방식으로 해결하셨다

System.in.read() 는 문자를 하나씩읽어서 아스키(int형) 으로 반환 해준다 ( 9번재 줄) 

 

현재 입력값 ch 와 이전입력값 previous_ch를 두어서 count되는 시점을 조정하셨다

count++ 되는 시점은 아래 두가지 경우와 같다

  previous_ch 의 초깃값을 32으로 줌으로써 , 입력값의 시작이 공백인 경우를 제외 시켜줄수 있게 코드를 짜셨다는 것도

눈여겨볼 수 있다

 

( ASCII표System.in.read() 에 대한 설명참고 )

( System.in.read() 는 '개행'을 기준으로 구분되며 , 사용자가 엔터를 쳤을시 엔터도 버퍼에 들어간다 -_-

재밌는건 OS 에 따라 엔터가 CR+LF 일수도 있고 LF 만일수도 있는데 ㅋㅋ

내가 알기로 window의 엔터 = CR+LF ,  Linux계열의 엔터는 = LF )

 

(7)알파벳 찾기(中下) 

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

 

내 답) 두가지 경우로 풀어 보았다

a~z 에 매칭되는 인덱스사이즈 26의 배열생성후 -1로 초기화 , 배열의 값은 최초문자 위치 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class 알파벳찾기 {
    public static void main(String[] args) throws IOException{
        BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
        int aToz[]=new int[26];
        Arrays.fill(aToz, -1);
        char[] cs=reader.readLine().toCharArray();
        for(int i=0;i<cs.length;i++) {
            int spellNum=cs[i]-'a';
            if(aToz[spellNum]==-1) aToz[spellNum]=i;
        }
        for(int ans : aToz) {
            System.out.print(ans);
            System.out.print(' ');
        }
    }
}
 
cs

 

답 2) reader.read()를 이용하여 한문자씩 처리해보았다 , 속도는 답1과 비슷비슷.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class 알파벳찾기 {
    public static void main(String[] args) throws IOException{
        BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
        int aToz[]=new int[26];
        Arrays.fill(aToz, -1);
        int asc,count=0;
        while( (asc=(char)reader.read())!=13){ //13==CF  윈도우는 '\n'==CR+LF 이다 , 리눅스는 LF
            int spellNum=asc-'a';
            if(aToz[spellNum]==-1) aToz[spellNum]=count;
            count++;
        }
        for(int ans : aToz) {
            System.out.print(ans);
            System.out.print(' ');
        }
    }
}
cs

특이사항으로는 , 백준은 개행을 LF ,  윈도우환경에서는 CR+LF로 다르다는 점

 

alswhdgus9 님의 답 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class 알파벳찾기 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        String S = br.readLine();
        char[] chArr = S.toCharArray();//입력 문자열 
 
        for (char ch = 'a'; ch <= 'z'; ch++) {
            int i;
            if(ch != 'a') bw.write(' '); //문자 'a'가 아니면 공백출력예약
            for(i =0;i<chArr.length;i++) {
                if(chArr[i] == ch) { // chArr에서 일치하는 최초문자 발견하자마자 출력예약후 break
                    bw.write(String.valueOf(i)); 
                    break;
                }
            }
            if(i == chArr.length) bw.write("-1"); //i 가 chArr의 끝길이 까지 도달했따면 , -1 을 출력
        }
 
        bw.flush();
        bw.close();
        br.close();
    }
}
cs

BufferedWriter 를 이용하여 출력하셨다 , 

17 번째 줄을 이용하여 첫시작은 공백이외의 값이 나오도록 하셨고,

15 번재줄에서 'a' ~ 'z' 순서로 1중 반복문 , 18번재 줄에서 chArr원소에 일일히 접근하는 2중 반복문을 두셧다.

개인적인 생각으로 , 2중 반복문을 통해서 charArr의 첫원소부터 검사하는 것을 매 반복마다 수행할텐데 

조금 비효율적으로 느껴진다

 

(8)문자열 반복(下)

문제

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다.

QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.

입력

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다. 

출력

각 테스트 케이스에 대해 P를 출력한다.

 

 

내답 ) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class 문자열반복 {
 
    public static void main(String[] args) throws IOException{
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        int t=Integer.valueOf(reader.readLine());
        StringBuilder builder=new StringBuilder(t*161);//161 = R의 맥시멈 * s의최대길이 + 개행문자
        for(int i=1;i<=t;i++) {
            int r=reader.read()-'0';
            reader.read();
            char cs[]=reader.readLine().toCharArray();
            for(char c : cs) 
                for(int k=0;k<r;k++)
                    builder.append(c);
            builder.append('\n');
        }
        System.out.print(builder);
    }
}
cs

9 번재 줄에서 t 값을 읽어올때 , reader.read() 으로 했다가 자꾸 오류내는 실수함

1<=t<1000 범위이기에 reader.readLine 으로 문자열로 읽어와야 했었음

그 외엔 , 출력이 빈번해서 StringBuilder.append 를 자주 이용해줌

 

(9)그대로출력하기(中)

문제

입력 받은 대로 출력하는 프로그램을 작성하시오.

입력

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.

출력

입력받은 그대로 출력한다.

 

내답1 ) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
 
public class 그대로출력하기 {
    public static void main(String[] args) throws IOException{
        Scanner scanner= new Scanner(System.in);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
        while(scanner.hasNext()) {
            writer.write(scanner.nextLine());
            writer.write('\n');
        }
        writer.flush();
        writer.close();
        scanner.close();
    }
}
cs

문자열의 줄 수를 몰라도 출력할 수 있어야한다

scanner.hasNext() 를 이용하여 다음 문자열이 있다면 true , 없으면 false 를 반환 하도록 함 ( 백준기준 )

다만 , IDE 에서는 scanner.hasNext 에 의해서 프로그램이 끝나지 않음

 

내답2 ) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class 그대로출력하기 {
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
        while(true) {
            String s= reader.readLine();
            if(s==nullbreak
            writer.write(s);
            writer.write('\n');
        }
        writer.flush();
        writer.close();
    }
}
cs

reader.readLine() 에 더 이상 읽어올 값이 없다면 , null을 반환 (백준기준)

다만 , IDE 에서는 reader.readLine() 에 의해서 프로그램이 끝나지 않음

 

( scanner.hasNext , reader.readLine 참고 )

 

wngksdma123 님의 답 ) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.BufferedReader;
import java.io.IOException;
 
 
public class Main {
    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
        for (int i = 0; i < 100; i++) {
            String str;
            if( (str = br.readLine()) == null)
                break;
            sb.append(str).append("\n");
        }
        System.out.println(sb);
    }
}
cs

13 번째 줄의 메소드 체이닝 효과외엔 비슷비슷하다

 

 

----------------------------------카카오-----------------------------

ㅇㄹ

+ Recent posts