DY N DY
실력키우기 문자삼각형2(C++) 본문
1339 : 문자삼각형2
제한시간: 1Sec 메모리제한: 64mb
해결횟수: 299회 시도횟수: 748회
삼각형의 높이 N을 입력받아서 아래와 같이 문자 'A'부터 차례대로 맨 오른쪽 가운데 행부터 차례대로 아래와 같이 채워서 삼각형 모양을 출력하는 프로그램을 작성하시오.
< 처리조건 >
(1) 오른쪽 가운데 행에 문자 'A'를 채우고 왼쪽 열로 이동하여 위에서 아래로 채워나간다.
(2) 가장 왼쪽 행까지 반복하여 모두 채워 나간다. (문자 'Z'다음에는 'A'부터 다시 시작한다.)
[Copy]5 | [Copy]E F B G C A H D I |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | /************************************************************** Problem: 1339 User: a132034 Language: C++ Result: Success Time:1 ms Memory:1740 kb ****************************************************************/ #include <iostream> using namespace std; int main() { int n; int half; int p = 0, pp = 0, ppp = 0; int start = 0; char A; cin >> n; if (n < 1 || n > 100 || n % 2 == 0) { cout << "INPUT ERROR" ; return 0; } for ( int i = 1; i < n; i += 2) start += i; half = n / 2 + 1; for ( int i = 0; i < half; ++i) { pp = half*2; ppp = 0; for ( int j = 0; j <= i; ++j) { A = 'A' + ((start + ppp) % 26); pp -= 2; ppp -= pp; cout << A << " " ; } start++; p += 2; cout << endl; } for ( int i = half - 2; i >= 0; --i) { pp = half * 2; ppp = 0; for ( int j = 0; j <= i; ++j) { A = 'A' + ((start + ppp) % 26); pp -= 2; ppp -= pp; cout << A << " " ; } start++; p += 2; cout << endl; } for ( int i = 0; i < half; ++i) return 0; } |
이런 문제는 개인적으로 삼각형 부분과 역삼각형 부분으로 나누어 푸는 스타일이라 자연스럽게 이번 문제도 나누게 되었다.
*
**
***
부분
**
*
부분
으로 나누기 위해 half라는 변수를 사용했다.
규칙은 종이에 써보니 우선 시작은 n이 홀수인 경우 1부터 n보다 작은 홀수의 합이 된다는 것을 알 수 있었다.
줄이 아래로 내려갈 수록 이 시작에 +1씩 더해지는 것을 알 수 있다.
ex) A를 0으로 할 때
1일 때 -> 첫 번째 줄 : 0부터 시작
3일 때 -> 첫 번째 줄 : 1부터 시작 / 두 번째 줄 : 2 부터 시작 / 세 번째 줄 : 3 부터 시작
5일 때 -> 첫 번째 줄 : 1+3 > 4부터 시작 / 두 번째 줄 : 5 부터 시작 / 세 번째 줄 : 6 부터 시작 / 네 번째 줄 : 7 부터 시작 / 다섯 번째 줄 : 8 부터 시작
이 시작을 start변수로 설정하였다.
start를 기준으로
start, start - (n-1), start - (n-1) - (n-3), .... , start - (n-1) - (n-3) ... -2 까지
n보다 작은 짝수를 빼주면 된다.
ex) A를 0으로 하고 n이 5일 때 가장 중간 줄의 경우
start = 6
start - 4 = 2
start - 2 = 0
이를 알파벳으로 나타내면
G C A가 된다.
이 변수는 start에 더하는 ppp, 생각한대로 코딩을 위해 pp변수까지 사용했다.
'PARK > ALGORITHM' 카테고리의 다른 글
알고리즘 최소비용신장트리(JAVA) (0) | 2016.04.20 |
---|---|
알고리즘 지하철(C++) (0) | 2016.04.17 |
실력키우기 곱셈(JAVA) (0) | 2016.04.14 |
문제은행 합과 평균 표준편차(C++) (0) | 2016.04.13 |
문제은행 강아지와 병아리(C++) (0) | 2016.04.13 |