-
[BOJ] 17296 : But can you do it in 0.5x A presses?알고리즘/백준 알고리즘 2019. 11. 1. 06:34
문제 이해하기
- 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으로 입력되었을 때) 존재
느낀 점
- 문제를 이해하는 것이 문제 푸는 것의 전부다
728x90'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[BOJ] 2583 영역 구하기 (0) 2022.09.07 [BOJ] 9626 크로스워드 퍼즐 (0) 2022.09.07 [BOJ] 1629 곱셈 (0) 2022.08.30 [BOJ] 1213 팰린드롬 만들기 (0) 2022.08.30