[필수 문제] 숫자 피라미드
2021. 2. 11. 22:46ㆍ코딩 테스트/필수 문제
1. 문제
N과 시작 숫자 S가 주어지면 숫자 피라미드를 만드는 프로그램을 작성하시오.
예를 들어, N이 5이고 S가 3 이라면, 그 숫자 피라미드는 다음과 같다.
3
456
21987
3456789
987654321
- 시작 숫자 S는 꼭대기부터 1씩 증가한다.
- 시작 행의 번호가 1번이라고 했을때, 짝수번째 행은 왼쪽에서 오른쪽으로 1씩 증가하도록 적고, 홀수번째 행은 거꾸로 적는다.
- 숫자가 만약 10이 될 경우, 1로 바꾸고 다시 증가한다.
입력
입력의 첫 번째 줄에 N과 시작 숫자 S가 주어진다. ( 1≤N≤100, 1 ≤S≤ 9)
출력
첫 번째 줄부터 숫자 피라미드를 출력한다. (각 줄에 존재하는 공백의 개수와 숫자의 개수를 정확하게 확인해주시바랍니다.)
예제 입력
5 3
예제 출력
3
456
21987
3456789
987654321
2. 풀이
이 문제는 총 3가지의 특징을 잡아내야 해결할 수 있다.
- 각 줄에 출력되는 숫자의 수
- 각 줄의 증감
- 각 줄의 시작 숫자
가장 먼저, 각 줄에 출력되는 숫자의 수는 규칙을 통해 쉽게 찾을 수 있다.
- 1 번째 줄 : 1
- 2 번째 줄 : 3
- 3 번째 줄 : 5
- 4 번째 줄 : 7
- 5 번째 줄 : 9
- n 번째 줄 : 2n-1
다음으로는 각 줄의 증감을 확인해본다.
- 2 번째 줄 : 증가
- 3 번째 줄 : 감소
- 4 번째 줄 : 증가
- 5 번째 줄 : 감소
- 짝수 줄은 증가, 홀수 줄은 감소
마지막으로 각 줄의 시작 숫자를 알아야한다.
- 1 번째 줄 : 3
- 2 번째 줄 : 4
- 3 번째 줄 : 2
- 4 번째 줄 : 3
- 5 번째 줄 : 9
- 짝수 줄의 첫 번째 요소 = 그 전 홀수 줄의 첫 번째 요소 + 1
- 홀수 줄의 첫 번째 요소 = 그 전 짝수 줄의 마지막 요소 + (2n-1)
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
int prevFirst = 0; // 전 줄의 첫 번째 요소 저장
int prevLast = 0; // 전 줄의 마지막 요소 저장
for(int i = 1; i <= n; i++) {
for(int j = n-1; j >= i; j--) bw.write(" "); // 공백
if(i == 1) { // 1 번째 줄일 경우
bw.write(s + "\n");
prevFirst = s;
continue;
}
int curFirst = 0;
if(i % 2 == 0) { // 짝수 줄일 경우 (숫자 증가)
curFirst = prevFirst + 1;
if(curFirst >= 10) curFirst = 1;
for(int j = 0; j < 2*i-1; j++) {
bw.write(curFirst++ + "");
if(curFirst >= 10) curFirst = 1;
}
prevLast = curFirst;
} else { // 홀수 줄일 경우 (숫자가 감소)
curFirst = prevLast - 1;
for(int j = 0; j < 2*i-1; j++) {
curFirst++;
if(curFirst >= 10) curFirst = 1;
}
prevFirst = curFirst;
for(int j = 0; j < 2*i-1; j++) {
bw.write(curFirst-- + "");
if(curFirst < 1) curFirst = 9;
}
}
bw.newLine();
}
br.close();
bw.flush();
bw.close();
}
}
728x90
'코딩 테스트 > 필수 문제' 카테고리의 다른 글
[필수 문제] GCD LCM (0) | 2021.02.12 |
---|---|
[필수 문제] 상자 꾸미기 (0) | 2021.02.12 |
[필수 문제] offset (0) | 2021.02.11 |
[필수 문제] 주사위 게임 (0) | 2021.02.11 |