대충 과정을 N번 거친 후, 점 몇 개를 저장해야 하는지 구하는 프로그램을 작성하라는 문제이다. 구글링했을 때 내가 사용한 알고리즘을 사용했으나, include <cmath> 에 있는 pow()함수를 사용하면 더 편하게 풀 수 있어서 그 방법에 대해서 공유하고자 글을 작성한다.
이 문제를 푸는 과정은 다른 블로그에서 상세히 설명이 되어있기 때문에 어째서 결과 값이 (2^n + 1)^2 가 되는지에 대해서는 설명하지 않겠다.
입력으로 N을 받고, 출력으로 (2^n + 1)^2 를 내보내면 되는 것인데, 여기서 제곱을 계산하는 과정을 알고리즘으로 직접 만들어서 제출해도 되지만 나는 매우 귀찮아 하기 때문에 이것이 이미 함수로 구현되어 있을 것이라고 생각했고 알아보았다.
<pow 함수에 대하여>
<cmath> 헤더의 pow 함수는 기본적으로 double 형 인자를 받는다. 하지만 뭐가 입력값으로 들어오든 double 형으로 생각하고 계산을 해주기 때문에 정수형 등 double 형이 아닌 인자값으로 넣어줘도 알아서 잘 작동한다.
하지만 주의해야 할 점이 있다. double형으로 생각하고 계산하기 때문에, return 값 또한 double형으로 나오게 된다.
그렇기 때문에 여기 문제에서 출력값 형태를 보면 정수형이기 때문에 이 주의할 점을 생각하지 않고 사용한다면 결과가 틀렸습니다 로 나오게 될 것이다.
직접 실행해보면 정수값으로 출력되는 것 처럼 보이는데, 이것은 std::cout 표준 출력 함수의 특성으로, 소수점 부분이 0이면 이를 출력하지 않는다. 그렇기 때문에 눈에 보이는 것이 정수값이라고 double 형이 아닌 것이 아니다.
이 문제가 아니더라도 double 형이 출력값으로 나오면 안되는 경우가 있다. % 연산자를 사용할 때 연산 인자에 double 형이 하나라도 포함이 되면 안된다. 정수형끼리만 연산을 할 수 있기 때문에 이것을 double 형에서 int로 바꾸는 과정이 필요하다.
int형으로 강제 형 변환 해주는 것은 간단하다.
(int)pow( );
와 같이 사용해주면 int 형으로 형 변환이 된다.
최종 코드를 보면
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int N;
cin >> N;
cout << (int)pow(pow(2, N) + 1, 2) << "\n";
return 0;
}
이 된다.

https://www.acmicpc.net/problem/2903
2903번: 중앙 이동 알고리즘
상근이는 친구들과 함께 SF영화를 찍으려고 한다. 이 영화는 외계 지형이 필요하다. 실제로 우주선을 타고 외계 행성에 가서 촬영을 할 수 없기 때문에, 컴퓨터 그래픽으로 CG처리를 하려고 한다.
www.acmicpc.net
'오르막길 > C++ 공부기록' 카테고리의 다른 글
[백준][C++] 3009번 네 번째 점 (0) | 2024.02.28 |
---|---|
[백준][C++] 11653번 소인수분해 (1) | 2024.02.27 |
2023.07의 공부기록 (0) | 2023.08.03 |
2023.06의 공부기록 (1) | 2023.07.01 |
댓글