๐
2025-08-11
๋ฌธ์ ๋งํฌ
๋ฌธ์ ์ค๋ช
0 ๋๋ ์์ ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ ์๋ฅผ ์ด์ด ๋ถ์ฌ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ์๋ฅผ ์์๋ด ์ฃผ์ธ์.
์๋ฅผ ๋ค์ด, ์ฃผ์ด์ง ์ ์๊ฐ [6, 10, 2]๋ผ๋ฉด [6102, 6210, 1062, 1026, 2610, 2106]๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ด์ค ๊ฐ์ฅ ํฐ ์๋ 6210์
๋๋ค.
0 ๋๋ ์์ ์ ์๊ฐ ๋ด๊ธด ๋ฐฐ์ด numbers๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์์๋ฅผ ์ฌ๋ฐฐ์นํ์ฌ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ฌธ์์ด๋ก ๋ฐ๊พธ์ด return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
๋๋ค๋ฅผ ์ด์ฉํด compare ํจ์๋ฅผ ์ ์ํ๋ค. ์ฒ์์๋ while ๋ฌธ์ผ๋ก ๋ฌธ์์ด๋ก ๋ฐ๊พผ ๋ ์๋ฅผ ์์๋ฆฌ๋ถํฐ ์ฐจ๋ก๋๋ก ๋น๊ตํ๋ ๋ฐฉ์์ ์๊ฐํ๋๋ฐ ํ๋ค ๋ณด๋ ๋ฌธ์์ด๋ก ๋ฐ๊พผ ๋ ์๋ฅผ ๋ถ์ฌ์ ์ด๋ค ๊ฒ ๋ ํฐ์ง ๋น๊ตํ๋ ๋ก์ง์ผ๋ก ๋จ์ํ์ํฌ ์ ์์๋ค.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(vector<int> numbers) {
string answer = "";
sort(numbers.begin(), numbers.end(),
[](int a, int b)
{
string str_a = to_string(a);
string str_b = to_string(b);
return str_a+str_b > str_b+str_a;
}
);
if(numbers[0]==0) return "0";
for(int i : numbers)
{
answer+=to_string(i);
}
return answer;
}
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ์ ๊ทผํ ๋ ์๊ธฐ๋ ๋ฌธ์
๋ฐ์ดํฐ ๊ฒฝ์ (Data Race)
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ฌ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ฐ์ํ๋ ๋ฌธ์ . ์ต์ข
๊ฒฐ๊ณผ๊ฐ ์ค๋ ๋๋ค์ ์คํ ์์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
๊ต์ฐฉ ์ํ (Deadlock)
๋ ์ด์์ ์ค๋ ๋๊ฐ ์๋ก ์ ์ ํ๊ณ ์๋ ์์์ ์์ํ ๊ธฐ๋ค๋ฆฌ๋ ์ํ. ๋ชจ๋ ์ค๋ ๋๊ฐ ์์
์ ๋ฉ์ถ๊ณ ๊ฐํ๊ฒ ๋์ด ํ๋ก๊ทธ๋จ์ด ์ ์ง๋๋ค.
์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๋ ๋๊ฐ์ ๋๊ธฐํ๊ฐ ํ์ํ๋ค.
C++์์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ์ ๊ทผ๋ฒ์ ํตํด ๊ตฌํ๋๋ค.
Lock-Based ๋ฐฉ์์ Mutex(๋ฎคํ ์ค)๋ Semaphore(์ธ๋งํฌ์ด) ๊ฐ์ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ณต์ ์์์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๋ค. ํ ์ค๋ ๋๊ฐ ์๋ฃ๊ตฌ์กฐ์ ์ ๊ทผํ ๋ ์ ๊ธ์ ํ๋ํ๊ณ , ์์ ์ด ๋๋๋ฉด ์ ๊ธ์ ํด์ ํ์ฌ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉํ๋ค.
์ด ๋ฐฉ์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์์ ํ๋ ๊ฒ์ ๋ง์ Race Condition(๊ฒฝ์ ์ํ)์ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์ ์์ ํ๋ค. ์๋ฅผ ๋ค์ด, ๋ ์ค๋ ๋๊ฐ ๋์์ std::vector์ ์์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ ๋, ์ ๊ธ์ด ์๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํฌ์ธํฐ ๊ฐฑ์ ๊ณผ์ ์์ ๋ฐ์ดํฐ๊ฐ ์์๋ ์ ์๋ค. ํ์ง๋ง Mutex๋ก ๋ณดํธํ๋ฉด, ํ ์ค๋ ๋๊ฐ vector๋ฅผ ์์ ํ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๋ ๋๊ธฐํ๊ฒ ๋์ด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค.
std::mutex๋ฅผ ํ์ฉํ std::vector:
std::mutex mtx;std::vector<int> data;void add_data(int value) { std::lock_guard<std::mutex> lock(mtx); data.push_back(value); }std::lock_guard๋ ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๋ฉด ์๋์ผ๋ก Mutex๋ฅผ ํด์ ํด์ฃผ๋ RAII(Resource Acquisition Is Initialization) ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฏ๋ก, ์์ธ๊ฐ ๋ฐ์ํด๋ ์ ๊ธ์ด ํด์ ๋์ด ๋ฐ๋๋ฝ(Deadlock)์ ๋ฐฉ์งํ๋ค. std::queue์ std::mutex๋ฅผ ์ด์ฉํ ์ค๋ ๋ ์์ ํ:
๋ฎคํ ์ค๋ "Mutual Exclusion"์ ์ฝ์๋ก, ์ํธ ๋ฐฐ์ ๋ฅผ ์๋ฏธํ๋ค. ์ด๋ ๊ณต์ ์์์ ๋จ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ๋๋ก ๋ณด์ฅํ๋ ์ ๊ธ(lock) ๋ฉ์ปค๋์ฆ์ด๋ค.
์ธ๋งํฌ์ด๋ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ ์ ์๋ ์ค๋ ๋์ ์๋ฅผ ์ ํํ๋ ์นด์ดํฐ์ด๋ค.
wait() ์ฐ์ฐ).signal() ์ฐ์ฐ).| ํน์ง | ๋ฎคํ ์ค (Mutex) | ์ธ๋งํฌ์ด (Semaphore) |
|---|---|---|
| ๋ชฉ์ | ์ํธ ๋ฐฐ์ (Mutual Exclusion) | ์์ ๊ฐ์ฉ์ฑ ๊ด๋ฆฌ |
| ๋์ ์ ๊ทผ | 1๊ฐ์ ์ค๋ ๋๋ง ํ์ฉ | N๊ฐ์ ์ค๋ ๋ ํ์ฉ (N >= 1) |
| ์์ ๊ถ | ์์ ๊ถ ๊ฐ๋ ์ด ์กด์ฌ | ์์ ๊ถ ๊ฐ๋ ์ด ์์ |
| ์ฌ์ฉ ์์ | ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ (์: std::vector)๋ฅผ ํ ๋ฒ์ ํ ์ค๋ ๋๋ง ์์ ํ๊ฒ ํ ๋ | ๋ฆฌ์์ค ํ (์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ )์ ์ต๋ ๋์ ์ ์์ ์๋ฅผ ์ ํํ ๋ |
Lock-Free ๋ฐฉ์์ ์ ๊ธ(Lock)์ ์ฌ์ฉํ์ง ์๊ณ , CPU๊ฐ ์ ๊ณตํ๋ ์์์ (Atomic) ์ฐ์ฐ์ ํ์ฉํ์ฌ ๋์์ฑ์ ์ ์ดํ๋ค. ์์์ ์ฐ์ฐ์ ์ค๊ฐ์ ๋ค๋ฅธ ์ค๋ ๋์ ์ํด ์ค๋จ๋์ง ์๊ณ ํ ๋ฒ์ ์๋ฃ๋๋ ์ฐ์ฐ์ ์๋ฏธํ๋ค. ์ฃผ๋ก Compare-And-Swap(CAS) ๊ฐ์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
์ ๊ธ ์์ด ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ์์ ํ๋ค. Lock-Based ๋ฐฉ์์ ์ ๊ธ์ ํ๋ํ์ง ๋ชปํ ์ค๋ ๋๊ฐ ์ ๊ธ์ด ํด์ ๋ ๋๊น์ง ๋๊ธฐํด์ผ ํ์ง๋ง, Lock-Free ๋ฐฉ์์ ๋๊ธฐ ์์ด ๊ณ์ํด์ ์์ ์ ์๋ํ๋ค. ๋ฐ๋ผ์ ๋ฐ๋๋ฝ์ด๋ ์ฐ์ ์์ ์ญ์ (Priority Inversion) ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ Lock-Based ๋ฐฉ์๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ๊ณผ ์ค์๊ฐ์ฑ์ ์๊ตฌํ๋ ์์คํ ์ ์ ํฉํ๋ค.
std::atomic<T>:
std::atomic<int> counter{0};counter.fetch_add(1);fetch_add๋ ๊ธฐ์กด ๊ฐ์ ๊ฐ์ ธ์ค๋ฉด์ 1์ ๋ํ๋ ์์์ ์ฐ์ฐ์ด๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ fetch_add๋ฅผ ํธ์ถํด๋ ์์ ํ๊ฒ ์นด์ดํฐ ๊ฐ์ ์ฆ๊ฐ์ํฌ ์ ์๋ค.Lock-Free ํ ๋๋ ์คํ:
head.compare_exchange_weak(expected, new_value)๋ head์ ํ์ฌ ๊ฐ์ด expected์ ๊ฐ์ผ๋ฉด new_value๋ก ๊ต์ฒดํ๊ณ , ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ค. ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ๋ค๋ฅธ ์ค๋ ๋์ ๋ณ๊ฒฝ์ฌํญ๊ณผ ์ถฉ๋ํ์ง ์๋๋ก ํ๋ค.| Lock-Based ์๋ฃ๊ตฌ์กฐ | Lock-Free ์๋ฃ๊ตฌ์กฐ | |
|---|---|---|
| ์๋ฆฌ | Mutex, Semaphore ๋ฑ ์ ๊ธ ๋ฉ์ปค๋์ฆ ์ฌ์ฉ | Atomic ์ฐ์ฐ(CAS ๋ฑ) ์ฌ์ฉ |
| ์ฅ์ | ๊ตฌํ์ด ๋น๊ต์ ์ฝ๊ณ ์ง๊ด์ , ์ผ๋ฐ์ ์ธ ์ํฉ์์ ๋ฌด๋ํ ์ฑ๋ฅ | ๋ฐ๋๋ฝ, ์ฐ์ ์์ ์ญ์ ๋ฌธ์ ์์, ๋์ ๋์์ฑ๊ณผ ์ฑ๋ฅ |
| ๋จ์ | ๋ฐ๋๋ฝ, ์ฐ์ ์์ ์ญ์ ๋ฐ์ ๊ฐ๋ฅ, ์ ๊ธ ๊ฒฝํฉ ์ ์ฑ๋ฅ ์ ํ | ๊ตฌํ์ด ๋งค์ฐ ๋ณต์กํ๊ณ ์ด๋ ต๋ค, ํน์ ์ํฉ์์ ์คํ๋ฝ(spin-lock)์ฒ๋ผ ๋์ ๊ฐ๋ฅ |
| ์์ | Mutex๋ก ๋ณดํธ๋๋ std::vector, std::queue | std::atomic<int>, CAS๋ฅผ ํ์ฉํ Lock-Free ํ |
๋ ๋ฐฉ์ ๋ชจ๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ์ฑ์ ๋ณด์ฅํ์ง๋ง, ์์คํ ์ ํน์ฑ๊ณผ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ์์ ์ ํํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ Lock-Based ๋ฐฉ์์ด ๊ตฌํ์ด ๊ฐ๋จํ์ฌ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ, ๋งค์ฐ ๋์ ๋์์ฑ๊ณผ ๋ฎ์ ์ง์ฐ ์๊ฐ์ด ์๊ตฌ๋๋ ๊ฒฝ์ฐ Lock-Free ๋ฐฉ์์ด ๊ณ ๋ ค๋๋ค.
์ถ์ฒ ํ๋ก๊ทธ๋๋จธ์ค: ๊ฐ์ฅ ํฐ ์