티스토리 뷰
반응형
A에서 B로 만드는 데 필요한 최소 연산 횟수를 구하는 문제
문제의 조건
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 10^9)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
풀이 과정
처음엔 DP로 풀 수 있을까 해보다가... 각이 안 나와서 구글링 한 문제 ㅠㅠ
이 문제의 키포인트는 거꾸로 생각하는 것 이었습니다...!!!!! B에서 2로 나누거나 1을 빼고 10으로 나눠가며 A를 만들어 가면서 횟수를 세는 것이었죠... 즉 가능한 경우는
1. 2로 나눠질 때(짝수일 때) => 2로 나눈다.
2. 10으로 나눈 나머지가 1일 때 => 10으로 나눈다.
위 두 가지 경우일 때에만 연산을 하고 나머지에는 -1을 출력하면 되는.. 그런 문제였습니다.
코드
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, const char * argv[])
{
int A, B;
cin >> A >> B;
int answer = 0;
while (A < B)
{
if (0 == B % 2)
B /= 2;
else if (1 == B % 10)
B /= 10;
else
break; //어느 연산도 가능하지 않으면 반복문 탈출
answer++;
}
//반복문이 끝났을 때 A == B 이면 정답에 1 더한 값을 출력하고
if (A == B)
answer++;
else //아니라면 -1 출력
answer = -1;
cout << answer;
return 0;
}
반응형
'알고리즘 문제 풀이 > Greedy' 카테고리의 다른 글
[C++] 백준 온라인 저지 1080번 행렬 풀이 (0) | 2021.11.11 |
---|---|
[C++] 백준 온라인 저지 1202번 보석 도둑 풀이 (0) | 2021.11.09 |
[C++] 백준 온라인 저지 1744번 수 묶기 풀이 (0) | 2021.11.07 |
[C++] 백준 온라인 저지 1439번 뒤집기 풀이 (0) | 2021.11.06 |
[C++] 백준 온라인 저지 4796번 캠핑 풀이 (0) | 2021.11.04 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 다이나믹프로그래밍
- hackerrank
- 깊이우선탐색
- 기초
- 아이패드
- 애플
- 캐나다생활
- 하드웨어
- 코딩공부
- 컴퓨터
- C언어기초
- 문제풀이
- greedy
- 너비우선탐색
- c언어
- 백준
- 영어공부
- 그리디
- 프로그래머스
- dp
- 해커랭크
- DFS
- 컴퓨터공부
- 컴퓨터사이언스
- 캐나다
- BFS
- 프로그래밍
- 알고리즘
- c++
- 스위프트플레이그라운드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함