(주) 망나니 힘집
[해커랭크] 코딩테스트 문제 시도 [StdIn, StdOut] [5포인트] 본문
[해커랭크] 코딩테스트 문제 시도 [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);
}
}
문제 해답 풀이와 비교
비슷해서 생략
시간복잡도 및 공간복잡도 비교
놓친 부분과 배운 개념
scan.close()
입력이 끝나서 자원을 돌려주는 것인데 외부 파일을 읽거나 접근 권한 관련한 특수 상황이 아니고선
일반적인 표준 입출력에서는 사용할 필요는 없다고 한다.
또 난 문제에서 이 말에 주목했다.
Alternatively, you can use the BufferedReader class.
어디서 많이 봤는데 ?
Stdin / Stdout 보다 속도가 빠르다. "버퍼" 를 사용하기 때문이다.
하지만 데이터 가공 작업이 필요해 코딩테스트에서는 상당히 작성하기 귀찮다.
왜?
Scanner 는 데이터 유형과 문자열을 분석할 수 있다. 형변환이 필요없어서 가공할 필요가 없다.
Buffer 는 문자열을 읽고 저장하는 데에 그친다. 정수인지 문자인지 구분이 필요하다는 뜻이다.
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 문제니까 여기까지!
*버퍼 : 어떤 장치에서 다른 장치로 데이터를 송신할 때 일어나는 시간 차이나
데이터 흐름 속도 차이를 조정하기 위해 일시적으로 데이터를 기억하는 장치
'스펙도 쌓니 > 코테 막푸니' 카테고리의 다른 글
[해커랭크] 코딩테스트 문제 시도 [Java Datatypes] [x point] (0) | 2024.11.07 |
---|---|
[해커랭크] 코딩테스트 문제 시도 [Java Output Formatting] [10 포인트] (7) | 2024.11.06 |
[해커랭크] 코딩테스트 문제 시도 [Java Loops 1] [10 포인트] (1) | 2024.11.06 |
[해커랭크] 코딩테스트 문제 시도 [Stdin and Stdout II] [10 포인트] (0) | 2024.11.05 |
[해커랭크] 코딩테스트 문제 시도 [if else] [10 포인트] (1) | 2024.11.05 |