05-03 21:09
Notice
Recent Posts
Recent Comments
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

(주) 망나니 힘집

[해커랭크] 코딩테스트 문제 시도 [StdIn, StdOut] [5포인트] 본문

스펙도 쌓니/코테 막푸니

[해커랭크] 코딩테스트 문제 시도 [StdIn, StdOut] [5포인트]

군포망나니 2024. 11. 5. 22:48

[해커랭크] 코딩테스트 문제 시도 [nn번] [해결 =? O/X]

"풀이" 가 아닌 "시도" 를 추구합니다.

 

풀이 환경  

 

 

언어 버전 : Java8 

사용 패키지 : import java.io.*;

 

문제 요약   

 

In 42 100 125 
out 42 100 125

 

나의 코드 및 나의 해설 

 

일단, 이 문제를 보고 나는 예전 자바를 공부하던 때를 회상했다.

요새 scan 으로 입력받을 일이 없어서 그런가 기초적인 개념을 잊었기에 다시 정리를 할 수 있었다. 

 

import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        // Complete this line
        int b = scan.nextInt();
        // Complete this line
        int c = scan.nextInt();
        scan.close();
        
        System.out.println(a);
        // Complete this line
        System.out.println(b);
        // Complete this line
        System.out.println(c);
        
    }
}

 

 

문제 해답 풀이와 비교  

 

비슷해서 생략 

 

시간복잡도 및 공간복잡도 비교 

 

 

 

놓친 부분과 배운 개념

 

내가 해커랭크를 이용하는 이유 ;-0

 

scan.close()

입력이 끝나서 자원을 돌려주는 것인데 외부 파일을 읽거나 접근 권한 관련한 특수 상황이 아니고선

일반적인 표준 입출력에서는 사용할 필요는 없다고 한다. 

 

또 난 문제에서 이 말에 주목했다.

 

Alternatively, you can use the BufferedReader class.

 

어디서 많이 봤는데 ? 

 

Stdin / Stdout 보다  속도가 빠르다.  "버퍼" 를 사용하기 때문이다. 

하지만 데이터 가공 작업이 필요해 코딩테스트에서는 상당히 작성하기 귀찮다.

 

왜?

Scanner 는 데이터 유형과 문자열을 분석할 수 있다. 형변환이 필요없어서 가공할 필요가 없다. 

Buffer 는 문자열을 읽고 저장하는 데에 그친다. 정수인지 문자인지 구분이 필요하다는 뜻이다. 

 일단 1차로 작성해보았다. 
 
 
import java.util.*;
import java.io.*; 

public class Solution {

    public static void main(String[] args) throws IOException{
        
        BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
        
        int a = read.read();
        int b = read.read();
        int c = read.read();
        read.close();
        
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
    
        writer.write(a + "\n");
        writer.write(b + "\n");
        writer.write(c);
        writer.close();
                
    }
}

 

근데 답이 이상했다. 52 50 

 

흠..? 대입한 값이 42 100 125 인데... 

 

구글링!!! 

 

import java.io.*; 

public class Solution {

    public static void main(String[] args) throws IOException{
        
        BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
        
        int a = Integer.parseInt(read.readLine());
        int b = Integer.parseInt(read.readLine());
        int c = Integer.parseInt(read.readLine());
        read.close();
        
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
    
        writer.write(a + "\n");
        writer.write(b + "\n");
        writer.write(c + "\n");
        writer.close();
                
    }
}

 

 

read() 를 readLine() 으로 바꿔주니 정답이다. 

 

 

 흠.. 나는 처음에 int 값이니까 read() 로 넣어준 것 뿐이다. 

BufferedReader 가 문자열을 int 형으로 바꿔주는 줄 알았지... 

 

일단 뭐 read() 는 스트림의 한 문자를 읽어 유니코드 값으로 출력한다.  readLine() 은 문자열 한 행을 출력한다. 

 

아! 그럼 readLine 으로 문자열을 읽고 하나씩 int 값으로 변환해줘서 출력이 잘 된 것이다. 

 

그러면 왜 첫 번째 시도에서는 이상한 값이 나왔을까? GPT 한테 물어보려 했는데 "한 문자" ,"유니코드" 라는 말에 초점을 맞춰봤다. 

 

int a = read.read()

 

이렇게 작성을 했지. 근데 a 에는 42 를 넣었다. 

근데 일단 한 문자만 읽으니 당연히 b, c 에도 접근을 못한다. 

 

근데 a 에도 못 갔다. 4  2 이렇게 한 문자씩 접근하고 각각의 유니코드 값인 52 50 으로 반환한 것이다.   

 


 

더 좋은 코드가 있을 것인데, 일단 Scanner 문제니까 여기까지!  

 

 

 

 

 

*버퍼 : 어떤 장치에서 다른 장치로 데이터를 송신할 때 일어나는 시간 차이나

데이터 흐름 속도 차이를 조정하기 위해 일시적으로 데이터를 기억하는 장치