๋ฌธ์์ด๋ค์ด ๋ด๊ธด ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ก์ ๋, ๋ชจ๋ ๋ฌธ์์ด๋ค์ ์์๋๋ก ํฉ์น ๋ฌธ์์ด์ ๊ผฌ๋ฆฌ ๋ฌธ์์ด์ด๋ผ๊ณ ํฉ๋๋ค. ๊ผฌ๋ฆฌ ๋ฌธ์์ด์ ๋ง๋ค ๋ ํน์ ๋ฌธ์์ด์ ํฌํจํ ๋ฌธ์์ด์ ์ ์ธ์ํค๋ ค๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฌธ์์ด ๋ฆฌ์คํธ ["abc", "def", "ghi"]๊ฐ ์๊ณ ๋ฌธ์์ด "ef"๋ฅผ ํฌํจํ ๋ฌธ์์ด์ ์ ์ธํ๊ณ ๊ผฌ๋ฆฌ ๋ฌธ์์ด์ ๋ง๋ค๋ฉด "abcghi"๊ฐ ๋ฉ๋๋ค.
๋ฌธ์์ด ๋ฆฌ์คํธ str_list์ ์ ์ธํ๋ ค๋ ๋ฌธ์์ด ex๊ฐ ์ฃผ์ด์ง ๋, str_list์์ ex๋ฅผ ํฌํจํ ๋ฌธ์์ด์ ์ ์ธํ๊ณ ๋ง๋ ๊ผฌ๋ฆฌ ๋ฌธ์์ด์ returnํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
2 โค str_list์ ๊ธธ์ด โค 10
1 โค str_list์ ์์์ ๊ธธ์ด โค 10
1 โค ex์ ๊ธธ์ด โค 5

function solution(str_list, ex) {
var answer = '';
answer = str_list.filter((value) => {
if(value.includes(ex)) {
return false;
}
return true;
})
return answer.join("");
}
๋ฌธ์๋ค์ด ๋ด๊ฒจ์๋ ๋ฐฐ์ด arr๊ฐ ์ฃผ์ด์ง๋๋ค. arr์ ์์๋ค์ ์์๋๋ก ์ด์ด ๋ถ์ธ ๋ฌธ์์ด์ return ํ๋ solutionํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
1 โค arr์ ๊ธธ์ด โค 200
arr์ ์์๋ ์ ๋ถ ์ํ๋ฒณ ์๋ฌธ์๋ก ์ด๋ฃจ์ด์ง ๊ธธ์ด๊ฐ 1์ธ ๋ฌธ์์ด์
๋๋ค.

function solution(arr) {
return arr.reduce((acc,cur) => acc + cur, '');
}
์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ์ด ์์ค์ด๋ผ ๊ต์ฅํ ์ฝ๊ฒ ํ์ดํ ๋๋์ด ์๋ค!
๊ทธ๋ฆฌ๊ณ ํ ํ๋ก์ ํธ์ธ ๋ด์ค ํผ๋ ํ๋ก์ ํธ์ ๋ก๊ทธ์ธ, ํ์๊ฐ์
๊ธฐ๋ฅ์ ๊ตฌํํด๋ดค๋ค. ๊ณต์ ๋ฌธ์, ๊ณผ์ ๋ฐ์ ํ๋ฉด์ ์ ๊ณต๋ supabase ๊ฐ์ด๋๋ฅผ ๋ณด๊ณ ๊ตฌํ์ ํด๋ดค๋๋ฐ ์ฝ๋๊ฐ ๋๊ฒ ๋ณต์กํด ๋ณด์ด๊ณ ์ง์ ๋ถํด ๋ณด์ธ๋ค ใ
ใ
API Key, url ๊ฐ์ ์ ๋ณด๋ ๋นผ๋์ ์ฝ๋๋ฅผ ์ ์ด๋ณด๊ฒ ๋ค
๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ํ์ฌ ๋ก๊ทธ์ธ ์ํ, {๋๋ค์}๋ ํ์ํฉ๋๋ค! ๊ฐ์ ๋ฌธ๊ตฌ ๋ฑ๋ฑ ๋ํ ์ผ์ ์ฑ๊ธฐ์ง ๋ชปํ ์ ์ด ์์ฝ์ง๋ง ๋น์ฅ์ ํ์ ๊ตฌํ ์ฌํญ์ ๊ตฌํํ๋ ๊ฒ ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ ํ์ ๋ํ ์ผ์ ์ถ๊ฐํด์ค ์์ ์ด๋ค.
์ฝ๋
const LoginPage = ({ signIn, setSignIn, signOut }) => {
const navigate = useNavigate();
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const signInWithEmailPassword = async (e) => {
e.preventDefault();
try {
const { data, error } = await supabase.auth.signInWithPassword({
email,
password
});
if (error) {
throw error;
}
if (data.user) {
setSignIn(true);
navigate('/');
} else {
alert('๋ฑ๋ก๋ ์ ๋ณด๊ฐ ์๋๋๋ค. ํ์๊ฐ์
์ ์งํํด์ฃผ์ธ์.');
}
} catch (error) {
console.error('๋ก๊ทธ์ธ ์ค ์ค๋ฅ ๋ฐ์:', error.message);
alert('์กด์ฌํ์ง ์๋ ์์ด๋, ๋น๋ฐ๋ฒํธ์
๋๋ค.');
}
};
async function signInWithGithub() {
const { error, data } = await supabase.auth.signInWithOAuth({
provider: 'github'
});
if (error) {
console.error('๊นํ๋ธ ๋ก๊ทธ์ธ ์๋ฌ', error.message);
alert('๋ก๊ทธ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ต๋๋ค, ๋ค์ ์๋ํด์ฃผ์ธ์.');
} else {
const { user } = data;
if (user) {
navigate('/');
} else {
alert('ํ์๊ฐ์
์ด ํ์ํฉ๋๋ค.');
navigate('/signup');
}
}
}
useEffect(() => {
const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => {
if (session) {
setSignIn(true);
} else {
setSignIn(false);
}
});
return () => {
authListener?.subscription?.unsubscribe();
};
}, [setSignIn]);
return (
<Container>
<Title>๋ก๊ทธ์ธ ํ์ด์ง</Title>
{signIn ? (
<>
<p>`${data.nickname}๋ ํ์ํฉ๋๋ค!`</p>
<Button onClick={signOut}>๋ก๊ทธ์์</Button>
</>
) : (
<Form onSubmit={signInWithEmailPassword}>
<Label htmlFor="email">์์ด๋:</Label>
<Input type="text" id="email" name="email" value={email} onChange={(e) => setEmail(e.target.value)} />
<Label htmlFor="password">๋น๋ฐ๋ฒํธ:</Label>
<Input
type="password"
id="password"
name="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<Button type="submit">๋ก๊ทธ์ธ</Button>
<Button type="button" onClick={signInWithGithub}>
GitHub๋ก ๋ก๊ทธ์ธ
</Button>
<Button type="button" onClick={() => navigate('/signup')}>
ํ์๊ฐ์
</Button>
</Form>
)}
</Container>
);
};
export default LoginPage;
์ ์์ ์ผ๋ก ์๋๋๋ ๊ฑธ ๋ณผ ์ ์๋ค. ๋ก๊ทธ์ธ์ ํ ์ํ์ผ ์์ ํค๋ ๋ถ๋ถ์ ๋ก๊ทธ์ธ ๋ฒํผ์ด ๋ก๊ทธ์์ ๋ฒํผ์ผ๋ก ๋ฐ๋๊ฒ๋ ํ๋ ๊ฑด ๋ฉ์ธํ์ด์ง, ํค๋ ๋ถ๋ถ์ ๋งก์ผ์ ํ์ ๋ถ์ ๋ชซ์ด์ง๋ง ๊ฐ์ด ํด๋ณด๊ณ ์ถ์ ๋ง์

์ด๋ ต๊ธด ์ด๋ ค์ด๋ฐ ๋ญ๊ฐ ๊ธฐ๋ฅ์ด ์ฐฉ์ฐฉ ๊ตฌํ๋๋ ๊ฑธ ๋ณด๋ฉด ๋ฟ๋ฏํด์ ํ๋ ๊ฒ๋ ์์ด๋ฒ๋ฆฌ๋ ๊ฑฐ ๊ฐ๋ค(?)