Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
bf24138
Feat: 4์ฃผ์ฐจ ๋ฏธ์…˜2
nonshaman Apr 12, 2026
3ef9c96
Feat: 4์ฃผ์ฐจ ๋ฏธ์…˜3
nonshaman Apr 27, 2026
84ecc91
Feat: 5์ฃผ์ฐจ ๋ฏธ์…˜1 ์™„๋ฃŒ
nonshaman Apr 28, 2026
4a38295
Feat: 5์ฃผ์ฐจ ๋ฏธ์…˜2 ์™„๋ฃŒ
nonshaman Apr 29, 2026
bfe4651
Feat: 5์ฃผ์ฐจ ๋ฏธ์…˜3 ์™„๋ฃŒ
nonshaman May 2, 2026
7a33a6f
Feat: 6์ฃผ์ฐจ ๋ฏธ์…˜1 ์™„๋ฃŒ
nonshaman May 7, 2026
f74faa9
Feat: 6์ฃผ์ฐจ ๋ฏธ์…˜2 ์™„๋ฃŒ
nonshaman May 9, 2026
31e9af2
Feat: 7์ฃผ์ฐจ ๋ฏธ์…˜1 ์™„๋ฃŒ
nonshaman May 15, 2026
3c5b803
Feat: 7์ฃผ์ฐจ ๋ฏธ์…˜2 ์™„๋ฃŒ
nonshaman May 17, 2026
3e18bba
Feat: 8์ฃผ์ฐจ ๋ฏธ์…˜1 ์™„๋ฃŒ
nonshaman May 19, 2026
8990b44
Feat: 8์ฃผ์ฐจ ๋ฏธ์…˜2 ์™„๋ฃŒ
nonshaman May 20, 2026
9e5a27d
Feat: 8์ฃผ์ฐจ ๋ฏธ์…˜3 ์™„๋ฃŒ
nonshaman May 24, 2026
728fcf6
Feat: ๊ฒ€์ƒ‰ UI homepage -> navbar ๋กœ ์œ„์น˜ ๋ณ€๊ฒฝ
nonshaman May 24, 2026
cad4aaa
Merge pull request #83 from SWU-UMC/revert-37-week4/nonshaman-m1
yewon20804 May 28, 2026
1f77fcf
Revert "Revert 37 week4/nonshaman m1"
yewon20804 May 28, 2026
faf85af
Merge pull request #84 from SWU-UMC/revert-83-revert-37-week4/nonshamโ€ฆ
yewon20804 May 28, 2026
734b36f
Merge branch 'nonshaman' into week4/nonshaman-m2
nonshaman May 28, 2026
d9f6f37
[feat] gitignore ์ถ”๊ฐ€
nonshaman May 28, 2026
ca3f4e2
Merge pull request #40 from SWU-UMC/week4/nonshaman-m2
yewon20804 May 28, 2026
b0bf08a
Merge pull request #48 from SWU-UMC/week4/nonshaman-m3
yewon20804 May 28, 2026
7e649af
Merge pull request #49 from SWU-UMC/week5/nonshaman-m1
yewon20804 May 28, 2026
b7d729b
Merge pull request #50 from SWU-UMC/week5/nonshaman-m2
yewon20804 May 28, 2026
4c3571c
Merge pull request #54 from SWU-UMC/week5/nonshaman-m3
yewon20804 May 28, 2026
ffbf3df
Merge pull request #59 from SWU-UMC/week6/nonshaman-m1
yewon20804 May 28, 2026
257a216
Merge pull request #60 from SWU-UMC/week6/nonshaman-m2
yewon20804 May 28, 2026
b9f123d
Merge pull request #69 from SWU-UMC/week7/nonshaman-m1
yewon20804 May 28, 2026
0cc126a
Merge pull request #71 from SWU-UMC/week7/nonshaman-m2
yewon20804 May 28, 2026
aaf6eaa
Merge pull request #74 from SWU-UMC/week8/nonshaman-m1
yewon20804 May 28, 2026
e6e1b20
Merge pull request #77 from SWU-UMC/week8/nonshaman-m2
yewon20804 May 28, 2026
3786a85
Merge pull request #81 from SWU-UMC/week8/nonshaman-m3
yewon20804 May 28, 2026
335f60a
Feat: 9์ฃผ์ฐจ ๋ฏธ์…˜1 ๋ฆฌ์•กํŠธ์„ธํŒ…
nonshaman May 31, 2026
e1f7dfc
Feat: 9์ฃผ์ฐจ ๋ฏธ์…˜1 ์™„๋ฃŒ
nonshaman May 31, 2026
7fd7611
Feat: 9์ฃผ์ฐจ ๋ฏธ์…˜2 ์™„๋ฃŒ
nonshaman May 31, 2026
87af2ee
Feat: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
nonshaman May 31, 2026
18fb8f0
Feat: ๋…ธ๋“œ ๋ชจ๋“ˆ ํŒŒ์ผ ์‚ญ์ œ
nonshaman May 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
1 change: 0 additions & 1 deletion README.md

This file was deleted.

70 changes: 70 additions & 0 deletions week1/todo-ts/dist/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"use strict";
const todoInput = document.getElementById('todo-input');
const todoForm = document.getElementById('todo-form');
const todoList = document.getElementById('todo-list');
const doneList = document.getElementById('done-list');
let todos = [];
let doneTasks = [];
const getTodoText = () => {
return todoInput.value.trim();
};
const addTodo = (text) => {
todos.push({ id: Date.now(), text });
console.log(todos);
todoInput.value = '';
renderTasks();
};
const completeTask = (task) => {
todos = todos.filter((t) => t.id !== task.id);
doneTasks.push(task);
renderTasks();
};
const deleteTask = (task) => {
doneTasks = doneTasks.filter((t) => t.id !== task.id);
renderTasks();
};
const createTaskElement = (task, isDone) => {
const li = document.createElement('li');
li.classList.add('render-container__item');
li.textContent = task.text;
const button = document.createElement('button');
button.classList.add('render-container__item-button');
if (isDone) {
button.textContent = '์‚ญ์ œ';
button.style.backgroundColor = '#dc3545';
}
else {
button.textContent = '์™„๋ฃŒ';
button.style.backgroundColor = '#28a745';
}
button.addEventListener('click', () => {
if (isDone) {
deleteTask(task);
}
else {
completeTask(task);
}
});
li.appendChild(button);
return li;
};
const renderTasks = () => {
todoList.innerHTML = '';
doneList.innerHTML = '';
todos.forEach((task) => {
const li = createTaskElement(task, false);
todoList.appendChild(li);
});
doneTasks.forEach((task) => {
const li = createTaskElement(task, true);
doneList.appendChild(li);
});
};
todoForm.addEventListener('submit', (event) => {
event.preventDefault();
const text = getTodoText();
if (text) {
addTodo(text);
}
});
renderTasks();
37 changes: 37 additions & 0 deletions week1/todo-ts/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- css ํŒŒ์ผ ์ž„ํฌ๋“œ -->
<link rel="stylesheet" href="./style.css" />
<!-- JS ํŒŒ์ผ ์ž„ํฌํŠธ -->
<script type="module" src="./dist/script.js" defer></script>
<title>UMC TODO</title>
</head>
<body>
<div class="todo-container">
<h1 class="todo-container__header">YONG TODO</h1>
<form id="todo-form" class="todo-container__form">
<input
type="text"
id="todo-input"
class="todo-container__input"
placeholder="ํ•  ์ผ ์ž…๋ ฅ"
required
/>
<button type="submit" class="todo-container__button">ํ•  ์ผ ์ถ”๊ฐ€</button>
</form>
<div class="render-container">
<div class="render-container__section">
<h2 class="render-container__title">ํ•  ์ผ</h2>
<ul id="todo-list" class="render-container__list"></ul>
</div>
<div class="render-container__section">
<h2 class="render-container__title">์™„๋ฃŒ</h2>
<ul id="done-list" class="render-container__list"></ul>
</div>
</div>
</div>
</body>
</html>
98 changes: 98 additions & 0 deletions week1/todo-ts/src/script.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// HTML ์š”์†Œ ์„ ํƒ
const todoInput = document.getElementById('todo-input') as HTMLInputElement;
const todoForm = document.getElementById('todo-form') as HTMLFormElement;
const todoList = document.getElementById('todo-list') as HTMLUListElement;
const doneList = document.getElementById('done-list') as HTMLUListElement;

// ํ•  ์ผ ๋ฐ ์™„๋ฃŒ๋œ ์ž‘์—…์„ ์ €์žฅํ•  ๋ฐฐ์—ด
type Task = {
id: number;
text: string;
};

let todos: Task[] = [];
let doneTasks: Task[] = [];

// ํ•  ์ผ ํ…์ŠคํŠธ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
const getTodoText = (): string => {
return todoInput.value.trim();
};

// ํ•  ์ผ ์ถ”๊ฐ€ ํ•จ์ˆ˜
const addTodo = (text: string): void => {
todos.push({ id: Date.now(), text });
console.log(todos);
todoInput.value = '';
renderTasks();
};

// ํ•  ์ผ ์ƒํƒœ ๋ณ€๊ฒฝ (์™„๋ฃŒ๋กœ ์ด๋™)
const completeTask = (task: Task): void => {
todos = todos.filter((t) => t.id !== task.id);
doneTasks.push(task);
renderTasks();
};

// ์™„๋ฃŒ๋œ ํ•  ์ผ ์‚ญ์ œ ํ•จ์ˆ˜
const deleteTask = (task: Task): void => {
doneTasks = doneTasks.filter((t) => t.id !== task.id);
renderTasks();
};

// ํ•  ์ผ ์•„์ดํ…œ ์ƒ์„ฑ ํ•จ์ˆ˜
const createTaskElement = (task: Task, isDone: boolean): HTMLLIElement => {
const li = document.createElement('li');
li.classList.add('render-container__item');
li.textContent = task.text;

const button = document.createElement('button');
button.classList.add('render-container__item-button');

// ์™„๋ฃŒ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๋ฒ„ํŠผ ํ…์ŠคํŠธ ๋ฐ ์ƒ‰์ƒ ์„ค์ •
if (isDone) {
button.textContent = '์‚ญ์ œ';
button.style.backgroundColor = '#dc3545'; // ๋นจ๊ฐ„์ƒ‰ (์‚ญ์ œ)
} else {
button.textContent = '์™„๋ฃŒ';
button.style.backgroundColor = '#28a745'; // ์ดˆ๋ก์ƒ‰ (์™„๋ฃŒ)
}

button.addEventListener('click', () => {
if (isDone) {
deleteTask(task);
} else {
completeTask(task);
}
});

li.appendChild(button);
return li;
};

// ํ•  ์ผ ๋ชฉ๋ก ๋ Œ๋”๋ง ํ•จ์ˆ˜
const renderTasks = (): void => {
todoList.innerHTML = '';
doneList.innerHTML = '';

todos.forEach((task) => {
const li = createTaskElement(task, false);
todoList.appendChild(li);
});

doneTasks.forEach((task) => {
const li = createTaskElement(task, true);
doneList.appendChild(li);
});
};

// ํผ ์ œ์ถœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ
todoForm.addEventListener('submit', (event: Event) => {
event.preventDefault();
const text = getTodoText();
if (text) {
addTodo(text);
}
});

// ์ดˆ๊ธฐ ๋ Œ๋”๋ง
renderTasks();
121 changes: 121 additions & 0 deletions week1/todo-ts/style.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/* ===== ๊ธฐ๋ณธ ์Šคํƒ€์ผ ===== */
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #eef2f3;
margin: 0;
}

/* ===== Todo ์ปจํ…Œ์ด๋„ˆ ===== */
.todo-container {
background: white;
padding: 20px;
border-radius: 12px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
width: 350px;
text-align: center;
}

/* ===== ์ œ๋ชฉ ===== */
.todo-container__header {
font-size: 24px;
margin-bottom: 16px;
}

/* ===== ์ž…๋ ฅ ํผ ===== */
.todo-container__form {
display: flex;
gap: 10px;
margin-bottom: 20px;
}

.todo-container__input {
flex: 1;
padding: 8px;
border: 1px solid #ccc;
border-radius: 6px;
font-size: 14px;
}

.todo-container__button {
background-color: #28a745;
color: white;
border: none;
padding: 8px 12px;
cursor: pointer;
border-radius: 6px;
transition: background-color 0.3s ease;
}

.todo-container__button:hover {
background-color: #218838;
}

/* ===== ๋ฆฌ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ===== */
.render-container {
display: flex;
justify-content: space-between;
gap: 20px;
}

/* ===== ๋ฆฌ์ŠคํŠธ ===== */
.render-container__section {
width: 100%;
text-align: left;
}

.render-container__title {
font-size: 18px;
margin-bottom: 10px;

display: flex;
flex-direction: row;
justify-content: center;
}

.render-container__list {
list-style: none;
padding: 0;
margin: 0;
}

/* ===== ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ===== */
.render-container__item {
display: flex;
justify-content: space-between;
align-items: center;

padding: 8px;
border-bottom: 1px solid #ddd;
background: #f9f9f9;
border-radius: 6px;
margin-bottom: 6px;
width: 100%; /* Make sure the item takes full available width */
}

.render-container__item-text {
flex: 1;

white-space: nowrap; /* Prevent text from wrapping */
overflow: hidden; /* Hide any overflow */
text-overflow: ellipsis; /* Add '...' when text overflows */
display: block; /* Ensure it's treated as a block for the overflow to work */
}

.render-container__item-button {
background-color: #dc3545;
color: white;
border: none;
padding: 6px 10px;
cursor: pointer;
border-radius: 6px;
font-size: 12px;
transition: background-color 0.3s ease;
}

.render-container__item-button:hover {
background-color: #c82333;
}
19 changes: 19 additions & 0 deletions week1/todo-ts/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"compilerOptions": {
"target": "es2016", // ECMAScript 2016์œผ๋กœ ์ปดํŒŒ์ผ
"module": "ES2015", // ES2015 ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์‚ฌ์šฉ
"rootDir": "./src", // ์†Œ์Šค ํŒŒ์ผ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ
"outDir": "./dist", // ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์ด ์ €์žฅ๋  ๋””๋ ‰ํ† ๋ฆฌ
"esModuleInterop": true, // ES ๋ชจ๋“ˆ ํ˜ธํ™˜์„ฑ ์„ค์ •
"forceConsistentCasingInFileNames": true, // ํŒŒ์ผ ์ด๋ฆ„์˜ ๋Œ€์†Œ๋ฌธ์ž ์ผ๊ด€์„ฑ ๊ฐ•์ œ
"strict": true, // ์—„๊ฒฉํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ
"skipLibCheck": true, // ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ๊ฒ€์‚ฌ ๊ฑด๋„ˆ๋œ€
"removeComments": true, // ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์—์„œ ์ฃผ์„ ์ œ๊ฑฐ
"noEmitOnError": false, // ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ํŒŒ์ผ ์ƒ์„ฑ ์•ˆ ํ•จ
"noUnusedLocals": true, // ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์—๋Ÿฌ ๋ฐœ์ƒ
"noUnusedParameters": true, // ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์—๋Ÿฌ ๋ฐœ์ƒ
"noImplicitReturns": true, // ํ•จ์ˆ˜์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒ
"noFallthroughCasesInSwitch": true, // switch ๋ฌธ์—์„œ fallthrough ๋ฐฉ์ง€
"noUncheckedIndexedAccess": true // ์ธ๋ฑ์Šค ์ ‘๊ทผ ์‹œ ์ฒดํฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒ
}
}
Binary file added week2/.DS_Store
Binary file not shown.
24 changes: 24 additions & 0 deletions week2/chapter-2/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
Loading