숏코딩 분석

프로그래머스> [Level1] 두정수 사이의 합 문제를 작성 후

다른 사람은 어떻게 풀었는지 궁금해져서 다른 사람들의 풀이를 확인 하는 곳으로 이동하여, 가장 처음의 풀이의 조건처리 하는 부분을 보았더니 단 2줄.. 처음엔 이게 뭔가..

  1. 뚫어지게 보고,
  2. 비트연산 해보고,
  3. 팀장 아저씨한테 물어보고,
  4. 숏코딩 코드를 분리해 본 후.

숏코딩이 뭔지 찾아보니.. 가독성과 효율은 다 필요없고, 그냥 짧은 타이핑(…)을 목적으로 하고 있었네요. 덕분에 흥미가 자극되어져서 재밋게 문제를 풀어 보았습니다.

  • 문제 설명
    • 두 정수 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;
}

 

세로형 아이템 테이블 테스트 템플릿
언어
문의비중
줄의비중
접근성
C
1
1
다소어려움
C++
2.5
1
다소어려움
JAVA
2.5
1.5
쉬움
Python
6
6.5
쉬움

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.