https://school.programmers.co.kr/learn/courses/30/lessons/68935
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1.문제 설명
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 100,000,000 이하인 자연수입니다.
입출력 예
n | result |
45 | 7 |
125 | 229 |
입출력 예 설명
입출력 예 #1
- 답을 도출하는 과정은 다음과 같습니다.
n (10진법) | n (3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
45 | 1200 | 0021 | 7 |
- 따라서 7을 return 해야 합니다.
입출력 예 #2
- 답을 도출하는 과정은 다음과 같습니다.
n (10진법) | n (3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
125 | 11122 | 22111 | 229 |
- 따라서 229을 return 해야 합니다.
2.문제 풀이
- 주어진 정수 n을 3진법으로 변환한 후, 이를 뒤집은 형태로 다시 10진법으로 변환하는 과정이다. 먼저, n을 3으로 나눈 나머지를 vector<int> v에 저장하고, n을 3으로 나눈 몫으로 갱신하는 작업을 반복한다. 이 과정은 n이 0이 될 때까지 수행되며, 결과적으로 v에는 n의 3진법 표현이 역순으로 저장된다.
- 그렇게 저장된 v를 for 문을 사용하여 마지막 원소부터 하나씩 꺼내 multi 변수를 활용해 3의 배수만큼 곱하며 answer에 누적한다. 이때 주의할 점은 for 문의 시작을 마지막 원소부터 첫 번째 원소로 가도록 설정하는 것이다. 만약 for 문을 첫 번째 원소부터 시작하면, v.pop_back()을 통해 끝에서 원소를 제거하는 과정에서 반복 횟수가 예상보다 줄어들어 원하는 연산이 제대로 수행되지 않을 수 있다.
3.소스코드(벡터)
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
int answer = 0;
int multi = 1;
vector<int> v;
while(n > 0)
{
v.push_back(n % 3);
n /= 3;
}
for(int i = v.size() - 1; i >= 0; --i)
{
answer += v.back() * multi;
v.pop_back();
multi *= 3;
}
return answer;
}
4.다른풀이(문자열)
n을 뒤집은 3진법으로 변환한 결과를 아스키 코드를 활용해 문자열에 담아서 문제를 해결해보았다.
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
int answer = 0;
string reverse ="";
int multi = 1;
while(n > 0)
{
reverse += n % 3 + '0';
n /= 3;
}
for(int i=reverse.size() - 1; i >= 0; --i)
{
answer += (reverse[i] -'0') * multi;
multi *= 3;
}
return answer;
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]C++ LV1 소수 찾기 (1) | 2025.04.11 |
---|---|
[프로그래머스]C++ LV1 [1차]다트게임 (1) | 2025.04.10 |
[프로그래머스]C++ LV1 최대공약수와 최소공배수 (1) | 2025.02.03 |
[프로그래머스] C++ LV1 같은 숫자는 싫어 (1) | 2025.01.09 |
[프로그래머스] C++ LV0 5명씩 (2) | 2025.01.08 |