๐Ÿ“Œ ๋ชฉ์ฐจ

1. Intro. ์ฝ”๋”ฉ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ„๊ณผํ•˜์ง€ ๋ง๋ผ!!!
2. ์ข‹์€ ์ฝ”๋“œ์ž‘์„ฑ์„ ์œ„ํ•œ ์›์น™

3. ์ž์ฃผํ•˜๋Š” ์‹ค์ˆ˜
4. Debugging.  &.  Testing
5. ๋ณ€์ˆ˜๋ฒ”์œ„์˜ ์ดํ•ด

 

 


1. Intro. ์ฝ”๋”ฉ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ„๊ณผํ•˜์ง€ ๋ง๋ผ!!!

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฐ ๋Œ€ํšŒ์—์„œ ์ฝ”๋“œ๋ฅผ ๋นจ๋ฆฌ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋”์šฑ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ญ˜๊นŒ?
๋ฐ”๋กœ "์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ"๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋ณต์žกํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ์ฝ”๋“œ๋Š” ๋””๋ฒ„๊น…๋„ ์–ด๋ ต๊ณ  ํ•œ๋ฒˆ์— ์ •ํ™•ํžˆ ์ž‘์„ฑํ•˜๊ธฐ๋„ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋งŽ์€ ์ „๋ฌธ๊ฐ€๋“ค์€ ๋ฐ˜๋ณต์  ์—ฐ์Šต์œผ๋กœ ์ž์‹ ์˜ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ผ๊ด€๋˜๊ณ  ๋‹ค๋“ฌ๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ๋‹ค.

๋ณธ ๊ธ€์—์„œ๋Š” ์ฝ”๋”ฉ๊ณผ ๋””๋ฒ„๊น…์— ๊ด€ํ•œ ๋…ธํ•˜์šฐ์™€ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ์ž์ฃผํ•˜๋Š” ์‹ค์ˆ˜์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

 

 


2. ์ข‹์€ ์ฝ”๋“œ์ž‘์„ฑ์„ ์œ„ํ•œ ์›์น™

๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ
์งง๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋Š” ์˜คํƒ€๋‚˜ ๋‹จ์ˆœ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธธ ํ™•๋ฅ ์„ ์ค„์ด๊ณ  ์‰ฌ์šด ๋””๋ฒ„๊น…์„ ๊ฐ€๋Šฅ์ผ€ํ•œ๋‹ค.

C/C++์˜ ๊ฒฝ์šฐ, #define์„ ์ด์šฉํ•œ ๋งคํฌ๋กœ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ํƒ€์ดํ•‘ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค.
#define FOR(i,n) for(int i=0; i < (n); i++)
bool hasDuplicate(const vector<int>& array){
	FOR(i, array.size())
        FOR(j, i)
            if (array[i] == array[j])
                return true;
   	return false;
}โ€‹

 

๋ฌผ๋ก , ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์€ ์†๋œ๋ง๋กœ "์—๋ฐ”"๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ, ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.
for (int i=0; i < array.size(); i++)
	for (int j=0; j < i; i++) // j++์ด์–ด์•ผํ•จโ€‹
๋‹ค๋งŒ, ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์€ ๊ฐ€๋” ์‚ฌ์šฉํ•˜๋ฉด ์•„์ฃผ ์œ ์šฉํ•˜์ง€๋งŒ 
์ผ์ข…์˜ "๋Œ€์น˜๋™์˜ ์–ด๋‘ ์˜ ์Šคํ‚ฌ"๊ฐ™์€ ๋Š๋‚Œ์ด๊ธฐ์— ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•  ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

 

์ ๊ทน์ ์ธ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ
๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์€ ์ฝ”๋“œ๋ฅผ "๋ชจ๋“ˆํ™”"ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๊ฐ™์€ ์ฝ”๋“œ ๋ฐ˜๋ณต์‹œ(์•ฝ 3๋ฒˆ์ด์ƒ), ์ด๋“ค์„ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•ด ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์‹œ๊ฐ„์ด ์—†๋‹คํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋” ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ๊ณ ์น˜๋Š” ๊ฒƒ์„ ์ฃผ์ €ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋œ๋‹ค.
๊ณ„์† ๋ˆˆ์ด ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ์— ์ต์ˆ™ํ•˜๊ฒŒ ํ•˜์—ฌ ๋‹ค์Œ ์ฝ”๋”ฉ์— ์ข€ ๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋”ฉ์„ ๊ฐ€๋Šฅ์ผ€ํ•œ๋‹ค.

 

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ณต๋ถ€
C++์˜ ํ‘œ์ค€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, STL์˜ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด, ๋™์ ๋ฐฐ์—ด, ์Šคํƒ, ํ, ๋ฆฌ์ŠคํŠธ, ๋”•์…”๋„ˆ๋ฆฌ ๋“ฑ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์ •๋ ฌ ๋“ฑ์˜ ํ‘œ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์„ ์ง์ ‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ตฌํ˜„ ์‚ฌ์šฉ๋ฒ•์— ์ต์ˆ™ํ•ด์ง„๋‹ค๋ฉด ์ด๋ฅผ ํ™œ์šฉํ•ด ๋”์šฑ ๋น ๋ฅธ ์ฝ”๋“œ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํ•ญ์ƒ ๊ฐ™์€ํ˜•ํƒœ๋กœ ์ž‘์„ฑ
while๋ฌธ์„ ์“ฐ๋˜์ž๋ฆฌ์— do-while๋ฌธ์„ ์‚ฌ์šฉํ•ด๋ณธ๋‹ค๋˜์ง€ ํ•˜๋Š” ๋“ฑ์„ ๋งํ•œ๋‹ค.
์ด๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์ ์  ์‹ค์ˆ˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋Š”๋งŒํผ ์ง€์–‘ํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

 

์ผ๊ด€โˆ™๋ช…๋ฃŒํ•œ ๋ช…๋ช…๋ฒ• ์‚ฌ์šฉ
int a[30][30], i, j, k=0;โ€‹

 

์œ„์™€๊ฐ™์€ ์ฝ”๋“œ๋Š” ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ช…๊ณผ ํ•จ์ˆ˜๋ช…์˜ ์˜ˆ์‹œ์ด๋‹ค.
๋ณดํ†ต, ์‚ฌ์šฉ์–ธ์–ด์— ๋งž๋Š” naming convention์„ ์ตํžˆ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.(์˜ˆ๋ฅผ ๋“ค์–ด CamelCase)

 

๋ชจ๋“  ์ž๋ฃŒ๋ฅผ ์ •๊ทœํ™”
๊ฐ™์€ ์ž๋ฃŒ๋ฅผ 2๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์œ ๋ฆฌ์ˆ˜ ํ‘œํ˜„ํด๋ž˜์Šค Fraction์˜ ๊ฒฝ์šฐ, ๊ธฐ์•ฝ๋ถ„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
(9/6๊ณผ 3/2๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์ง€๋ฉด ํ‘œํ˜„ํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.)

 

์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌ
๋‚ ์งœ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ๋‹ค ๊ฐ€์ •ํ•˜์ž.
string getMonthName(int month){
	if (month == 1) return "Jan";
    if (month == 1) return "Feb";
    ...
    if (month == 12) return "Dec";
}โ€‹
์ฒ˜์Œ ์ฝ”๋”ฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝ์šฐ, ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋Š” ์—ฐ์ฐจ๊ฐ€ ์Œ“์ผ์ˆ˜๋ก ๊ธฐํ”ผํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋˜๋Š”๋ฐ, ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ์™€ ์ƒ๊ด€์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ถ„๋ฆฌํ•˜๋Š” ์ชฝ์ด ๋‚ซ๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด, ์•„๋ž˜์ฒ˜๋Ÿผ ์›”์˜ ์˜์–ด์ด๋ฆ„์„ ์•„๋ž˜์ฒ˜๋Ÿผ table๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
const string monthName[] = {"Jan", "Feb", ... , "Dec"};โ€‹


์ด ๊ธฐ๋ฒ•์˜ ๋˜ ๋‹ค๋ฅธ ์ข‹์€ ์˜ˆ์‹œ๋กœ ์ฒด์Šค์™€ ๊ฐ™์€ ๋ณด๋“œ๊ฒŒ์ž„์ด ์กด์žฌํ•œ๋‹ค.
const int KnightDx[8] = {2,2,-2,-2,1,1,-1,-1};
const int KnightDy[8] = {1,-1,1,-1,2,2,2,-2};โ€‹

 

 

 

 

 

 

 

 

 

 

 

 

 


3.  ์ž์ฃผํ•˜๋Š” ์‹ค์ˆ˜

์‚ฐ์ˆ  Overflow
๊ณ„์‚ฐ๊ณผ์ •์—์„œ ๋ณ€์ˆ˜์˜ ํ‘œํ˜„๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ Section 5์—์„œ ์ข€ ๋” ์ƒ์„ธํžˆ ๋‹ค๋ฃฌ๋‹ค.

 

๋ฐฐ์—ด๋ฒ”์œ„ ๋ฐ– ์›์†Œ์— ์ ‘๊ทผ
C/C++์€ ๋ฐฐ์—ด์›์†Œ ์ ‘๊ทผ ์‹œ, ๋ณ„๋„๋กœ ํ™•์ธํ•˜์ง€ ์•Š๊ธฐ์— ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์œ„์น˜๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๋ฒ„๊ทธ๋Š” ์•„์ฃผ ์ฐพ๊ธฐ ํž˜๋“ค๋‹ค.
๋‹ค๋งŒ, ์ด๋•Œ Run-time stack๋“ฑ์„ ๊ฑด๋“œ๋ ค ํ”„๋กœ๊ทธ๋žจ์ด Run-Time-Error๋ฅผ ๋‚ด๊ณ  ์ข…๋ฃŒ๋  ๋•Œ, ์ด๋ฅผ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ, ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š์œผ๋ฉด์„œ ํ‹€๋ฆฐ ๋‹ต๋งŒ ๋‚ด๋†“๋Š” ๊ฒฝ์šฐ๋„ ์ข…์ข… ์žˆ๊ธฐ์— ์ด๋Ÿฐ ์‹ค์ˆ˜๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ์—ดํฌ๊ธฐ๋ฅผ ์ •ํ•  ๋•Œ, ๊ณ„์‚ฐ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

 

์ผ๊ด€๋˜์ง€ ์•Š์€ ๋ฒ”์œ„ํ‘œํ˜„๋ฐฉ์‹์˜ ์‚ฌ์šฉ
๋ฐฐ์—ด์˜ ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํฐ ์›์ธ ์ค‘ ํ•˜๋‚˜.
2~12๋ฅผ ํ”„๋กœ๊ทธ๋žจ๋‚ด์—์„œ ํ‘œํ˜„ํ•ด๋ณด์ž.
2 ≤ i ≤ 12๋„ ๋˜๊ณ  1 < i < 13๋„ ๋˜๋ฉฐ,์ด ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์—๋Š” ๋ชจ๋‘ ๋‚˜๋ฆ„์˜ ์žฅ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

๋‹ซํžŒ๊ตฌ๊ฐ„์˜ ๋ฌธ์ œ๋Š” ๊ณต์ง‘ํ•ฉ์„ ์šฐ์•„ํ•˜๊ฒŒ ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด๊ณ 
์—ด๋ฆฐ๊ตฌ๊ฐ„์˜ ๋ฌธ์ œ๋Š” ๋ฐฐ์—ด์˜ ์ฒซ์›์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฒ•์œ„๋ฅผ ํ‘œํ˜„์‹œ, ์ฒซ์›์†Œ ์ด์ „์˜ ๊ฐ€์ƒ์›์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๋Š” ๋Œ€๋ถ€๋ถ„ ์ด ๋‘˜ ์‚ฌ์ด์˜ ์ ˆ์ถฉ์ธ ๋ฐ˜์—ด๋ฆฐ๊ตฌ๊ฐ„(half-open-interval)์„ ์‚ฌ์šฉํ•œ๋‹ค.
0 ≤ i < n
ex)
[C++]: begin()์€ ์ฒซ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ, end()๋Š” ๋งˆ์ง€๋ง‰์›์†Œ ๋‹ค์Œ์˜ ๊ฐ€์ƒ์˜ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
[Python]: a[4:8]์€ a[4]~a[7]์˜ ์›์†Œ๋ฅผ ์˜๋ฏธ.

 

Off-by-One ์˜ค๋ฅ˜
๊ณ„์‚ฐ์˜ ํฐ ์ค„๊ธฐ๋Š” ๋งž์ง€๋งŒ, ํ•˜๋‚˜๊ฐ€ ๋ชจ์ž๋ผ๊ฑฐ๋‚˜ ํ•˜๋‚˜๊ฐ€ ๋งŽ์•„์„œ ํ‹€๋ฆฌ๋Š” ์ฝ”๋“œ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ฅ˜๋“ค์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด <, > ์—ฐ์‚ฐ์ž์™€ ≤, ≥์—ฐ์‚ฐ์ž๋ฅผ ํ˜ผ๋™ํ•ด ์›์†Œ๋ฅผ ํ•˜๋‚˜ ๋” ์ ๊ฒŒ๋‚˜ ๋งŽ์ด ์ˆœํšŒํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์ด ์˜ˆ์‹œ์— ํฌํ•จ๋œ๋‹ค.

ex) 100๋ฏธํ„ฐ์— 10๋ฏธํ„ฐ ๊ฐ„๊ฒฉ์œผ๋กœ ๊ธฐ๋‘ฅ์„ ์„ธ์šด๋‹ค ๊ฐ€์ •ํ•˜์ž.
์ด๋•Œ, ํ•„์š”ํ•œ ๊ธฐ๋‘ฅ์€ 10๊ฐœ๊ฐ€ ์•„๋‹Œ, 11๊ฐœ์ด๋‹ค.

 

Compiler๊ฐ€ ๋ชป์žก๋Š” ์ƒ์ˆ˜์˜คํƒ€
๋ณ€์ˆ˜๋ช…์ด๋‚˜ ํ•จ์ˆ˜๋ช…์—์„œ ๋‚ธ ์˜คํƒ€๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์žก๋Š”๋‹ค.
ํ•˜์ง€๋งŒ ๊ฐ์ข… ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์˜คํƒ€๋กœ ์˜ค๋‹ต์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

 

Stack Overflow
ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘, call stack์ด overflowํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ์ข…๋ฃŒ ๋˜๋Š” ๊ฒƒ.
stackoverflow๋Š” ๋Œ€๊ฐœ ์žฌ๊ท€ํ˜ธ์ถœ์˜ ๊นŠ์ด๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์–ด์ง€๊ฒŒ๋  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

C++์˜ ๊ฒฝ์šฐ, ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๋ฐฐ์—ด์ด๋‚˜ ํด๋ž˜์Šค์ธ์Šคํ„ด์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ stack memory๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ํŠนํžˆ๋‚˜ stackoverflow๋ฅผ ์กฐ์‹ฌํ•ด์•ผํ•œ๋‹ค.
๋”ฐ๋ผ์„œ, ๋Œ€๋ถ€๋ถ„ heap์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” STL container๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋‹ค์ฐจ์› ๋ฐฐ์—ด์ธ๋ฑ์Šค ์ˆœ์„œ๋ฐ”๊ฟ”์“ฐ๊ธฐ
์‹ฌ์‹ฌ์ฐฎ๊ฒŒ 4, 5์ฐจ์› ์ด์ƒ์˜ ๊ณ ์ฐจ์› ๋ฐฐ์—ด ์‚ฌ์šฉ ์‹œ, ํ•œ๋‘๊ตฐ๋ฐ ์ธ๋ฑ์Šค์˜ ์ˆœ์„œ๋ฅผ ํ—ท๊ฐˆ๋ ค ์ž˜๋ชป์“ฐ๋Š” ์ผ์ด ์žˆ๋‹ค.
ํŠนํžˆ, ์ดํ›„ ๋‹ค๋ฃจ๋Š” ๋™์  ๊ณ„ํš๋ฒ•(DP; Dynamic Programming)๋ฅผ ์œ„ํ•œ memoization ํŒจํ„ด์„ ์‚ฌ์šฉ ์‹œ ์ด๋Ÿฐ ์ผ์ด ์žฆ์€๋ฐ, ๊ฐ€๋Šฅํ•œ ํ•œ ํŠน์ • ๋ฐฐ์—ด์— ์ ‘๊ทผํ•˜๋Š” ์œ„์น˜๋ฅผ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

์ž˜๋ชป๋œ ๋น„๊ตํ•จ์ˆ˜์˜ ์ž‘์„ฑ
// a๊ฐ€ b์˜ ์ง„๋ถ€๋ถ€๋ถ„์ง‘ํ•ฉ์ด๋ฉด true
bool isProperSubset(const IntegerSet& a, const IntegerSet& b);

// a๊ฐ€ b์˜ ์ง„๋ถ€๋ถ„์ง‘ํ•ฉ์ผ ๋•Œ, a๊ฐ€ ํ•ญ์ƒ ์•ž์— ์˜ค๋„๋ก ์ง‘ํ•ฉ์„ ์ •๋ ฌ
bool operator < (const IntegerSet& a, const IntegerSet& b){
	if (isProperSubset(a,b)) return true;
    if (isProperSubset(b,a)) return false;
    return false;
]โ€‹
์œ„์˜ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, ์ •์ˆ˜์˜ ์ง‘ํ•ฉ์„ ์ €์žฅํ•˜๋Š” IntegerSetํด๋ž˜์Šค์— ๋Œ€ํ•ด vector<IntegerSet>์— ๋‹ด๊ธด ์ง‘ํ•ฉ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋กœ operator overloading์„ ์ด์šฉํ•ด < ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•œ๋‹ค.

์œ„ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊นŒ?
๋Œ€๋ถ€๋ถ„ ์‚ฌ๋žŒ๋“ค์€ isProperSubset()์˜ ๊ตฌํ˜„์„ ์ฐฌ์ฐฌํžˆ ์‚ดํ”ผ๊ณ  ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.
ํ•˜์ง€๋งŒ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜๋ฉด, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผํ•  ์ง€ ๋ง‰๋ง‰ํ•ด์ง„๋‹ค.

operator < ์˜ ๊ฒฝ์šฐ, a<b์™€ b<a๊ฐ€ ๋ชจ๋‘ ๊ฑฐ์ง“์ด๋ผ๋ฉด, a์™€ b๋ฅผ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
์ฆ‰, a,b์™€ b,c๊ฐ€ ๊ฐ™๋‹ค๋ฉด a์™€ c๋„ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. (์ƒ๋“ฑ๊ด€๊ณ„์˜ ์ „์ด์„ฑ)
์ด ์„ฑ์งˆ์„ ๋งŒ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
bool operator < (const IntegerSet& a, const IntegerSet& b) {
	if (isProperSubset(a,b)) return true;
    if (isProperSubset(b,a)) return false;
    if (a.size() != b.size()) return a.size() < b.size();
    return lexicographical_compare(a.begin(), a.end(),
    							b.begin(), b.end());
}โ€‹
์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ, ์• ์ดˆ์— ํฌ๊ธฐ๋น„๊ต ๋ฐ ์‚ฌ์ „์ˆœ ๋น„๊ต๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•œ ๋ฌธ์ œ์— ๋ณต์žกํ•œ ๋น„๊ตํ•จ์ˆ˜์‚ฌ์šฉ์€ ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋‹ˆ ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

์ตœ๋Œ€โˆ™์ตœ์†Œ ์˜ˆ์™ธ ์ž˜๋ชป ๋‹ค๋ฃจ๊ธฐ
์˜ˆ์™ธ๋ž€, ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•œ ์ž…๋ ฅ๊ทœ์น™์— ๋“ค์–ด๋งž์ง€ ์•Š๋Š” ๋ชจ๋“  ์ž…๋ ฅ์ด๋‹ค.
์ด๋•Œ, ๊ฐ€๋Šฅํ•œ ์ž…๋ ฅ ์ค‘ ์ตœ์†Œ๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’์ด ์˜ˆ์™ธ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ๋“ค์€ ์ƒ๊ฐ์™ธ๋กœ ๋งŽ๋‹ค.

ex) ์ž์—ฐ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์†Œ์ˆ˜(prime number)์ธ์ง€ ํŒ์ •ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด, 
bool isPrime(int n) {
	if (n%2==0) return false;	// ์ง์ˆ˜๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹˜
    for (int i = 2; i < n; i++)
    	if (n%i==0)	return false;	// 2์ด์ƒ, n๋ฏธ๋งŒ์˜ ์•ฝ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์†Œ์ˆ˜๊ฐ€ ์•„๋‹˜
    return true;	// ํ†ต๊ณผ ์‹œ ์†Œ์ˆ˜
}โ€‹

์˜ค๋ฅ˜ 1) ๋ชจ๋“  ์ง์ˆ˜๋ฅผ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ•œ ๊ฒƒ. (๋ฐ˜๋ก€: 2)

๋”ฐ๋ผ์„œ 2๋ฅผ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค.
bool isPrime(int n) {
	if (n == 2) return true;	// 2๋Š” ์†Œ์ˆ˜์ž„
	if (n%2==0) return false;	// ์ง์ˆ˜๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹˜
    for (int i = 2; i < n; i++)
    	if (n%i==0)	return false;	// 2์ด์ƒ, n๋ฏธ๋งŒ์˜ ์•ฝ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์†Œ์ˆ˜๊ฐ€ ์•„๋‹˜
    return true;	// ํ†ต๊ณผ ์‹œ ์†Œ์ˆ˜
}โ€‹

์•„์ง ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ณณ์ด ์žˆ์„๊นŒ?
์†Œ์ˆ˜์ธ ๊ฐ€์žฅ ์ž‘์€ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ™•์ธํ–ˆ์œผ๋‹ˆ, ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ€์žฅ ์ž‘์€ ์ž…๋ ฅ๋„ ์ƒ๊ฐํ•ด๋ด์•ผํ•œ๋‹ค.
์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ€์žฅ ์ž‘์€ ์ž์—ฐ์ˆ˜๋Š” 1๋กœ, for๋ฌธ๋„ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๊ฑด๋„ˆ๋›ฐ์–ด true๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋ฒ„๋ฆฐ๋‹ค.

๋”ฐ๋ผ์„œ 1์— ๋Œ€ํ•ด์„œ๋„ ๋ณ„๋„๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
์ด์ฒ˜๋Ÿผ, ์˜ˆ์™ธ๋Š” ๊ผผ๊ผผํžˆ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‰ฝ์ง€  ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„์˜ ์˜ค์‚ฌ์šฉ
์‚ฌ์น™์—ฐ์‚ฐ์€ ํ˜ผ๋™ํ•˜๋Š” ์ผ์ด ์ ๋‹ค.
ํ•˜์ง€๋งŒ, ์‹œํ”„ํŠธ์—ฐ์‚ฐ์ž๋‚˜ ๋น„ํŠธ๋‹จ์œ„์—ฐ์‚ฐ์ž๋“ค์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ์ข…์ข… ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž.
if(b & 1 == 0)โ€‹
์ด if๋ฌธ์€ ์–ผํ• b์˜ ์ตœํ•˜ ๋น„ํŠธ๊ฐ€ 0์ผ ๋•Œ ์ฐธ์œผ๋กœ ๋ณด์ธ๋‹ค.
ํ•˜์ง€๋งŒ bit๋‹จ์œ„ ์—ฐ์‚ฐ์ž &์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž ==๋ณด๋‹ค ๋‚ฎ๋‹ค.
๋”ฐ๋ผ์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ํ•ด์„๋œ๋‹ค.
if (b & (1 == 0))โ€‹

๊ฒฐ๊ณผ์ ์œผ๋กœ ์œ„์˜ ์กฐ๊ฑด๋ฌธ์€ ํ•ญ์ƒ ๊ฑฐ์ง“์ด ๋œ๋‹ค.
(1 == 0)์€ ํ•ญ์ƒ False(์ฆ‰, 0์˜ ๊ฐ’)๋ฅผ ๊ฐ–๋Š”๋‹ค.
๋”ฐ๋ผ์„œ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ, ๊ด„ํ˜ธ๋ฅผ ์ ์ ˆํžˆ ๊ฐ์‹ธ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

๋„ˆ๋ฌด ๋Š๋ฆฐ ์ž…์ถœ๋ ฅ๋ฐฉ์‹
cin ์˜ ์‚ฌ์šฉ์€ ๊ณ ์ˆ˜์ค€ ์ž…๋ ฅ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•ด์ง„๋‹ค.
ํ•˜์ง€๋งŒ ์ด์— ๋”ฐ๋ฅธ ์†๋„์ €ํ•˜ ๋˜ํ•œ ํด ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ์ „์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
cin.sync_with_stdio(false);โ€‹

 

๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ
๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž…๋ ฅ์— ๋Œ€ํ•ด ๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋ผ ์š”๊ตฌํ•œ๋‹ค.
์ด๋•Œ, ์ด์ „ ์ž…๋ ฅ์—์„œ ์‚ฌ์šฉํ•œ ์ „์—ญ๋ณ€์ˆ˜๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

 

 

 

 

 

 

 

 

 


4. Debugging. &. Testing

Debugging
ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์˜ˆ์ œ์ž…๋ ฅ์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์™”์„ ๋•Œ, ๋ณดํ†ต Debugger๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
Debugger๋Š” ๋ฌผ๋ก  ์œ ์šฉํ•œ ๋„๊ตฌ์ง€๋งŒ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋Œ€ํšŒ๋‚˜ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ด๋Ÿฐ ์œ ์šฉ์„ฑ์ด ์ œํ•œ๋œ๋‹ค.

๋”ฐ๋ผ์„œ Debugger์—†์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์—ฐ์Šต์ด ํ•„์š”ํ•˜๋‹ค.
๋ณดํ†ต Debugger์‚ฌ์šฉ ๋Œ€์‹ , ์•„๋ž˜ ๋‹จ๊ณ„๊ฐ€ ์ถ”์ฒœ๋œ๋‹ค.
1. ์ž‘์€ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๋‚˜ ํ™•์ธ
2. ๋‹จ์ •๋ฌธ(assertion) ์‚ฌ์šฉ
3. ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ ์ค‘๊ฐ„๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅโ€‹

 

Testing
๋งŽ์€ ๊ฒฝ์šฐ, ์˜ˆ์ œ์ž…์ถœ๋ ฅ ์™ธ์—๋„ ๋ช‡๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ์ž…๋ ฅ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ๋„ฃ์–ด๋ณด๋ฉด ์˜ค๋‹ต๋ฅ ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ ํ…Œ์ŠคํŠธ ์‹œ, ์œ ์šฉํ•œ ๊ธฐ๋ฒ•์€ ์Šค์บํด๋”ฉ(scaffolding)์ด ์žˆ๋‹ค.

์Šค์บํด๋”ฉ์ด๋ž€, ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ฐœ๋ฐœ ์‹œ, ๋ผˆ๋Œ€๋ฅผ ์žก๊ธฐ์œ„ํ•ด ์ž„์‹œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
์•„๋ž˜๋Š” ์ •๋ ฌํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์Šค์บํด๋”ฉ ์ฝ”๋“œ์ด๋‹ค.
void mySort(vector<int>& array);

// ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พผ๋‹ค.
string toString(const vector<int>& array);

int main(){
	while(true) {
    	// ์ž„์˜์˜ ์ž…๋ ฅ ์ƒ์„ฑ
        int n = rand()%100 + 1;
        vector<int> input(n);
        for (int i=0; i<n; i++)
        	input[i] = rand();
            
        // 2๊ฐœ์˜ ๋ณต์ œ๋ฅผ ์ƒ์„ฑ
        // ํ•˜๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ์ •๋ ฌํ•จ์ˆ˜๋กœ, ํ•˜๋‚˜๋Š” STL๋กœ ์ •๋ ฌ
        vector<int> mySorted = input;
        mySort(mySorted);
        vector<int> ref = input;
        sort(ref.begin(), ref.end());
        
        // ๋งŒ์•ฝ ๋‹ค๋ฅด๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ณ  ์ข…๋ฃŒ
        if (mySorted != ref) {
        	cout << "MisMatch!" << endl;
            cout << "Input: " << toString(input) << endl;
            cout << "Expected: " << toString(ref) << endl;
            cout << "Got: " << toString(mySorted) << endl;
            break;
        }
    }
}โ€‹

 

์ž‘์€ ์ž…๋ ฅ์„ ์—ฌ๋Ÿฌ๊ฐœ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋” ๋น ๋ฅธ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋‚ด๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


5. ๋ณ€์ˆ˜๋ฒ”์œ„์˜ ์ดํ•ด

Arithmetic Overflow
์ปดํ“จํ„ฐ์˜ ๊ฐ€์žฅ ๋Œ€ํ‘œ์  ์ œํ•œ์€ ์œ ํ•œ์„ฑ์ด๋‹ค. ์ปดํ“จํ„ฐ์˜ ๋ชจ๋“  ๋ณ€์ˆ˜์—๋Š” ๋‹ต์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ๋‹ค.
์ด๋•Œ, ์ˆ˜ํ•™์ /๋…ผ๋ฆฌ์ ์œผ๋กœ ์™„์ „ํžˆ ์ •๋‹นํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘๊ฐ€๋Šฅํ•œ๋ฐ, ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ํ”ํ•œ ์›์ธ์ด ๋ฐ”๋กœ ์‚ฐ์ˆ  ์˜ค๋ฒ„ํ”Œ๋กœ(arithmetic overflow)๋‹ค.
์‚ฐ์ˆ ์˜ค๋ฒ„ํ”Œ๋กœ๋Š” ์–ด๋–ค ์‹์˜ ๊ณ„์‚ฐ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋Š” ์ž๋ฃŒํ˜•์˜ ํ‘œํ˜„๊ฐ€๋Šฅ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
์ƒ๋‹นํžˆ ๋งŽ์ด ์ €์ง€๋ฅด๋Š” ์‹ค์ˆ˜ ์ค‘ ํ•˜๋‚˜์ธ๋ฐ, ์—ฌ๊ธฐ์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค.

1. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๋“ค์€ ์‚ฌ์น™์—ฐ์‚ฐ๊ณผ์ • ์ค‘ overflow๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ณ„๋‹ค๋ฅธ ๊ฒฝ๊ณ ๊ฐ€ ์—†๋‹ค.
(์—ฐ์‚ฐ์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค overflow๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ)

2. ํ”„๋กœ๊ทธ๋žจ์˜ ์ •๋‹น์„ฑ์„ ๊ฒ€์ฆํ•  ๋•Œ, ํ”„๋กœ๊ทธ๋žจ ๋…ผ๋ฆฌ์˜ ์ •ํ™•์„ฑ์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉด ์‚ฐ์ˆ ์˜ค๋ฒ„ํ”Œ๋กœ ๋“ฑ์žฅ์‚ฌ์‹ค์„ ์žŠ๊ธฐ ์‰ฝ๋‹ค.

๋‹ค๋งŒ, STL ๋“ฑ์˜ ์ œ๊ณต์œผ๋กœ ์‚ฐ์ˆ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์‹ ๊ฒฝ ์“ธ ์ผ์ด ํฌ๊ฒŒ ์ค„์–ด๋“ค์—ˆ์ง€๋งŒ ์ด๋Ÿฐ ํด๋ž˜์Šค๋“ค์€ ํ›จ์”ฌ ๋งŽ์€ Cost๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค.

 

๋„ˆ๋ฌด ํฐ ๊ฒฐ๊ณผ
๋‹น์—ฐํ•˜๊ฒŒ๋„ 32bits์ž๋ฃŒํ˜•์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด 64bits์ •์ˆ˜๋‚˜ ๋” ํฐ ์ •์ˆ˜๊ตฌํ˜„์„ ์ด์šฉํ•ด์•ผํ•œ๋‹ค.
์ด๋•Œ, ํฐ ์ •์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ํ•ญ์ƒ ๋ณ€์ˆ˜์˜ ํ˜•ํƒœ์— ์ฃผ์˜ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผํ•œ๋‹ค.

 

๋„ˆ๋ฌด ํฐ ์ค‘๊ฐ„๊ฐ’
์‚ฐ์ˆ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋˜๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ๋ฌด์—‡์ผ๊นŒ?
ํ”„๋กœ๊ทธ๋žจ์˜ ์ถœ๋ ฅ๊ฐ’์˜ ๋ฒ”์œ„๋Š” ์ž‘์ง€๋งŒ ์ค‘๊ฐ„๊ณผ์ •์—์„œ ํฐ ๊ฐ’์„ ์ผ์‹œ์ ์œผ๋กœ ๊ณ„์‚ฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

ex)
int gcd(int a, int b);	// ๋‘ ์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๋ฐ˜ํ™˜

int lcm(int a, int b) {
	return (a*b) / gcd(a,b);	
}โ€‹

์œ„์˜ ์ฝ”๋“œ๋กœ lcm(50000, 100000)์„ ๊ณ„์‚ฐํ•ด๋ณด์ž.
์‚ฌ์‹ค ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ„๋‹จํ•˜๊ฒŒ๋„ 100000์ด๋ฉฐ ์ด๋Š” 32bits๋ณด๋‹ค ์ž‘์€ ์ˆ˜์ด๊ธฐ์— ์ž˜ ๊ณ„์‚ฐ๋  ๊ฒƒ ๊ฐ™๋‹ค.
ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋Š” 14100์„ ์ถœ๋ ฅํ•œ๋‹ค.

์œ„์˜ ๊ฒฝ์šฐ, a×b์˜ ๊ฐ’์€ 5×109๊ฐ€ ๋œ๋‹ค. ์ด ๊ฐ’์€ signed_int_32bit์˜ ์ตœ๋Œ€์น˜๋ฅผ ๊ฐ€๋ฟํžˆ ๋„˜๊ธด๋‹ค.
์ด๋•Œ, C++์€ ์•„๋ฌด ๊ฒฝ๊ณ ๋ฅผ ํ•˜์ง€๋„ ์•Š๊ธฐ์— ์ด๋Ÿฐ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ธฐ๋Š” ํž˜๋“ค๋‹ค.

 

๋„ˆ๋ฌด ํฐ '๋ฌดํ•œ๋Œ€'๊ฐ’
ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ์‹œ, ๋ฌดํ•œ๋Œ€์— ํ•ด๋‹นํ•˜๋Š” ํฐ ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•  ๋•Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. (์ตœ๋‹จ๊ฒฝ๋กœ ๋ฌธ์ œ.)

๋ฌดํ•œ๋Œ€ ๊ฐ’์„ ์„ ํƒ ์‹œ, ๋ฌดํ•œ๋Œ€๊ฐ’๋“ค์ด ์„œ๋กœ ๋”ํ•ด์ง€๊ฑฐ๋‚˜ ๊ณฑํ•ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†๋Š”์ง€ ์ž˜ ์‚ดํŽด๋ณด๊ณ  ์ด๋Ÿด ๋•Œ๋„ overflow๊ฐ€ ๋‚˜์ง€ ์•Š์„ ํฌ๊ธฐ์˜ ๊ฐ’์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

Overflow ์‹ฌํ™”
๊ทธ๋ ‡๋‹ค๋ฉด overflow๋ฐœ์ƒ์‚ฌ์‹ค์„ ์•Œ์•˜์„ ๋•Œ, ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ์•ผํ• ๊นŒ?
๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ "๋” ํฐ ์ž๋ฃŒํ˜•"์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
int lcm(int a, int b) {
	return (a * (long long)b) / gcd(a,b);
}โ€‹

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts