일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 게르
- 한 줄로 서기
- 아부다비
- 담슈타트
- 월드프렌즈 ICT 봉사단
- LG글로벌챌린저
- 교환학생
- 칭기스칸 동상
- 월드프렌즈
- 몽골
- 칭기즈칸
- 여행
- 몽골 고기
- 알고리즘
- 코로나
- 독일
- 파이썬
- 몽골요리
- 초원
- 소프트웨어 아카데미
- 울란바토르
- 테를지국립공원
- algorithm
- 몽골 헬스장
- ICT봉사단
- Python
- 테를지
- 헬스
- SWEA
- 백준
- Today
- Total
맛있는물회
[맛있는물회] <알고리즘> 2200번 "계산기 " 본문
아주 간단한 그리디 알고리즘 문제이다.
문제 조건
다항식을 계산하기 위해 고안된 계산기가 있다. 이 계산기에는 0부터 9까지의 숫자와 +, ×(곱하기), x, =의 14개의 키가 있다.
예를 들어 이 계산기를 이용하여 x^3 + x + 11을 계산하려면 x, ×, x, ×, x, +, x + 1, 1, = 을 누르면 된다. 또 x^3 + 2x^2 + 11을 계산하기 위해서는 x, +, 2, ×, x, ×, x, +, 1, 1, = 을 누르면 된다.
일반적인 계산기라면 x, +, 2, ×, x, ×, x, +, 1, 1, = 을 x + 2x^2 + 11로 인식하겠지만, 이 계산기는 추가 메모리가 없기 때문에 계산을 할 때에 계산 직전에 계산기에 저장되어 있던 값에 계산을 한다. 즉 x, +, 2, ×, x, ×, x, +, 1, 1, = 을 입력하면 계산기에는 차례로 x, x+2, x^2+2x, x^3+2x^2, x^3+2x^2+11 이 입력되는 것이다.
문제를 단순하게 하기 위해서 최고차항의 계수는 항상 1이라고 가정하자. 또 음수 계수는 고려하지 않기로 하자.
다항식이 주어졌을 때, 이 계산기로 주어진 다항식을 계산하려면 계산기를 최소 몇 번 눌러야 하는지를 구하는 프로그램을 작성하시오.
Input
첫째 줄에 다항식의 차수 N(1≤N≤10,000)이 주어진다. 다음 줄에는 다항식의 계수가 최고차항부터 주어진다. 최고차항의 계수는 항상 1이며 모든 계수는 0 이상이다. 모든 계수는 1,000,000,000을 넘지 않는다.
Output
첫째 줄에 계산기를 누르는 최소 횟수를 출력한다.
생각한 아이디어
먼저 입력 값이 최고차항에서 부터 순서대로 내려오기 때문에 아주 간단하게 풀 수 있다. 최고 차항의 계수는 무조건 1이므로 값이 정해져있다.
1) 입력값의 차수가 0 즉, 상수값일때,
2) 계수 값이 0이어서 무시해도 될 때,
3) 그 이외의 값인데 그 중에서도 계수가 1이어서 계수 부분을 무시해도 될 때와 계수값이 2 이상이어서 계수 값의 자리수를 찾아주어야 할 때로 구분하여서 풀이하였다.
아래의 소스코드의 if 문만 잘 확인한다면 간단하게 풀 수 있는 문제이다.
소스코드
#include
using namespace std;
int main(void) {
int n,i,j,cnt,num;
cnt = 0;
j = 0;
cin >> n;
for (i = n; i >=0; i--) {
cin >> num;
if (num == 0)
continue;
else if (i == 0) { // if input is constant, we have to divide the number as position of number.
while (1) {
if (num / 10 != 0) {
cnt++;
num /= 10;
}
else {
cnt++;
break;
}
}
break;
}
else {
if (num == 1) {// if number is '1', we can skip the process that muliplicate the Coefficient
cnt += i + (i - 1);
}
else {//If Coefficient is not the single digit, we have to count
while (1) {
if (num / 10 != 0) {
j++;
num /= 10;
}
else {
j++;
break;
}
}
cnt += (j+1) + i + (i - 1);
j = 0;
}
}
cnt++; //It means that counting the '+'
}
cnt++; //We must count the '='
cout << cnt;
return 0;
}
'IT > 알고리즘' 카테고리의 다른 글
[맛있는물회] <SWEA알고리즘> 4834번 "숫자 카드" (0) | 2020.03.31 |
---|---|
[맛있는물회] <SWEA 알고리즘> 4835번 "구간합 구하기" (1) | 2020.03.31 |
[맛있는물회] <알고리즘> 1138번 "한 줄로 서기" (0) | 2020.03.19 |
[맛있는물회] <알고리즘> 2875번 "대회 or 인턴" (0) | 2019.06.28 |
[맛있는물회] <알고리즘> 1120번 "문자열" (0) | 2019.06.28 |