탄탄대로
[Level 1] 직사각형 별 찍기 본문
- 코딩테스트 문제를 다시 풀어보고 있는 중.
안 한지 하도 오래 돼서 그냥 쉬운것 부터 해보는 중이다.
문제
"이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요."
예시)
5 3
*****
*****
*****
풀이
import java.util.Scanner;
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
for(int i = 0; i < b; i++){
for(int j = 0; j < a; j++){
System.out.print("*");
}
System.out.println();
}
}
}
다른 사람 풀이
import java.util.Scanner;
import java.util.stream.IntStream;
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
StringBuilder sb = new StringBuilder();
IntStream.range(0, a).forEach(s -> sb.append("*"));
IntStream.range(0, b).forEach(s -> System.out.println(sb.toString()));
// IntStream의 range로 0 ~ a/b까지 integer를 스트림으로 생성
// 차례대로 생성되는 integer마다 실행하면 되는 명령으로 forEach로 정의
}
}
● IntStream
- 원시데이터형 int를 스트림으로 다룰 수 있도록 해준다.
- Java8부터 포함
- IntStream Static Methods
반환 타입 | 설명 |
static IntStream | of(int t)
단일 요소를 포함하는 순차적 IntStream을 반환합니다.
|
static IntStream | range(int startInclusive, int endExclusive)
시작부터 순차적으로 정렬된 IntStream을 반환합니다.포함(포함) - 배타적(배타적)을 1단계씩 증분합니다.
|
static IntStream | rangeClosed(int startInclusive, int endInclusive)
시작부터 순차적으로 정렬된 IntStream을 반환합니다.포함(포함) - 포함(포함) - 포함(포함)을 1단계씩 증분합니다.
|
IntStream.of(1,2,3,4,5) → 1,2,3,4,5에 대한 int 스트림 생성 [of의 인자는 배열 등도 가능]
IntStream.range(1,5) → 1,2,3,4에 대한 int 스트림 생성
IntStream.rangeClosed(1,5) → 1,2,3,4,5에 대한 int 스트림 생성
- IntStream Instance Methods
반환 타입 | 설명 |
boolean | allMatch(IntPredicate predicate)
이 스트림의 모든 요소가 제공된 술어와 일치하는지 여부를 리턴합니다.
|
boolean | anyMatch(IntPredicate predicate)
이 스트림의 요소가 제공된 술어와 일치하는지 여부를 리턴합니다.
|
long | count()
이 스트림의 요소 수를 반환합니다.
|
IntStream | distinct()
이 스트림의 고유한 요소로 구성된 스트림을 반환합니다.
|
void | forEach(IntConsumer action)
이 스트림의 각 요소에 대해 작업을 수행합니다.
|
※ 더 자세한 메소드 정보는 https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html 에서 확인
기존 반복문과 IntStream.forEach는 같을까?
public void for_break() {
for(int i = 1; i <= 10; i++){
if(i = 5) {
break;
}
System.out.println(i);
}
/*결과
1
2
3
4
*/
}
public void intStream_break(){
IntStream.rangeClosed(1,10).forEach(i -> {
if(i == 5){
return;
}
System.out.println(i);
});
/* 결과
1
2
3
4
6
7
8
9
10
*/
}
Stream은 물줄기 같은 것이어서, 코드 상에서는 어디서부터 어디까지 스트림을 생성하라고 정의했을 뿐이다. 그 값들에 대해서 forEach 안에서 정의된 내용을 수행하는 것이기 때문에 return 했다고 멈추는 것이 아니라 숫자 5에 대해서만 아무것도 하지 않은 것이 된다.
for문에서는 break를 하면 5에서 더이상 반복하지 않는 개념과 다르다.
∴ IntStream으로 반복문을 무조건 대체할 수 있는 것은 아니다.
그때 그때 상황에 따라 적절한 것을 골라 사용하여야 한다.
(IntStream을 잘 쓰면 코드가 깔끔해져서 좋다고 한다.)
참고한 블로그
'코딩테스트' 카테고리의 다른 글
[Level 1] 평균 구하기 (0) | 2022.07.18 |
---|---|
[Level 1] 하샤드 수 (0) | 2022.07.13 |
[Level 1] 핸드폰 번호 가리기 (0) | 2022.07.12 |
[Level 1]행렬의 덧셈 (0) | 2022.07.08 |
[Level 1] x만큼 간격이 있는 n개의 숫자 (0) | 2022.07.08 |