๐ ๋ชฉ์ฐจ
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 ํจํด์ ์ฌ์ฉ ์ ์ด๋ฐ ์ผ์ด ์ฆ์๋ฐ, ๊ฐ๋ฅํ ํ ํน์ ๋ฐฐ์ด์ ์ ๊ทผํ๋ ์์น๋ฅผ ํ๋๋ก ํต์ผํ๋ ๊ฒ์ด ์ข๋ค.
์๋ชป๋ ๋น๊ตํจ์์ ์์ฑ
์์ ํจ์์ ๊ฒฝ์ฐ, ์ ์์ ์งํฉ์ ์ ์ฅํ๋ IntegerSetํด๋์ค์ ๋ํด vector<IntegerSet>์ ๋ด๊ธด ์งํฉ๋ค์ ์์๋๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจ์๋ก operator overloading์ ์ด์ฉํด < ์ฐ์ฐ์๋ฅผ ์ค๋ฒ๋ก๋ฉํ๋ค.// 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; ]โ
์ ํจ์์ ๊ฒฝ์ฐ, ์ด๋ค ๋ฌธ์ ๊ฐ ์์๊น?
๋๋ถ๋ถ ์ฌ๋๋ค์ 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์ ๋ํด์๋ ๋ณ๋๋ก ์์ธ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
์์์ธ ๊ฐ์ฅ ์์ ์ ๋ ฅ์ ๋ํด ํ์ธํ์ผ๋, ์์๊ฐ ์๋ ๊ฐ์ฅ ์์ ์ ๋ ฅ๋ ์๊ฐํด๋ด์ผํ๋ค.
์์๊ฐ ์๋ ๊ฐ์ฅ ์์ ์์ฐ์๋ 1๋ก, for๋ฌธ๋ ์คํ๋์ง ์๊ณ ๊ฑด๋๋ฐ์ด true๋ฅผ ๋ฐํํด๋ฒ๋ฆฐ๋ค.
์ด์ฒ๋ผ, ์์ธ๋ ๊ผผ๊ผผํ ์ฒ๋ฆฌํ๊ธฐ ์ฝ์ง ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ฐ์ฐ์ ์ฐ์ ์์์ ์ค์ฌ์ฉ
์ฌ์น์ฐ์ฐ์ ํผ๋ํ๋ ์ผ์ด ์ ๋ค.
ํ์ง๋ง, ์ํํธ์ฐ์ฐ์๋ ๋นํธ๋จ์์ฐ์ฐ์๋ค์ ์ฐ์ ์์๋ ์ข ์ข ํท๊ฐ๋ฆฌ๊ฒ ๋๋ค.
์๋ฅผ ๋ค์ด๋ณด์.
์ด if๋ฌธ์ ์ผํ b์ ์ตํ ๋นํธ๊ฐ 0์ผ ๋ ์ฐธ์ผ๋ก ๋ณด์ธ๋ค.if(b & 1 == 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); }โ
'Gain Study > Algorithm๋ฌธํด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Gain_Study_์ข ๋ง๋ถ]01. ๋ฌธ์ ํด๊ฒฐ ์์ํ๊ธฐ (0) | 2023.09.04 |
---|