목록프로그래머스 알고리즘/1단계 (50)
N
입력으로 들어온 num을 1이 될 때까지 반복하여 문제를 푸는 문제이다..! 그런데 long long tmp = num을 한 이유는..? 바로 오버플로우 때문이다. int num을 이용하여 while문을 돌게 되면 3번째 예시로 들어온 626331의 답이 488로 나오게 된다. 이는 오버플로우로 인해 값이 손실되었기 때문이다..! 그래서 long long 형 변수를 선언하여 문제를 풀어야 한다..! #include #include using namespace std; int solution(int num) { int answer = 0; long long tmp = num; while(tmp != 1) { if(answer > 500) return -1; if(tmp % 2 == 0) tmp /= 2; ..
int형 변수 n과 m의 최대 공약수와 최소 공배수를 각각 answer에 넣어주면 된다..! 최대 공약수를 구하는 gcd() 함수와 최소 공배수를 구하는 lcm() 함수를 정의하여 사용한다. 이때, lcm() 함수에서는 gcd() 함수를 사용한다..! N과 M의 최대 공약수를 G, 최소 공배수를 L이라 하고, N과 M을 G로 나누었을 때의 몫을 각각 n, m으로 하자. G )N M a b 이랬을 때, 최소 공배수 L은 L = G * n * m, N * M = L * G 의 관계가 나오게 된다. (L = N * M / G) 그러므로 lcm() 함수는 a * b / gcd(a, b)의 결괏값을 리턴한다...! answer에 각각의 함수의 결과값을 넣어주면 끄으으읏..! #include #include usi..
이 문제는 c언어를 공부했다면 아아아아아주 쉽게 풀 수 있는 문제..! if문을 해도 되지만, 한 줄로 작성하기 위해 삼항 연산자를 사용했다. num % 2로 나머지가 1이냐 0이냐에 따라 answer에 "Odd" 또는 "Even"을 저장한다. #include #include using namespace std; string solution(int num) { string answer = ""; answer = num % 2 ? "Odd" : "Even"; return answer; }
arr 배열에서 가장 작은 수를 찾아서 제거한 후 그대로 리턴해주면 된다..! 우선 arr의 size가 1이면 answer에 -1을 넣어 그대로 리턴해준다..! (size가 1인 경우 가장 작은 수를 제거한 후 빈 배열이 되기 때문에..) size가 1이 아니면 erase함수를 이용하여 가장 작은 수를 찾아 제거한다. erase함수는 vector에서 사용하는 함수로, 해당 반복자(iterator)를 제거해주는 함수이다..! 본인은 min_element 함수를 사용하여 arr 배열서 가장 작은 수의 iterator를 받아와 제거하였다. ->min_element(arr.begin(), arr.end() = arr.begin()에서 arr.end()까지 가장 작은 수의 위치(반복자) 리턴..! 다른 예로는 m..
long long 형의 n의 제곱근을 tmp 변수에 저장을 해주자..! 제곱근을 구해주는 함수인 sqrt()를 활용하였다. cmath 헤더에 존재하니 include를 해주고, tmp에 sqrt(n)을 하여 제곱근을 저장한다. 그리고 n이 양의 정수 tmp의 제곱인지 판별해주도록 하자..! pow(tmp, 2)는 tmp를 2승 하여 값을 리턴해준다. pow() 함수도 종종 쓰이는 것 같다..! pow(tmp, 2)와 n이 같으면 tmp는 n의 양의 제곱근이 되고, 일치하지 않으면 tmp는 n의 제곱근이 아니므로 -1을 리턴해준다..! #include #include #include #include using namespace std; long long solution(long long n) { long l..
long long형의 정수 n을 내림차순으로 배치해야 한다. 우선 각 자릿수를 구하여 v 벡터에 저장을 해준다. 이때 v벡터는 long long 형이 아니어도 된다..! 1자리 수를 저장하면 되기 때문..! while문을 통해 각 자릿수를 구하면 sort함수를 통해 오름차순으로 정렬을 한다. 그 후 for문으로 10의 i 승 * v[i]를 해주면 된다..! 예시를 들자면 1) 118372를 while문을 통하여 1 1 8 3 7 2로 v 벡터에 저장을 한다. 2) sort함수를 통해 1 1 2 3 7 8 로 정렬을 한다. 3) i = 0일 때, 10의 0승 * v[0] = 1 * 1 i = 1일 때, 10의 1승 * v[1] = 10 * 1 i = 2일 때, 10의 2승 * v[2] = 100 * 2 ...
자릿수 더하기 문제와 똑같은 유형이다..! while문으로 n이 0보다 작아질 때까지 반복한다. answer가 벡터이므로 push_back을 통해 값을 넣어주고, 나머지 연산을 이용하면 n을 뒤집어서 넣을 수 있다..! #include #include using namespace std; vector solution(long long n) { vector answer; while(n > 0) { answer.push_back(n % 10); n /= 10; } return answer; }
각 자릿수의 합을 구하는 문제..! while문으로 n이 0보다 클 때까지 돌고, n을 10으로 나눴을 때 나머지 값을 answer에 계속 더해준다. 그 후 n을 10으로 나누고 이 값을 n에 저장하면 각 자릿수를 구할 수 있다. #include using namespace std; int solution(int n) { int answer = 0; while(n > 0) { answer += n % 10; n /= 10; } return answer; }