N찍기
문제: 자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입력: 첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.
import java.util.Scanner;
public class printN {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
int printNum = input;
for(int i=0; i<input; i++) {
if(printNum == 0) {
break;
}else {
System.out.println(printNum);
printNum -= 1;
}
}
}
근데 이 코드는 34200 KB / 1072 ms 정도의 메모리와 시간을 잡아먹는다.
상대적으로 남들에 비해 사용된 메모리와 시간이 많다는걸 알게 됐다.
같은 java 11로 했지만 나보다 더 좋은 효율을 보인 사람 코드를 봤는데,
18284KB / 216ms -> 이정도의 효율을 보인 코드…
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 N = Integer.parseInt(br.readLine());
for(int i = N; i > 0; i--) {
sb.append(i).append("\\n");
}
System.out.println(sb);
br.close();
}
}
처음 보는 기능 BufferReader, StringBuilder 가 있었고,
StringBuilder 을 이용해 문자열을 모은 후 sysout을 한번만 쓴 것도.. 효율에 매우 큰 역할을 한 것 같다.
BufferReader 은 컴퓨터의 buffer 라는 곳에 키보드의 입력 값을 담았다가 한번에 프로그램으로 넘기는 거라고 한다.
컴퓨터가 하드웨어 → 소프트웨어로 넘길때 엄청 속도가 느린편에 속하는데, 이렇게 한번에 모아서 넘기는게 훨씬! 속도 면에서 효율적이라고 한다.
buffer: 데이터를 한 곳에서 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리 영역
입출력 속도 향상을 위해 버퍼를 사용.
buffer flush : 버퍼에 남아 있는 데이터를 출력시킴. 버퍼를 비우는 동작.
BufferReader : 버퍼를 이용한 입력
BufferWriter: 버퍼를 이용한 출력
버퍼라는게 너무 신기해서 어떤 원리로 이렇게 효율적인 입출력을 할 수 있는지,,, 여유만 되면 좀 더 공부 해보고 싶다.
결론!
** 가능하면 출력 한번에. for 문 안에서 sysout 한번씩 하는건 시간 효율상 좋지 않다.
** input 은 buffer 로 처리해보자.
별 찍기
문제: 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
입력: 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
public class printStar_2 {
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 space = " ";
String star = "*";i
//줄을 처리하는 부분
for(int i=N; i>0 ; i--) {
//내부 글자들을 처리하는 부분
//공백 찍는 부분
//공백 수는 (줄 수)-1 이다.
int k;
for(k=0; k<i-1; k++) {
sb.append(space);
}
//별찍기 부분
//별은 (줄 수)-(공백 수) 이다.
for(int j=0; j<N-k; j++) {
sb.append(star);
}
sb.append(System.getProperty("line.separator"));
}
System.out.println(sb);
}
}
알람시계
문제: 입력 시간이 주어졌을때 그 시간보다 45분 빠른 시간을 출력하라.
입력: 첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다. 입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.
생각 정리
- 문자열 분해
- 10 10 → 스페이스바로. 문자열 분해 후 각각 시, 분 변수에 담기. int형으로 변환
- 고려해야 할 사항
- 시간은 24진법, 분은 60진법을 이용해 표기한다
- 분 먼저 구현을 해야 함. 시간은 분의 흐름에 종속적이기 때문.
- '입력 분' - 45가 음수일 경우 '출력 시간'에 -1을 구현
- 이후 45분이 줄어든 '출력 분' 구현
- 그리고 동시에 시간이 0 일때 -1 이 되어야 하는 상황 → '출력 분' = 23 이여야 한다.
- 만약! 입력 분-45 가 0보다 클 경우, '입력 시간' = '출력 시간'은 같다. → 이걸 빼먹어서 첫 제출 틀림..
public class alarmClock {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] inputTimeStr = bf.readLine().split(" ");
int inputT = Integer.parseInt(inputTimeStr[0]);
int inputM = Integer.parseInt(inputTimeStr[1]);
int outputT = 0;
int outputM = inputM - 45;
if(outputM < 0){
if(inputT == 0) {
outputT = 23;
} else {outputT = inputT-1;}
outputM = 60 - Math.abs(outputM);
} else {
outputT = inputT;
}
System.out.println(outputT + " " + outputM);
}
}
역시 계속 GIT에 업로드 중~
아 11/8 에 한건데 푸시를 못해서 잔디 한칸이 비었다.
정말 제때제때 PULL / PUSH 꼭꼭 해야 된다는 걸 느낀 하루...
Seo0H - Overview
Seo0H has 4 repositories available. Follow their code on GitHub.
github.com
'Study > PS' 카테고리의 다른 글
[PS/Java] 프로그래머스 Lv.1 : 제일 작은 수 제거하기 (1) | 2023.01.17 |
---|---|
[PS] 백준 1546번: 평균 (Java 11) (0) | 2022.11.20 |
[PS] 백준 2577번: 숫자의 개수 (Java 11) (0) | 2022.11.20 |
[PS] 백준 2908번: 상수 (Java 11) (0) | 2022.11.20 |
[PS]백준 CLASS1 + JAVA 풀이들 (에센셜 16문제) (1) | 2022.11.07 |