문제 이해하기
A 버튼을 누르는 최소 횟수 구하기
A 버튼을 X+0.5번을 누른 경우는 이전 스테이지를 깨고 다음 스테이지를 시작한 경우
예제 입력으로 문제 이해 하기
입력값이 0.5 1.5 0 1.5 1인 경우
각 스테이지의 필요한 A 버튼의 최소 횟수가 주어진다.
1 STAGE : 0.5 - 이전 스테이지가 없으므로 한번 눌러준다. (누른 상태를 유지한다!) => 총 1회 2 STAGE : 1.5 - 1 STAGE에서 누른 상태이므로 1번만 더 누르면 된다. => 총 2회 3 STAGE : 0 - 2 STAGE에서 누른 상태를 유지하자(최소 횟수를 구해야 하므로) => 총 2회 4 STAGE : 1.5 - 3 STAGE에서 누른 상태로 왔으므로 1번만 더 누르면 된다 => 총 3회 5 STAGE : 1 - 4 STAGE에서 누른 상태로 오건 안 오건 1번만 더 누르면 된다 => 총 4회
데이터 추상화
입력값이 소수 일 때(이전 스테이지에서 누른 상태)를 추상화
소수가 나오면 이전 스테이지에서 누른 상태이므로 값을 1을 준다.
정수가 나오면 값을 상태 값을 0을 준다
1STAGE : 0.5 => [ 0, 1] 2 STAGE : 1.5 => [ 1, 1] 3 STAGE : 0 => [ 0. 0 ] 4 STAGE : 1.5 => [ 1, 1] 5 STAGE : 1 => [ 1 , 0]
0행의 값은 횟수 값, 1행의 값은 상태 값
알고리즘
입력이 들어오면 정수, 소수 판별
정수 일시 상태값을 0, 소수 일시 상태 값을 1
최초 버튼 클릭시에는 반드시 버튼을 한번 눌러줘야 한다.
1 STAGE : [ 0 , 1] => 최초 버튼 클릭이므로 1 + 0번 누른다 2 STAGE : [ 1 , 1] => 최초 버튼 클릭이 아니므로 1번 누른다 3 STAGE : [ 0 . 0 ] => 최초 버튼 클릭이 아니므로 0번 누른다 4 STAGE : [ 1 , 1] => 최초 버튼 클릭이 아니므로 1번 누른다 5 STAGE : [ 1 , 0] => 최초 버튼 클릭이 아니므로 1번 누른다
결괏값은 4가 나온다.
코드
#include <iostream>
using namespace std;
int main (){
int n; cin >> n;
int ary[2][n];
for(int i = 0 ; i < n; i++){
double k; cin >> k;
int mok = (int)(k * 10) / 10;
int mod = (int)(k * 10) % 10;
if( mod == 0){
// 정수가 들어왔을 때
ary[0][i] = mok;
ary[1][i] = 0;
} else {
// 소수가 들어 왔을 때
ary[0][i] = mok;
ary[1][i] = 1;
}
}
int ans = ary[0][0] + ary[1][0];
for(int i = 1; i < n; i++){
if(ans == 0 && ary[1][i] == 1)
ans++;
ans += ary[0][i];
}
cout << ans;
}
정리
문제 이해하기가 너무 어려운 문제
생각지도 못한 예외처리 (모든 값이 0으로 입력되었을 때) 존재
느낀 점