알고리즘 공부를 하면서, 다시 한번 복습하고, 푸는 방법을 익히는 연습을 하기 위해 이 주제에 대해 글을 쓰기로 하였다.
다중 반복문을 이용한 문제인데, 숫자 피라미드라는 문제이다.
핵심
이 문제의 핵심은 홀수번째 줄에서 숫자가 증가하고, 짝수번째 줄에서는 숫자가 감소하는 것이다. 또한 숫자는 1~9까지만 반복한다. 그리고 출력을 할 때, 왼쪽에서 오른쪽으로 하기 때문에, 각 줄의 첫 번째 수를 찾는 방법 또한 매우 중요하다.
정답 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int s = sc.nextInt();
int previousFirst = 0;
int previousLast = 0;
int number = 1;
int space = n - 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < space; j++) System.out.print(" ");
space--;
if (i % 2 == 0) { //짝수일때 증가함
int currentFirst = previousFirst + 1;
if (currentFirst >= 10) currentFirst = 1;
for (int j = 0; j < number; j++) {
System.out.print(currentFirst);
previousLast = currentFirst;
currentFirst++;
if (currentFirst >= 10) currentFirst = 1;
}}
else{ //홀수일때 감소함
int currentFirst;
if (i==1)currentFirst=s;
else {currentFirst = previousLast;
for (int j = 0; j < number; j++) {
currentFirst++;
if (currentFirst >= 10) currentFirst = 1;
}}
previousFirst = currentFirst;
for (int j = 0; j < number; j++) {
System.out.print(currentFirst);
currentFirst--;
if (currentFirst <= 0) currentFirst = 9;
}
}
number += 2;
System.out.println();
}
}
}
해설
처음 나타내야 하는 것은 공백이다. 출력 값에서 공백의 크기는 n이 5일 때 4,3,2,1,0로 차례대로 줄어든다.
i나 n을 사용하여, 공백 출력을 나타낼 수 있지만, 이해하기 편하고, 직관적이게 space라는 변수를 선언했다.
이후에는 짝수 줄과 홀수 줄을 나누어서 비교해야 한다.
짝수 줄의 경우 수가 증가하는 형태이다.
그리고 이전 줄에서 첫 번째 값+1을 한 값이 시작 숫자가 된다.
그래서 currentFirst = previousFirst+1로 나타내었다. 그리고 숫자는 1~9이므로 10을 넘기면 1로 초기화한다.
이제 반복문을 통해 숫자를 증가시킨다.
홀수 줄의 경우에는 수가 감소하는 형태이다.
홀수 줄의 첫 번째 값 같은 경우에는 이전 줄의 마지막 값에서 현재 줄의 크기를 더한 값이다.
따라서 currentFirst = previousLast를 한 뒤, size만큼 더해주었다.
이제 반복문을 통해 숫자를 감소시킨다.다음 줄로 넘어갈 때, 숫자의 길이가 2개씩 늘어나기 때문에, number+=2를 해주었다.
개선점이나 오류가 있다면, 댓글 부탁드립니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준]1213번 팰린드롬 만들기(java) (0) | 2022.09.10 |
---|---|
*배열* arr3 (java, 알고리즘) (0) | 2022.09.04 |
[백준]1302번 베스트셀러(java) (0) | 2022.09.04 |
[백준] 1026번 보물(java) (0) | 2022.08.31 |
[백준]1373번 2진수 8진수(java) (0) | 2022.08.28 |