CSED232 – Assignment # 3 (Solution)

$ 30.00
Category:

Description

– Inheritance & polymorphism –
์ฃผ์˜์‚ฌํ•ญ
โ— ํด๋ž˜์Šค์„ ์–ธ๋ฐ์ •์˜๋ฅผ main.cpp ํŒŒ์ผ์—์ž‘์„ฑํ•˜๋Š”๊ฒƒ์„๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์™ธ์—์„ ์–ธ๋ฐ์ •์˜์˜ ์œ„์น˜์—๋Œ€ํ•œ์ œ์•ฝ์€์—†์Šต๋‹ˆ๋‹ค.
โ— STL ์‚ฌ์šฉ์ด๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
โ— ๋ชจ๋“  C++ ๋ฌธ๋ฒ•์ด์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
โ— ๋ฌธ์ œ์—์„œ์ œ๊ณตํ•œํ˜•์‹์„์ค€์ˆ˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
โ— ๋ฌธ์ œ์—๋ช…์‹œ๋˜์–ด์žˆ์ง€์•Š๋”๋ผ๋„์†Œ๋ฉธ์ž(Destructor)์™€๊ฐ™์€๋ฉ”๋ชจ๋ฆฌ๋ˆ„์ˆ˜๋ฐฉ์ง€๋ฅผ์œ„ํ•ดํ•„์š”ํ•œ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š”ํ•„์ˆ˜์ ์œผ๋กœ๊ตฌํ˜„๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
โ— ๋ฌธ์ œ์กฐ๊ฑด์ด๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ ๋ฌธ์ œ์˜์„ธ๋ถ€์กฐ๊ฑด์„๊ผผ๊ผผํžˆ์ฝ์–ด๋ณด์‹œ๊ธฐ๋ฐ”๋ž๋‹ˆ๋‹ค.
โ— ๊ณผ์ œ๊ด€๋ จ์งˆ๋ฌธ์€ PLMS๋ฅผํ†ตํ•ด๋ฌธ์˜๋ฐ”๋ž๋‹ˆ๋‹ค.
๊ฐ์ 
โ— ์ œ์ถœ๊ธฐํ•œ์—์„œํ•˜๋ฃจ(24์‹œ๊ฐ„) ๋Šฆ์„๋•Œ๋งˆ๋‹ค 20%์”ฉ๊ฐ์ 
โ—‹ 1์ผ(20%) , 2์ผ(40%), โ€ฆ 5์ผ(100%)
โ— ์ปดํŒŒ์ผ์ด์ •์ƒ์ ์œผ๋กœ์ด๋ฃจ์–ด์ง€์ง€์•Š์„๊ฒฝ์šฐ 0์ 
โ— ์ œ์ถœํ˜•์‹์œ„๋ฐ˜ (ํŒŒ์ผ์ด๋ฆ„๋“ฑ)
์ œ์ถœ๋ฐฉ์‹
(๋งฅ์‚ฌ์šฉ์ž์˜๊ฒฝ์šฐ) ํ™˜๊ฒฝ์—์„œ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. VS ๋กœ์ž‘์—…ํ–ˆ์„๊ฒฝ์šฐ์ž‘์—…ํ•˜์‹ ํ™˜๊ฒฝ์ด์žˆ๋Š” visual studio ํ”„๋กœ์ ํŠธํด๋”์— Report ๋ฅผํฌํ•จํ•˜์—ฌ zip ํŒŒ์ผ๋กœ์••์ถ•ํ›„์ œ์ถœํ•ด์ฃผ์‹œ๊ธฐ๋ฅผ๋ฐ”๋ž๋‹ˆ๋‹ค. (x64 ๋ฐ .vs ํด๋”๋Š” ์ „๋ถ€์ง€์›Œ์ฃผ์‹ญ์‹œ์˜ค) ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋งฅ์ด์šฉ์ž์˜๊ฒฝ์šฐ์†Œ์Šค์ฝ”๋“œ, ๋ณด๊ณ ์„œ, Makefile์„ํฌํ•จํ•œํด๋”๋ฅผ ์••์ถ•ํ•ด์„œ์ œ์ถœํ•ด์ฃผ์‹œ๋ฉด๋ฉ๋‹ˆ๋‹ค. ํด๋”๋ช…์€ โ€˜ํ•™๋ฒˆโ€™์œผ๋กœ๋งŒ๋“ค์–ด์ฃผ์‹œ๊ณ , Report๋Š” docx ๋‚˜ pdf ํ˜•์‹์œผ๋กœ ์ œ์ถœํ•ด์ฃผ์„ธ์š”. ๋ฐ˜๋“œ์‹œ PLMS ๋ฅผํ†ตํ•ด์ œ์ถœํ•ด์ฃผ์‹œ๊ธฐ๋ฅผ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ์ œ์ถœ์€์ธ์ •๋˜์ง€์•Š์Šต๋‹ˆ๋‹ค. ํด๋”
์ด๋ฆ„๊ณผ์••์ถ•ํŒŒ์ผ์€ โ€œAssign3_ํ•™๋ฒˆโ€์œผ๋กœ๋งŒ๋“œ์‹œ๋ฉด๋ฉ๋‹ˆ๋‹ค (e.g., Assign3_20229999).
๊ณตํ†ต์ฑ„์ ๊ธฐ์ค€
1. ํ”„๋กœ๊ทธ๋žจ๊ธฐ๋Šฅ
โ— ํ”„๋กœ๊ทธ๋žจ์ด์š”๊ตฌ์‚ฌํ•ญ์„๋ชจ๋‘๋งŒ์กฑํ•˜๋ฉด์„œ์˜ฌ๋ฐ”๋กœ์‹คํ–‰๋˜๋Š”๊ฐ€?
2. ํ”„๋กœ๊ทธ๋žจ์„ค๊ณ„๋ฐ๊ตฌํ˜„
โ— ์š”๊ตฌ์‚ฌํ•ญ์„๋งŒ์กฑํ•˜๊ธฐ์œ„ํ•œ๋ณ€์ˆ˜๋ฐ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ค๊ณ„๊ฐ€์ž˜๋˜์—ˆ๋Š”๊ฐ€?
โ— ๋ฌธ์ œ์—์„œ์ œ์‹œ๋œ์„ธ๋ถ€์กฐ๊ฑด์„๋ชจ๋‘๋งŒ์กฑํ•˜์˜€๋Š”๊ฐ€?
โ— ์„ค๊ณ„๋œ๋‚ด์šฉ์ด์š”๊ตฌ๋œ์–ธ์–ด๋ฅผ์ด์šฉํ•˜์—ฌ์ ์ ˆํžˆ๊ตฌํ˜„๋˜์—ˆ๋Š”๊ฐ€?
3. ํ”„๋กœ๊ทธ๋žจ๊ฐ€๋…์„ฑ
โ— ํ”„๋กœ๊ทธ๋žจ์ด์ฝ๊ธฐ์‰ฝ๊ณ ์ดํ•ดํ•˜๊ธฐ์‰ฝ๊ฒŒ์ž‘์„ฑ๋˜์—ˆ๋Š”๊ฐ€?
โ— ๋ณ€์ˆ˜๋ช…์ด๋ฌด์—‡์„์˜๋ฏธํ•˜๋Š”์ง€์ดํ•ดํ•˜๊ธฐ์‰ฌ์šด๊ฐ€?
โ— ํ”„๋กœ๊ทธ๋žจ์˜์†Œ์Šค์ฝ”๋“œ๋ฅผ์ดํ•ดํ•˜๊ธฐ์‰ฝ๋„๋ก์ฃผ์„์„์ž˜๋ถ™์˜€๋Š”๊ฐ€?
4. ๋ณด๊ณ ์„œ๊ตฌ์„ฑ๋ฐ๋‚ด์šฉ, ์–‘์‹
โ— ๋ณด๊ณ ์„œ๋Š”์ ์ ˆํ•œ๋‚ด์šฉ์œผ๋กœ์ดํ•ดํ•˜๊ธฐ์‰ฝ๊ณ ๋ณด๊ธฐ์ข‹๊ฒŒ์ž˜์ž‘์„ฑ๋˜์—ˆ๋Š”๊ฐ€?
โ— ๋ณด๊ณ ์„œ์˜์–‘์‹์„์ž˜๋”ฐ๋ž๋Š”๊ฐ€?
๋‹ค๋ฅธ์‚ฌ๋žŒ์˜ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜์ธํ„ฐ๋„ท์—์žˆ๋Š”ํ”„๋กœ๊ทธ๋žจ์„๋ณต์‚ฌ(copy)ํ•˜๊ฑฐ๋‚˜๊ฐ„๋‹จํžˆ์ˆ˜์ •ํ•ด์„œ์ œ์ถœํ•˜๋ฉด ํ•™์ ์€๋ฌด์กฐ๊ฑด โ€˜Fโ€™๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ๋ถ€์ •ํ–‰์œ„๊ฐ€๋ฐœ๊ฒฌ๋˜๋ฉดํ•™๊ณผ์—์„œ์ •ํ•œ๊ธฐ์ค€์—๋”ฐ๋ผ์ถ”๊ฐ€์ ์ธ๋ถˆ์ด์ต์ด ์žˆ์„์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค.
ASCII Art
ASCII art๋Š” ASCII ๋ฌธ์ž๋งŒ์„์‚ฌ์šฉํ•˜์—ฌ๊ทธ๋ฆผ์ด๋‚˜๋„ํ˜•์„๋งŒ๋“œ๋Š”์˜ˆ์ˆ ํ˜•์‹์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ, ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์ด์ž„์˜์˜์‚ฌ์ง„์—์„œ์–ด๋‘์šด๋ถ€๋ถ„์—ํ•ด๋‹นํ•˜๋Š”์œ„์น˜์—๋ณต์žกํ•œ๊ธ€์ž๋ฅผ์œ„์น˜์‹œํ‚ค๊ณ ๋ฐ์€๋ถ€๋ถ„์—๋Š”๋‹จ์ˆœํ•œ ๊ธ€์ž๋ฅผ์œ„์น˜์‹œํ‚ค๋ฉด๋ฌธ์ž๋กœ๋งŒ์ด๋ค„์ง„๊ทธ๋ฆผ์ด์•„๋ž˜์™€๊ฐ™์ด๋ณด์ด๊ฒŒ๋œ๋‹ค. ๋ณธ๊ณผ์ œ์—์„œ๋Š”ํด๋ž˜์Šค์ƒ์†๊ณผ ๋‹คํ˜•์„ฑ์„์‚ฌ์šฉํ•ด์„œ๊ฐ„๋‹จํ•œ ASCII Art๋ฅผ์ƒ์„ฑํ•˜๋Š”ํ”„๋กœ๊ทธ๋žจ์„๋งŒ๋“œ๋Š”๊ฒƒ์„๋ชฉ์ ์œผ๋กœํ•œ๋‹ค.

[ ๊ทธ๋ฆผ1. ASCII art example]
๋ฌธ์ œํ•ด๊ฒฐ์„์œ„ํ•ด์‚ฌ์šฉ๋˜๋Š” class์™€์ƒ์†๊ด€๊ณ„๋Š”์•„๋ž˜๊ทธ๋ฆผ 2๊ณผ๊ฐ™๋‹ค. ํ™”์‚ดํ‘œ๋Š”์ƒ์†์„์˜๋ฏธํ•˜๊ณ 
๋ฐฉํ–ฅํ‘œ์‹œ๊ฐ€์žˆ๋Š” class๊ฐ€๋ถ€๋ชจ class๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ classic class๋Š” artist class๋ฅผ์ƒ์†๋ฐ›๋Š”๋‹ค.

[ ๊ทธ๋ฆผ2. Class diagram ]
ํ”„๋กœ๊ทธ๋žจ์„๊ตฌํ˜„์—์•„๋ž˜์™€๊ฐ™์€์ œ์•ฝ์‚ฌํ•ญ๋“ค์ด๋”ฐ๋ฅธ๋‹ค.
โ— ๊ทธ๋ฆผ2์—๋ช…์‹œ๋œ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฐํ•จ์ˆ˜๋Š”๋ฐ˜๋“œ์‹œ๊ตฌํ˜„๋˜๊ณ ์‚ฌ์šฉ๋˜์–ด์•ผํ•œ๋‹ค.
โ— ๊ทธ๋ฆผ2์—๋ช…์‹œ๋œ๋ฉค๋ฒ„ํ•จ์ˆ˜์˜์ธ์ž์™€ return type์ด์ค€์ˆ˜๋˜์–ด์•ผํ•œ๋‹ค.
โ— ๊ทธ๋ฆผ2์—๋ช…์‹œ๋œ class ์™ธ์—๋‹ค๋ฅธ class๋ฅผ์ •์˜ํ•ด์„œ์‚ฌ์šฉํ• ์ˆ˜์—†๋‹ค.
โ— ์ œ๊ณต๋œํ•จ์ˆ˜(function) ์™ธ์—ํ•จ์ˆ˜๋ฅผ์ •์˜ํ•ด์„œ์‚ฌ์šฉํ• ์ˆ˜์—†๋‹ค.
โ— class diagram์—๋ช…์‹œ๋œ๋ฉค๋ฒ„ํ•จ์ˆ˜(method)์™€๋ฉค๋ฒ„๋ณ€์ˆ˜์™ธ์—๋„ํ•„์š”ํ•œ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฐ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์ž์œ ๋กญ๊ฒŒ์ถ”๊ฐ€ํ• ์ˆ˜์žˆ๋‹ค.
โ— ์ฃผ์–ด์ง„ main ํ•จ์ˆ˜๋Š”์ ˆ๋Œ€๋กœ์ˆ˜์ •ํ• ์ˆ˜์—†๋‹ค.
๊ทธ๋ฆผ 2์—ํ‘œํ˜„๋œํด๋ž˜์Šค๋ฐ main ํ•จ์ˆ˜์—๋Œ€ํ•œ์ž์„ธํ•œ์„ค๋ช…์€์•„๋ž˜์™€๊ฐ™๋‹ค.
int main(int argc, char *argv[])
C++ main ํ•จ์ˆ˜์— int ์™€ char*[] ๋ฅผ argument๋กœ์ •์˜ํ•œ๊ฒฝ์šฐ, ์ฒซ๋ฒˆ์งธ์ธ์ž๋Š”ํ”„๋กœ๊ทธ๋žจ์‹คํ–‰์‹œ์ž…๋ ฅ๋ฐ›์€ argument์˜์ˆ˜, ๋‘๋ฒˆ์งธ์ธ์ž๋Š”์‹ค์ œ argument ๊ฐ’๋“ค์„๊ฐ–๋Š”๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ์ž„์˜์˜ compile๋œํ”„๋กœ๊ทธ๋žจ
hello ๋ฅผ
./hello 2 world 1234
๋ผ๋Š”๋ช…๋ น์–ด๋กœ์‹คํ–‰์‹œํ‚ฌ๊ฒฝ์šฐ argc ๋Š” 4, argv[1] ๋Š” 2 argv[2] ๋Š” world, argv[3] ๋Š” 1234๊ฐ€๋œ๋‹ค. ์ฐธ๊ณ ๋กœ argv[0]์—๋Š”์‹คํ–‰ํŒŒ์ผ๊ฒฝ๋กœ๊ฐ€์ž๋™์œผ๋กœํ• ๋‹น๋˜๋ฉฐ, ๋”ฐ๋ผ์„œ argc ๋Š” 3์ด์•„๋‹Œ 4๊ฐ€๋œ๋‹ค.
๋ณธ๊ณผ์ œ์—์„œ์ตœ์ข… compile๋œํ”„๋กœ๊ทธ๋žจ์€์‹คํ–‰์‹œ 3๊ฐœ์˜์ธ์ž๋ฅผ๋ฐ›๋Š”๋‹ค. ์ฒซ๋ฒˆ์งธ์ธ์ž๋Š” inputํŒŒ์ผ์˜๊ฒฝ๋กœ,
๋‘๋ฒˆ์งธ์ธ์ž๋Š” configuration ํŒŒ์ผ์˜๊ฒฝ๋กœ, ์„ธ๋ฒˆ์งธ์ธ์ž๋Š” output ํŒŒ์ผ์˜๊ฒฝ๋กœ๋‹ค. ์ฃผ์–ด์ง„ mainํ•จ์ˆ˜๋Š”์•„๋ž˜์™€๊ฐ™์œผ๋ฉฐ์ ˆ๋Œ€์ˆ˜์ •์„๋ถˆ๊ฐ€ํ•œ๋‹ค.
int main(int argc, char *argv[]) {
if (argc != 4) {
cout << “argc is not 4, but ” << argc << endl; throw;
}
// CREATE PARSER parser p;
// LOAD IMAGE AND CONFIG
vector<int> tokens = p.load_image(argv[1]); vector<string> configs = p.load_config(argv[2]);

string style_target = configs[0]; string drawer_target = configs[1]; char *path_output = argv[3];
int width = tokens[0]; int height = tokens[1];
vector<int> vals = {tokens.begin() + 2, tokens.end()};
// CREATE ARTIST artist *style;
if (style_target == “classic”) { style = new classic(width, height, vals);
} else if (style_target == “iclassic”) { style = new iclassic(width, height, vals);
} else if (style_target == “sobelx”) { style = new sobelx(width, height, vals);
} else if (style_target == “sobely”) { style = new sobely(width, height, vals);
} else if (style_target == “gradient”) { style = new gradient(width, height, vals);
} else { throw;
}
// CREATE DRAWER drawer *d;
if (drawer_target == “drawer”) {
d = new drawer(style);
} else if (drawer_target == “upsample”) { d = new upsample(style);
} else if (drawer_target == “downsample”) { d = new downsample(style);
} else if (drawer_target == “scale”) { int scale_x = stoi(configs[2]); int scale_y = stoi(configs[3]); d = new scale(style, scale_x, scale_y);
} else { throw;
}
// PERFORM DRAWING string output = d->draw(); cout << output;
// WRITE OUTPUT
p.write_result(path_output, output); delete d; return 0;
}
vector<int> parser::load_image(const char*)
์ธ์ž๋กœ input file์˜๊ฒฝ๋กœ๋ฅผ๋ฐ›๊ณ ํ•ด๋‹นํŒŒ์ผ์˜์ •๋ณด๋ฅผ๋ถˆ๋Ÿฌ์˜จ๋‹ค. input ํŒŒ์ผ์˜๋‚ด์šฉ์€์ผ๋ จ์˜์ˆซ์ž๋“ค์ด delimiter โ€˜|โ€™ ์„ํ†ตํ•ด๋‚˜๋ˆ ์ ธ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ input ํŒŒ์ผ์˜๋‚ด์šฉ์ด
3|2|101|102|103|104|105|106
์™€๊ฐ™๋‹ค๋ฉด, ํ•ด๋‹นํ•จ์ˆ˜์˜ return ๊ฐ’์€
vector<int> { 3 ,2, 101, 102, 103, 104, 105, 106 }
์ด๋œ๋‹ค. ์—ฌ๊ธฐ์„œ์ฒ˜์Œ๋‘๊ฐ’์€๊ทธ๋ ค์งˆ๊ทธ๋ฆผ์˜ width์™€ height๋ฅผ์˜๋ฏธํ•˜๊ณ ๋‚˜๋จธ์ง€๊ฐ’์€๊ฐ์ขŒํ‘œ์—ํ•ด๋‹น๋˜๋Š” pixel ๊ฐ’์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ์œ„์ •๋ณด๋Š”
101
(0,0) 102
(1,0) 103
(2,0)
104
(0,1) 105
(1,1) 106
(2,1)
์™€๊ฐ™์ด์‹œ๊ฐํ™”๋ ์ˆ˜์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๊ด„ํ˜ธ์•ˆ์˜์ •๋ณด๋Š” x,y ์ขŒํ‘œ๋ฅผ์˜๋ฏธํ•œ๋‹ค. ์ดํ›„ artist์™€ drawer class๋ฅผ ํ†ตํ•ด์„œํ•ด๋‹น๊ฐ’์ดํŠน์ • ASCII ๋ฌธ์ž๋กœ๋ณ€ํ™˜๋˜๋ฉฐ๊ทธ๋ฆผ์„๊ทธ๋ฆฌ๊ฒŒ๋œ๋‹ค.
vector<string> parser::load_config(const char*)
์ธ์ž๋กœ config file์˜๊ฒฝ๋กœ๋ฅผ๋ฐ›๊ณ ํ•ด๋‹น์ •๋ณด๋ฅผ๋ถˆ๋Ÿฌ์˜จ๋‹ค. config ํŒŒ์ผ์˜๋‚ด์šฉ์€์ผ๋ จ์˜ text๋“ค์ด delimiter โ€˜|โ€™ ์„ํ†ตํ•ด๋‚˜๋ˆ ์ ธ์žˆ๋‹ค. ์ฒซ๋ฒˆ์งธ๊ฐ’์€์‚ฌ์šฉ๋  artist class์˜์ด๋ฆ„, ๋‘๋ฒˆ์งธ๊ฐ’์€์‚ฌ์šฉ๋  drawer class์˜ ์ด๋ฆ„์„์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ config ํŒŒ์ผ์˜๋‚ด์šฉ์ด
iclassic|upsample
์™€๊ฐ™๋‹ค๋ฉด, ํ•ด๋‹นํ•จ์ˆ˜์˜ return ๊ฐ’์€
vector<string> { โ€œiclassicโ€, โ€œupsampleโ€}
์ด๋œ๋‹ค.
void parser::write_result(const char*, const string&)
์ฒซ๋ฒˆ์งธ์ธ์ž๋กœ์ €์žฅํ• ํŒŒ์ผ๊ฒฝ๋กœ, ๋‘๋ฒˆ์งธ์ธ์ž๋กœ์ €์žฅํ• ๋‚ด์šฉ์ด๋“ค์–ด์˜จ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ
p.write_result(โ€œoutput.txtโ€,โ€hello worldโ€)
๋ฅผํ˜ธ์ถœํ•˜๋ฉด output.txtํŒŒ์ผ์ด โ€œhello worldโ€๋ผ๋Š”๋‚ด์šฉ์ด๋‹ด๊ฒจ์„œ์ƒ์„ฑ๋œ๋‹ค. ํ•ด๋‹นํ•จ์ˆ˜๋กœ์ตœ์ข…๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ฒŒ๋œ๋‹ค. ์˜ˆ์‹œ๋Š”์•„๋ž˜์™€๊ฐ™์œผ๋ฉฐ์˜ˆ์‹œ๋ฅผ๊ทธ๋Œ€๋กœ์‚ฌ์šฉํ•ด๋„๋ฌด๋ฐฉํ•˜๋‹ค.
void parser::write_result(const char *path, const string& contents) {
ofstream myfile; myfile.open(path); myfile << contents; myfile.close();
}
artist(int, int, const std::vector<int>&)
artist class๋Š”๊ทธ๋ฆผ์˜์Šคํƒ€์ผ์„์ •์˜ํ•˜๋Š” class๋‹ค. ๋‹ค์–‘ํ•œ์Šคํƒ€์ผ class๋“ค์ด artist class๋ฅผ์ƒ์†๋ฐ›์•„์„œ ์ž์‹ ๋งŒ์˜์Šคํƒ€์ผ์„์ •์˜ํ•˜๊ฒŒ๋ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ ์ดํ›„์„ค๋ช…ํ•  drawer class๊ฐ€ artist class์˜ instance๋ฅผ ์ธ์ž๋กœ๋ฐ›์•„์„œ์ตœ์ข…์ ์ธ๊ทธ๋ฆผ์„๊ทธ๋ฆฌ๊ฒŒ๋œ๋‹ค.
์ƒ์„ฑ์ž๋Š”์ฒซ๋ฒˆ์งธ์ธ์ž๋กœ๊ทธ๋ฆผ์˜ width, ๋‘๋ฒˆ์งธ์ธ์ž๋กœ๊ทธ๋ฆผ์˜ height, ์„ธ๋ฒˆ์งธ์ธ์ž๋กœ๊ทธ๋ฆผ์˜๊ฐ์ขŒํ‘œ์—
ํ•ด๋‹นํ•˜๋Š” pixel ๊ฐ’์„๋ฐ›๋Š”๋‹ค. ์ฆ‰, input ํŒŒ์ผ parsing ๊ฒฐ๊ณผ๋ฅผ์ธ์ž๋กœ๋ฐ›๋Š”๋‹ค.
virtual char mapper(int, int)
์ฒซ๋ฒˆ์งธ์ธ์ž๋กœ x coordinate, ๋‘๋ฒˆ์งธ์ธ์ž๋กœ y coordinate์„๋ฐ›๊ณ , ์‚ฌ์šฉ๋  ASCII ๋ฌธ์ž๋ฅผ returnํ•œ๋‹ค. ๋‹คํ˜•์„ฑ์„๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ virtual method์ด๊ธฐ๋•Œ๋ฌธ์—ํ•ด๋‹น class์—์„œ๋Š”๊ตฌํ˜„๋˜์ง€์•Š๊ณ ์ƒ์†๋ฐ›๋Š” class์—์„œ ๊ตฌํ˜„๋œ๋‹ค.
char classic::mapper(int, int)
classic class์˜ mapper๋Š”๊ฐ€์žฅ์ผ๋ฐ˜์ ์ธ ASCII Art์˜ mapping์„๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋ฏธ์ง€๋Š” display์—ํ‘œํ˜„๋  ๋•Œ pixel๊ฐ’์ด์ž‘์„์ˆ˜๋ก์–ด๋‘ก๊ฒŒ๋‚˜ํƒ€๋‚œ๋‹ค. ์ด๊ด€์ฐฐ์—๊ทผ๊ฑฐํ•ด์„œ pixel ๊ฐ’์ด๋‚ฎ์„์ˆ˜๋ก์‹œ๊ฐ์ ์œผ๋กœ denseํ•œ ASCII ๋ฌธ์ž๋ฅผ๋Œ€์ž…์‹œ์ผœ๊ทธ๋ฆผ์„ํ‘œํ˜„ํ•œ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ classic::mapper๋Š” pixel์„ํ‘œํ˜„ํ•˜๊ธฐ์œ„ํ•ด์„œ
15๊ฐœ์˜ ASCII ๋ฌธ์ž
โ€˜@โ€™ โ€˜&โ€™ โ€˜%โ€™ โ€˜Wโ€™ โ€˜Xโ€™ โ€˜Aโ€™ โ€˜Hโ€™ โ€˜Oโ€™ โ€˜Tโ€™ โ€˜*โ€™ โ€˜^โ€™ โ€˜+โ€™ โ€˜-โ€™ โ€˜.โ€™ โ€˜ โ€˜
๋ฅผ์‚ฌ์šฉํ•œ๋‹ค. ์™ผ์ชฝ๋ถ€ํ„ฐ pixel ๊ฐ’์ด๋‚ฎ์€๊ฒฝ์šฐ์—๋Œ€์‘๋˜๊ณ ๊ฐ๋ฌธ์ž๋Š” [0, 254] ์‚ฌ์ด์˜๊ฐ’์„ 17๊ฐœ์”ฉ๊ท ์ผํ•˜๊ฒŒ ์ปค๋ฒ„ํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ โ€˜@โ€™๋Š” [0, 16], โ€˜&โ€™ ๋Š” [17, 33]๋ฅผ์ปค๋ฒ„ํ•œ๋‹ค. ์˜ˆ์™ธ์ ์œผ๋กœ๋งˆ์ง€๋ง‰๋ฌธ์ž๋งŒ 18๊ฐœ, [238,
255]์˜๋ฒ”์œ„๋ฅผ์ปค๋ฒ„ํ•œ๋‹ค. ๊ฐ pixel์ด ASCII ๋ฌธ์ž๋กœ๋ณ€ํ•˜๋Š”์˜ˆ์‹œ๋Š”
2 18 @ &
18 37 & %
์™€๊ฐ™๋‹ค. ์ฐธ๊ณ ๋กœ๊ทธ๋ฆผ1์˜ ASCII art๋Š” classic::mapper๋ฅผํ†ตํ•ด๊ทธ๋ ค์ง„๊ฒฐ๊ณผ๋‹ค.
char iclassic::mapper(int, int)
iclassic์€ inverted classic์˜์•ฝ์ž๋‹ค. iclassic::mapper๋Š”์‚ฌ์šฉ๋˜๋Š” ASCII๋ฌธ์ž์˜์ˆœ์„œ๋ฅผ๋ฐ˜๋Œ€๋กœ์‚ฌ์šฉํ•œ
๊ฒƒ์™ธ์— classic::mapper์™€๋ชจ๋“  logic์ด๋™์ผํ•˜๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ โ€˜ โ€˜๊ฐ€ [0, 16]์„์ปค๋ฒ„ํ•˜๊ณ  โ€˜@โ€™๊ฐ€ [238, 255]๋ฅผ์ปค๋ฒ„ํ•œ๋‹ค.
char sobelx::mapper(int, int)
sobel operation์€์˜์ƒ์—์„œ edge์„ฑ๋ถ„์„๊ฒ€์ถœํ• ๋•Œ์‚ฌ์šฉ๋˜๋Š”์—ฐ์‚ฐ์ด๋‹ค. ๋ณธ๊ณผ์ œ์—์„œ sobelx::mapper๋Š” ์ž„์˜์˜ pixel์—์„œ x์ถ•์–‘์˜๋ฐฉํ–ฅ์œผ๋กœ์ธ์ ‘ํ•œ pixel๊ณผ์˜์ฐจ์ด๊ฐ€ 50์ด์ƒ์ธ๊ฒฝ์šฐ โ€˜|โ€™๋ฅผ, ๊ทธ๋ ‡์ง€์•Š์€๊ฒฝ์šฐ ๊ณต๋ฐฑ๋ฌธ์ž โ€˜ โ€˜๋ฅผ๋ฆฌํ„ดํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ
100 160 120 |
100 30 100 | |
100 100 170 |
์™€๊ฐ™์ด์™ผ์ชฝ์˜ pixel ๊ฐ’์—๋Œ€ํ•ด์„œ์˜ค๋ฅธ์ชฝ๊ฐ™์€ ASCII ๋ฌธ์ž๊ฐ€๊ทธ๋ ค์ง„๋‹ค.
char sobely::mapper(int, int)
sobelx์—์„œ์‚ฌ์šฉ๋œ logic๊ณผ๋‘๊ฐ€์ง€์„ธ๋ถ€์‚ฌํ•ญ์ด๋‹ค๋ฅด๋‹ค. ๋จผ์ € x์ถ•์ด์•„๋‹Œ y์ถ•์˜๋ฐฉํ–ฅ์„๊ณ ๋ คํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ 
๋ฆฌํ„ด๋˜๋Š”๋ฌธ์ž๊ฐ€ โ€˜|โ€™๊ฐ€์•„๋‹Œ โ€˜-โ€™์ด๋‹ค.
char gradient::mapper(int, int)
gradient::mapper๋Š” sobelx::mapper์™€ sobely::mapper์˜ logic์„๊ทธ๋Œ€๋กœ๋ฐ˜์˜ํ•œ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ x,y์ถ•
์–‘์˜๋ฐฉํ–ฅ๋ชจ๋‘์ธ์ ‘ํ•œ pixel๊ณผ์˜์ฐจ์ด๊ฐ€ 50์ด์ƒ์ธ๊ฒฝ์šฐ โ€˜+โ€™๋ฅผ๋ฆฌํ„ดํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ
100 160 120 | –
100 30 100 | + –
100 100 170 |
์™€๊ฐ™์ด์™ผ์ชฝ์˜ pixel ๊ฐ’์ด์˜ค๋ฅธ์ชฝ๊ณผ๊ฐ™์€ ASCII ๋ฌธ์ž๋กœ๊ทธ๋ ค์ง„๋‹ค.
drawer(artist *)
drawer class๋Š” artist๊ฐ€๊ฐ–๋Š” method๋ฅผ์‚ฌ์šฉํ•ด์„œ์ตœ์ข…์ ์œผ๋กœ๊ทธ๋ ค์ง€๋Š” string์„๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ๋”ฐ๋ผ์„œ
drawer ์ƒ์„ฑ์ž๋Š”์ฒซ๋ฒˆ์งธ์ธ์ž๋กœ artist pointer instance๋ฅผ๋ฐ›๋Š”๋‹ค.
string drawer::draw()
์ตœ์ข… ASCII ๋ฌธ์ž๋กœ๊ตฌ์„ฑ๋œ๊ทธ๋ฆผ์„ํ•˜๋‚˜์˜ string์œผ๋กœ๋ฆฌํ„ดํ•œ๋‹ค.
string downsample::draw()
upsample๊ณผ downsample์€์ด๋ฏธ์ง€ํฌ๊ธฐ๋ฅผํ‚ค์šฐ๊ณ ์ค„์ด๋Š”๋ฐ์‚ฌ์šฉ๋˜๋Š”๋ฐฉ๋ฒ•์ด๋‹ค. ๋ณธ๊ณผ์ œ์—์„œ๋Š”
Nearest-neighbor ๊ธฐ๋ฐ˜์˜ upsample๊ณผ downsample์„ downsample::draw์™€ upsample::draw๋ฅผํ†ตํ•ด์„œ ๋ชจ๋ฐฉํ•œ๋‹ค.
downsample::draw()๋Š” drawer::draw()๋กœ๊ทธ๋ ค์ง€๋Š”๊ทธ๋ฆผ์˜ํฌ๊ธฐ๋ฅผ์ ˆ๋ฐ˜์œผ๋กœ์ค„์ธ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ์ขŒํ‘œ (0,
0)์€๋ฐ˜๋“œ์‹œ๊ทธ๋ ค์ง€๊ณ , ํ•ด๋‹น์ขŒํ‘œ๋ฅผ๊ธฐ์ค€์œผ๋กœํ™€์ˆ˜๊ฐ’์„๊ฐ–๋Š”์ขŒํ‘œ์˜๋ฌธ์ž๋“ค์€๋ฌด์‹œ๋œ๋‹ค. ์˜ˆ์‹œ๋Š”

์™€๊ฐ™์œผ๋ฉฐ์™ผ์ชฝ์ด์›๋ณธ์ด๊ณ ์˜ค๋ฅธ์ชฝ์ด downsample ๊ฒฐ๊ณผ๋‹ค.
string upsample::draw()
downsample::draw()์™€๋ฐ˜๋Œ€๋กœ๊ทธ๋ฆผ์˜ํฌ๊ธฐ๋ฅผ๋‘๋ฐฐ๋กœํ‚ค์šด๋‹ค. ํ‚ค์šฐ๋Š”๊ณผ์ •์—์„œ๊ฐ๋ฌธ์ž๋ฅผ๋ฐ˜๋ณตํ•œ๋‹ค. ์˜ˆ์‹œ๋Š”

์™€๊ฐ™์œผ๋ฉฐ์™ผ์ชฝ์ด์›๋ณธ์ด๊ณ ์˜ค๋ฅธ์ชฝ์ด upsapmle ๊ฒฐ๊ณผ๋‹ค.
scale(artist *, int, int)
scale class์˜์ƒ์„ฑ์ž๋Š”์˜ˆ์™ธ์ ์œผ๋กœ artist*์™ธ์—์ถ”๊ฐ€์ ์ธ๋‘๊ฐœ์˜ int ์ธ์ž๋ฅผ๋ฐ›๋Š”๋‹ค. ๋‘ int ์ธ์ž๋Š”๊ฐ๊ฐ x, y์ถ•์œผ๋กœํ™•์žฅ๋ฐ์ถ•์†Œ๋ ๊ฐ’์„์˜๋ฏธํ•œ๋‹ค. ์ด๊ฒฝ์šฐ์˜ˆ์™ธ์ ์œผ๋กœ config ํŒŒ์ผ์— 2๊ฐœ๊ฐ€์•„๋‹Œ 4๊ฐœ์˜์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด์•ผํ•˜๋ฉฐ 3,4 ๋ฒˆ์งธ์ •๋ณด๊ฐ€ํ•ด๋‹น scale ์ƒ์„ฑ์ž์˜์ธ์ž๋กœ๋“ค์–ด๊ฐ„๋‹ค. ํ•ด๋‹น๋‚ด์šฉ์€ main ํ•จ์ˆ˜์—์ด๋ฏธ ์ž‘์„ฑ๋˜์–ด์žˆ๋‹ค.
string scale::draw()
downsample::draw()์™€ upsample::draw()์ด์ถ•์„๊ตฌ๋ถ„ํ•˜์ง€์•Š๊ณ ๋‹จ์ˆœํžˆ 2๋ฐฐํ™•์žฅ๋ฐ์ถ•์†Œ๋ฅผํ–ˆ๋‹ค๋ฉด, scale::draw()๋Š”๊ฐ์ถ•์—๋Œ€ํ•ด์„œ์ •ํ•ด์ง„๋ฐฐ์œจ์˜ํ™•์žฅ์ถ•์†Œ๋ฅผ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋ฐฐ์œจ์ด์ž์—ฐ์ˆ˜์ธ๊ฒฝ์šฐํ•ด๋‹น๊ฐ’์˜ ๋ฐฐ์œจ๋กœ๊ทธ๋ฆผ์„ํ™•์žฅํ•œ๋‹ค. ๋ฐฐ์œจ์ด์Œ์˜์ •์ˆ˜์ธ๊ฒฝ์šฐํ•ด๋‹น๊ฐ’์˜์Œ์˜์—ญ์ˆ˜๋ฅผ๋ฐฐ์œจ๋กœ์‚ฌ์šฉํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ 0 ์ธ๊ฒฝ์šฐ๋Š”ํ—ˆ์šฉํ•˜์ง€์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ x์ถ•๊ณผ y์ถ•๋ฐฐ์œจ์ด 3, -2 ์ธ๊ฒฝ์šฐ x์ถ•์œผ๋กœ 3๋ฐฐ, y ์ถ•์œผ๋กœ 1/2๋ฐฐ ํ™•์žฅ๋ฐ์ถ•์†Œํ•œ๋‹ค. ์•„๋ž˜์ด์–ด์ง€๋Š”์˜ˆ์‹œ๋Š”ํ”„๋กœ๊ทธ๋žจ์˜ input๊ณผ์ด์—๋Œ€์‘๋˜๋Š” output์˜ˆ์‹œ๋“ค์ด๋‹ค.
@@@@%%%WWXXXHHHOOTTT***++—….
@@@@%%%WWXXXHHHOOTTT***++—….
@@@@%%%WWXXXHHHOOTTT***++—….
@@@@%%%WWXXXHHHOOTTT***++—….
@@@@%%%WWXXXHHHOOTTT***++—….
@@@@%%%WWXXXHHHOOTTT***++—….
@@@@%%%WWXXXHHHOOTTT***++—….
@@@@%%%WWXXXHHHOOTTT***++—….
….—++***TTTOOHHHXXXWW%%%@@@@
….—++***TTTOOHHHXXXWW%%%@@@@
….—++***TTTOOHHHXXXWW%%%@@@@
….—++***TTTOOHHHXXXWW%%%@@@@
….—++***TTTOOHHHXXXWW%%%@@@@
….—++***TTTOOHHHXXXWW%%%@@@@
….—++***TTTOOHHHXXXWW%%%@@@@
….—++***TTTOOHHHXXXWW%%%@@@@
output using input1.txt and confit1.txt
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@&^–+^..^.HHX@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@*–…–.–. .+.*^^^+-@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@.-^.-…-++^^-.+.-+-.—.-.@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@&-.*…… ….. ..+… …+.+.@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@…-..-..-+.. …………+…….-@@@@@@@@@@@@@@@@
@@@@@@@@@@@@…..^HAXXXXAH*.+-^*++-+^*TOHO^……&@@@@@@@@@@@@@@
@@@@@@@@@@@-..-*HAAXXXXWXWWWXWWWWWWWXWXXXAHHO^..-+%@@@@@@@@@@@@@
@@@@@@@@@@….*OHAXXXWXW%%%%%&&&&&%%%WWWXXAHHAH+…@@@@@@@@@@@@@
@@@@@@@@@@-..+HHAAXXWW%&&&&&&&&&&&&&%%WWXXAAHOOH^…@@@@@@@@@@@@
@@@@@@@@@T-..HOOHAXXW%%%%%&&&&&&&&&&%%WWXAHAHHHHA..^@@@@@@@@@@@@
@@@@@@@@@+.-+HOHHAXWW%%%%%%&@&&@&&&%%%WXXAHHHOHHA-+^@@@@@@@@@@@@
@@@@@@@@@+..+AHHAAXWWWWW%%%%&&&&&&%%%WWXAAHHOOOHXT.*@@@@@@@@@@@@
@@@@@@@@@^…*AHOAXWXWW%%%%&%%%%%%%WWWXXAHHOOTOAW+-^@@@@@@@@@@@@
@@@@@@@@@@-.^*OTOAXXWWWWWW%WWWWWXWWWXXAAAHHOTOHXHT-+@@@@@@@@@@@@
@@@@@@@@@@T.-OXX*+—–..-^HXXAAAH*.-……-^AW%T.+@@@@@@@@@@@@@
@@@@@@@@@@&..X%%OTOHT—+^^*OHHHT-+-+-+-++^^O%&X-.A@@@@@@@@@@@@@
@@@@@@@@@@X+**&WT^..A-. *HT*TWWX^.**W….O+.+H%*+^A*@@@@@@@@@@@@
@@@@@@@@@@@HX+@WAXWWXW%%WX%WXW%X**THHXWXXXAAHAW^HO-%@@@@@@@@@@@@
@@@@@@@@@@@AAO&%AAXXWWWXXWXXX%%XT*OHAXXXWWWXAHW^-WH@@@@@@@@@@@@@
@@@@@@@@@@@&X%&%WAHAAXXXXAXXX%%WO^*THAXXXXXXHH%*+H&@@@@@@@@@@@@@
@@@@@@@@@@@@%%X@WHHHHAXXXWAXAW%WX^TOHAAAAHHOOAWTHA@@@@@@@@@@@@@@
@@@@@@@@@@@@@AX%WOHOHAAXAHXAAW%WHAT*HAHHHHOTOXX*O@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@WHHHHAAXWWWXHO^^+-^TOHHHOOTOAX@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@HHHHAXXXXXWXXHAOOTOOOOOOOOHW@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@AHHHHAAXWWO**HT*^THOOHOOOAX@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@XOOHOAXXXWAXXXHHHTOAAAHTHTO@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@WOT^OOOAHHOT*^^*TOHHOOOOTTO@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@%AO*^-*OHHAAHAAAAAHOT****OH@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@AXAO*^^++*OTOTOTT^^^^^^TOHA@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@HXWWAHOT^+++++^^+++^^^*TOHHAX@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@OAAWWXXAHOO*^++^+++^^**TOOHHHXXA@@@@@@@@@@@@@@@@@
output using input2.txt and confit2.txt
์ตœ์ข…์ ์œผ๋กœํ’€์–ด์•ผํ•˜๋Š”๋ฌธ์ œ๋Š”์•„๋ž˜์™€๊ฐ™๋‹ค. ๋ฌธ์ œ 1,2,3์€์ฝ”๋“œ๊ตฌํ˜„๋ฌธ์ œ๋กœ test case๋ฅผํ†ตํ•ด์„œ์ฑ„์  ๋˜๊ณ , ๋ฌธ์ œ 4,5๋Š”๋ณด๊ณ ์„œ์—์ž‘์„ฑํ•œ๋‹ค.
๋ฌธ์ œ1> parser ํด๋ž˜์Šค๋ฅผ๊ตฌํ˜„ํ•˜๋ผ
๋ฌธ์ œ2> artist class ๋ฐ artist๋ฅผ์ƒ์†๋ฐ›๋Š” class ๊ทธ๋ฆฌ๊ณ  drawer class๋ฅผ๊ตฌํ˜„ํ•˜๋ผ ๋ฌธ์ œ3> drawer class๋ฅผ์ƒ์†๋ฐ›๋Š” class๋“ค์„๊ตฌํ˜„ํ•˜๋ผ ๋ฌธ์ œ4> drawer ์ƒ์„ฑ์ž๊ฐ€ artist๊ฐ€์•„๋‹Œ artist*๋ฅผ์ธ์ž๋กœ๋ฐ›๋Š”์ด์œ ๋ฅผ์„ค๋ช…ํ•˜๋ผ (๋ณด๊ณ ์„œ์—์ž‘์„ฑ) ๋ฌธ์ œ5> artist ํด๋ž˜์Šค๋ฅผ์ƒ์†๋ฐ›์•„์„œ์ž์‹ ๋งŒ์˜ style์„์ •์˜ํ•˜๊ณ ๊ทธ๋ฆผ์„์ถœ๋ ฅํ•˜๋ผ (๋ณด๊ณ ์„œ์—์ž‘์„ฑ) ๋ฌธ์ œ6> ์ œ์‹œ๋œํด๋ž˜์Šค๋“ค์„๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ด€์ ์—์„œ๊ฐœ์„ ํ• ์ˆ˜์žˆ๋‹ค๋ฉด์–ด๋–ค์ ์„๋”๊ฐœ์„ ํ• ์ˆ˜ ์žˆ์„์ง€ํ† ์˜ํ•˜๋ผ (๋ณด๊ณ ์„œ์—์ž‘์„ฑ)

Reviews

There are no reviews yet.

Be the first to review “CSED232 – Assignment # 3 (Solution)”

Your email address will not be published. Required fields are marked *