두잇 책 1장에 나온 것들이라서 다시 정리해보는 마음으로 풀어봤다.
별찍기 - 3
문제
첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제
입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
5
출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
*****
****
***
**
*
내 코드
import java.util.Scanner;
public class No2440 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
for (int i = num; i >= 1; i--) {
for (int j = 0; j < i; j++)
System.out.print("*");
System.out.println();
}
}
}
별찍기 문제를 풀기 위한 반복문을 둘로 나눈다면
- 한 행마다 요긴하게 쓸 값 정하기
- 반복해서 별찍기 혹은 반복해서 빈공간 찍기
예를 들어 지금과 같은 문제에서
한 행마다 요긴하게 쓸 값은 한 행당 별의 개수가 될 것이다.
별의 개수는 1행에서 num, 2행에서 num - 1, 3행에서 num - 2,.... num 행에서 1이 될것이다.
이 별의 개수를 i에 저장한다고 생각하면 for문이
for (int i = num; i >= 1; i--)
이렇게 선언되는 것은 상식적이다.
그럼 이제 한 행에서 정해진 i 값을 갖고 어떻게 별과 빈공간을 반복해서 찍을지 정한다.
여기서는 빈공간을 굳이 출력할 필요가 없으니 별만 정확히 i값 만큼만 찍으면 그림이 완성된다.
별을 반복해서 찍는 방법은
for (int j = 0; j < k; j++) System.out.print("*");
이 틀에 있는 k에 원하는 반복수를 적어주는 것이다.
빈공간을 찍어주고 싶다면 마찬가지로
for (int j = 0; j < k; j++) System.out.print(" ");
이 틀을 유지해주기만 하면 된다.
일단 여기서는 빈공간없이 i 반복수만큼만 별을 찍으면 되므로
for (int j = 0; j < i; j++) System.out.print("*");
이 반복문을 한행마다 반복해줄것이기 때문에 위의 for 문의 몸체 안에 넣어주기만 하면 된다.
한행에 찍을 별을 다 찍었다면 마무리로 줄 바꿈을 해준다.
별찍기 - 4
문제
첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
5
출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
*****
****
***
**
*
내 코드
import java.util.Scanner;
public class No2441 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
for (int i = 0; i < num; i++) {
for (int j = 0; j < i; j++)
System.out.print(" ");
for (int j = 0; j < num - i; j++)
System.out.print("*");
System.out.println();
}
}
}
이번에도 다음과 같이 단계를 나누면
- 한 행마다 요긴하게 쓸 값 정하기
- 반복해서 별찍기 혹은 반복해서 빈공간 찍기
한행마다 요긴하게 쓸 값을 별보다 먼저 찍어야하는 빈공간의 개수로 정했다.
빈공간의 개수는 다음과 같을 것이다.
1행 0 -> 2행 -> 1, 3행 -> 2, ... , num행 -> num - 1
그래서 반복문을 이렇게 정했다.
for (int i = 0; i < num; i++) {
그리고 한 행에서 i만큼 빈공간을 찍고, 그 다음에는 num - i 만큼 별을 찍을 것이다.
빈공간을 찍는 코드는 다음과 같고,
for (int j = 0; j < i; j++) System.out.print(" ");
별을 찍는 코드는 다음과 같다.
for (int j = 0; j < num - i; j++) System.out.print("*");
한행에 찍을 것을 다 찍었다면 줄바꿈을 해주면 된다.
별찍기 - 5
문제
첫째 줄에는 별 1개, 둘째 줄에는 별 3개, ..., N번째 줄에는 별 2×N-1개를 찍는 문제
별은 가운데를 기준으로 대칭이어야 한다.
입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
5
출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
*
***
*****
*******
*********
내 코드
import java.util.Scanner;
public class No2442 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
for (int i = 1; i <= num; i++) {
for (int j = 0; j < num - i; j++)
System.out.print(" ");
for (int j = 0; j < i * 2 - 1; j++)
System.out.print("*");
System.out.println();
}
}
}
한 행에서 요긴하게 쓰게 될 값은 문제에서 정해준 그대로 했다. 그냥 i행에서 i * 2 - 1만큼 별을 찍으라고 했으니 이 i행의 i를 값으로 지정한다. 이 값은 행마다 다음과 같을 것이다.
1행 -> 1, 2행 -> 2, 3행 -> 3, 4행 -> 4,....num행 -> num
따라서 반복문을 다음과 같이 정했다.
for (int i = 1; i <= num; i++) {
그리고 한 행마다 별보다도 빈공간을 먼저 찍어야하는 데 이 빈공간의 개수가 num - i이다. 따라서 다음과 같이 빈공간을 찍는다.
for (int j = 0; j < num - i; j++) System.out.print(" ");
빈공간을 찍을 만큼 찍었다면, 별도 찍어줘야하는데, 문제에서 한 행마다 별의 개수를 손수 정해줬으니 그걸 그대로 따르면 된다.
for (int j = 0; j < i * 2 - 1; j++) System.out.print("*");
한 행에 찍을 것을 다 찍었으니 마무리로 줄바꿈!
별찍기 - 6
문제
첫째 줄에는 별 2×N-1개, 둘째 줄에는 별 2×N-3개, ..., N번째 줄에는 별 1개를 찍는 문제
별은 가운데를 기준으로 대칭이어야 한다.
입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
5
출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
*********
*******
*****
***
*
내 코드
import java.util.Scanner;
public class No2443 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
for (int i = num; i >= 1; i--) {
for (int j = 0; j < num - i; j++)
System.out.print(" ");
for (int j = 0; j < i * 2 - 1; j++)
System.out.print("*");
System.out.println();
}
}
}
저번문제랑 다른 것은 한 행마다 쓸 값 뿐이다.
이번에는 저번 문제와 반대로 1행 -> num, 2행 -> num - 1, 3행 -> num - 2, 4행 -> num - 3,....num행 -> 1이다.
따라서 이 반복문만 바꾸고 나머지는 전과 동일하게 풀면된다.
for (int i = num; i >= 1; i--) {
'자바 자료구조 & 알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글
백준 별찍기 시리즈 - 2444, 2445, 2446번 (0) | 2020.09.14 |
---|---|
백준 4948번 : 베르트랑 공준 (0) | 2020.09.06 |
백준 2581번 - 소수 (0) | 2020.09.04 |