프로그래머스> [Level1] 두정수 사이의 합 문제를 작성 후
다른 사람은 어떻게 풀었는지 궁금해져서 다른 사람들의 풀이를 확인 하는 곳으로 이동하여, 가장 처음의 풀이의 조건처리 하는 부분을 보았더니 단 2줄.. 처음엔 이게 뭔가..
- 뚫어지게 보고,
- 비트연산 해보고,
- 팀장 아저씨한테 물어보고,
- 숏코딩 코드를 분리해 본 후.
숏코딩이 뭔지 찾아보니.. 가독성과 효율은 다 필요없고, 그냥 짧은 타이핑(…)을 목적으로 하고 있었네요. 덕분에 흥미가 자극되어져서 재밋게 문제를 풀어 보았습니다.
- 문제 설명
- 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
- 제한 조건
- a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
- a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
- a와 b의 대소관계는 정해져있지 않습니다.
#include vector using namespace std; long long solution(int a, int b) { long long answer = 0; if (a > b) a ^= b ^= a ^= b; answer = (long long)b * -~b / 2 - (long long)a * ~-a / 2; return answer; }
#include "stdafx.h" #include "Programmers.h" /** * 두정수 사이의 합. * 문제 설명 * 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. * 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12 이므로 12를 리턴합니다. * * 제한 조건 * a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요. * a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다. * a와 b의 대소관계는 정해져있지 않습니다. */ long long Programmers::Level01_12912(int a, int b) { long long answer = 0; /** * 숏코딩 분석. * if (a > b) a ^= b ^= a ^= b; * answer = (long long)b * -~b / 2 - (long long)a * ~- a / 2; */ cout " << a << " :: " << b << endl; if (a > b) { // xor 연산을 통한 a와 b의 값 swap. a ^= b ^= a ^= b; cout " << a << " :: " << b << endl; } int _b = 0; // 작은 수. int _a = 0; // 큰 수. int _result = 0; // 결과 값. int calc_b = -~b; // +일때 비트 반전 연산을 하게되면 값이 하나가 더해지는 성질을 이용 해서 (b+1) 하는 효과와 동일한 코드를 간략화 한것임. 즉 5의 값을 6으로 설정. int calc_a = ~-a; // -일때 비트 반전 연산을 하게되면 값이 하나가 빠지는 성질을 이용 해서 (a-1) 하는 효과와 동일한 코드를 간략화 한것임. 즉 3의 값을 2로 설정. cout << "02-2. -~b = " << calc_b << ", ~-a = " << calc_a << endl; cout << "02-3. b = " << b << ", a = " << a << endl; _b = b * calc_b / 2; // 높은 수 인 b * (b+1) / 2 : 자연수 1에서부터 b까지 더한값. 입력값이 5라면, 1+2+3+4+5 의 값을 구하는 공식. _a = a * calc_a / 2; // 낮은 수 인 a * (b-1) / 2 : 자연수 1에서부터 a까지 더한값. 입력값이 3이라면, 1+2+3 의 값을 구하는 공식. cout << "02-4. _b = " << b << " * " << calc_b << " / 2 " << endl; cout << "02-5. _a = " << a << " * " << calc_a << " / 2 " << endl; _result = _b - _a; cout << "03. 큰값 - 작은값 = " << _result < 큰값 = " << _b << ", 작은값 = " << _a TempStr; answer = _result; return answer; }
세로형 아이템 테이블 테스트 템플릿언어문의비중줄의비중접근성C11다소어려움C++2.51다소어려움JAVA2.51.5쉬움Python66.5쉬움