Archive: 2022

0

프로그래머스 - 신고 결과 받기 Python

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/92334 프로그래머스 - 신고 결과 받기 Cpp 프로그래머스 - 신고 결과 받기 Python def solution(id_list, report, k): answer = [0] * len(id_list) dict = {id: set() for id in id_list} for line in set(report): args = line.split(' ') dict[args[1]].add(args[0]) print(dict) for key, value in dict.items(): if len(value) >= k: for i in value: answer[id_list.index(i)] += 1 return answer

0

네트워크 - CORS (Corss Site Resource Sharing)

SOP (Same Origin Policy)다른 출처의 리소스를 사용 못하도록 제한하는 보안 방식 CORS (Cross Origin Resource Sharing) 하나의 Origin 에서 실행 중인 웹 애플리케이션이 다른 Origin 내 리소스를 사용하는 것을 의미한다. 추가 HTTP 헤더를 이용해 한 출처에서 실행중인 웹 어플리케이션이 다른 출처의 선택된 자원에 접근할 수 있는 권한을 부여하도록 브라우저에게 알려주는 체제 Request 내 Origin 헤더와 Response 내 Access-Control-Allow-Origin 헤더가 같으면 브라우저는 같은 출처로 인식한다. 해결 방법서버에서 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보내는 방식으로 CORS 에러를 해결할 수 있습니다. 프론트엔드 개발자가 CORS 에러를 확인했다면, 서버에 Access-Control-Allow-Origin 등 CORS를 해결하기 위한 몇 가지 응답 헤더를 포함해 달라고 요청해야 합니다. 출처 URL의 Protocol, Host, Port 를 합친 것을 의미한다.

0

네트워크 - CSRF (Corss Site Request For Forgery)

CSRF (Corss Site Request Forgery) CSRF 란 사이트 간 요청 위조의 의미로, 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 해 특정 웹페이지를 보안에 취약하게 하거나 수정, 삭제 들의 작업을 하게 만드는 공격 방법공격자가 특정 사용자의 권한을 탈취해 특정 행위 (수정, 삭제, 등록 등) 를 사이트에 요청하게 만드는 공격 CSRF 를 위한 조건 권한이 있는 사용자가 사이트(서비스) 에 접속해야 한다. 사용자가 공격자가 만든 피싱 사이트에 접속하게 되면 CSRF 공격이 성립된다. 2008년에 발생했던 옥션의 개인정보 유출 사건에서도 관리자 계정을 탈취하는데 이 CSRF 방법을 이용 옥션 관리자가 메일을 조회하면서 CSRF 공격할 수 있는 테그가 들어간 이메일을 열어 해커가 관리자 권한을 취득하게 됨 <img src="http://auction.com/changeUserAcoount?id=admin&password=admin" width="0" height="0"> 방어 방법1. Referrer 검증

0

네트워크 - XSS (Cross-Site Scripting)

![]/images/computer-science/network/http/xss.png) XSS (Cross-Site Scripting) 공격자가 보안이 취약한 웹 사이트에 악성 스크립트를 삽입하는 공격 기법 XSS 를 통해 C&C (좀비 PC에 명령을 내리거나 악성 코드를 제어하는 서버) 로 리다이렉하거나 사용자의 쿠키를 탈취해 Session 하이재킹 공격을 할 수 있다. Persistent XSS 공격자가 심어놓은 특정 스크립트가 서버에 저장돼 지속적으로 서비스를 제공하는 정상 페이지에서 공격자에게 스크립트가 노출되는 기법 Relected XSS 웹 어플리케이션의 파라미터를 사용할 때 발생하는 취약점을 이용한 공격 기법 쿼리 파라미터로 특정 스크립트를 보냈을 때 서버가 필터링을 거치지 않고 파라미터로 포함된 스크립트를 응답 페이지에 담아 전송할 때 문제가 발생

0

프로그래머스 - 문자열 압축 Python

https://programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 - 문자열 압축 Cpp 프로그래머스 - 문자열 압축 Python 문제 풀이간단한 구현 문제다. 주어진 문자열을 substr 해서 문자열 비교를 통해 같은 문자열의 개수를 찾아내 압축된 문자열 형태로 만들어준 다음 압축된 문자열의 길이를 반환해주면 되는 문제다. 문제 전체 소스def solution(s): answer = '' if len(s) == 1: return len(s) for i in range(1, len(s)//2 + 1): sentence = '' count = 0 word = s[:i] for j in range(0, len(s), i): if s[j:j+i] == word: count += 1 else: if count > 1: sentence += (str(count) + word) else: sentence += (word) word = s[j:j+i] count = 1 if count > 1: sentence += (str(count) + word) else: sentence += (word) if len(answer) == 0: answer = sentence elif len(answer) > len(sentence): answer = sentence print(answer) return len(answer)

0

프로그래머스 - 문자열 압축 Cpp

https://programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 - 문자열 압축 Cpp 프로그래머스 - 문자열 압축 Python 문제 풀이간단한 구현 문제다. 주어진 문자열을 substr 해서 문자열 비교를 통해 같은 문자열의 개수를 찾아내 압축된 문자열 형태로 만들어준 다음 압축된 문자열의 길이를 반환해주면 되는 문제다. 문자열 압축하기주어진 문자열을 스캔하면서 고려해야 하는 조건이 첫번째는 substr 하려는 범위가 주어진 문자열의 범위를 넘어서면 안된다는 것이다. 두번째는 substr 범위가 주어진 문자열의 범위를 넘어선 경우 압축된 문자열에 그대로 추가해줘야 한다는 것이다. int divideString(int length, string s) { string zipString = ""; int i = 0; // 문자열을 스캔하면서 substr 범위가 주어진 문자열을 넘는지 확인한다. for (i = 0; i < s.length() && i + length < s.length(); i = i + length) { int count = 0; bool isErase = false; string substr = s.substr(i, length); string cmpstr = s.substr(i, length); while (substr == cmpstr && s.length() > i) { count++; i += length; isErase = true; substr = s.substr(i, length); } if (isErase == true) { i -= length; } if (count == 1) { zipString += cmpstr; } else { zipString += to_string(count); zipString += cmpstr; } } // 남겨진 문자열을 압축된 문자열에 그대로 추가한다. for (int idx = i; idx < s.length(); idx++) { zipString += s[i]; } return zipString.length();} 문제 전체 소스#include <bits/stdc++.h>using namespace std;int divideString(int length, string s) { string zipString = ""; int count = 0; int i = 0; for (i = 0; i < s.length() && i + length < s.length(); i = i + length) { bool isErase = false; string substr = s.substr(i, length); string cmpstr = s.substr(i, length); while (substr == cmpstr && s.length() > i) { count++; i += length; isErase = true; substr = s.substr(i, length); } if (isErase == true) { i -= length; } if (count == 1) { zipString += cmpstr; } else { zipString += to_string(count); zipString += cmpstr; } count = 0; cmpstr = ""; } for (int idx = i; idx < s.length(); idx++) { zipString += s[i]; } return zipString.length();}int solution(string s) { int answer = 0; int minValue = s.length(); for (int i = 1; i <= s.length() / 2; i++) { int zipLength = divideString(i, s); minValue = min(zipLength, minValue); } answer = minValue; return answer;}

0

백준 13460 - 구슬 탈출 2

https://www.acmicpc.net/problem/13460 백준 13460 - 구슬 탈출 2 백준 13460 - 구슬 탈출 2문제스타트링크에서 판매하는 어린이용 장난감 중에서 가장 인기가 많은 제품은 구슬 탈출이다. 구슬 탈출은 직사각형 보드에 빨간 구슬과 파란 구슬을 하나씩 넣은 다음, 빨간 구슬을 구멍을 통해 빼내는 게임이다. 보드의 세로 크기는 N, 가로 크기는 M이고, 편의상 1×1크기의 칸으로 나누어져 있다. 가장 바깥 행과 열은 모두 막혀져 있고, 보드에는 구멍이 하나 있다. 빨간 구슬과 파란 구슬의 크기는 보드에서 1×1크기의 칸을 가득 채우는 사이즈이고, 각각 하나씩 들어가 있다. 게임의 목표는 빨간 구슬을 구멍을 통해서 빼내는 것이다. 이때, 파란 구슬이 구멍에 들어가면 안 된다. 이때, 구슬을 손으로 건드릴 수는 없고, 중력을 이용해서 이리 저리 굴려야 한다. 왼쪽으로 기울이기, 오른쪽으로 기울이기, 위쪽으로 기울이기, 아래쪽으로 기울이기와 같은 네 가지 동작이 가능하다. 각각의 동작에서 공은 동시에 움직인다. 빨간 구슬이 구멍에 빠지면 성공이지만, 파란 구슬이 구멍에 빠지면 실패이다. 빨간 구슬과 파란 구슬이 동시에 구멍에 빠져도 실패이다. 빨간 구슬과 파란 구슬은 동시에 같은 칸에 있을 수 없다. 또, 빨간 구슬과 파란 구슬의 크기는 한 칸을 모두 차지한다. 기울이는 동작을 그만하는 것은 더 이상 구슬이 움직이지 않을 때 까지이다. 보드의 상태가 주어졌을 때, 최소 몇 번 만에 빨간 구슬을 구멍을 통해 빼낼 수 있는지 구하는 프로그램을 작성하시오.

0

프로그래머스 - 신규 아이디 추천 (Java)

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/72410 프로그래머스 - 신규 아이디 추천 (Java) 프로그래머스 - 신규 아이디 추천 (Python) 문제 풀이주어진 조건에 맞춰 하나하나씩 구현하면 되는 문제다. 문자열 관련 정규 표현식을 이용하면 더욱 깔끔하게 문제를 해결 할 수 있다. 전체 소스class Solution { public String solution(String new_id) { String id = new_id.toLowerCase(); id = id.replaceAll("[^-_.a-z0-9]", ""); id = id.replaceAll("[.]{2,}", "."); id = id.replaceAll("^[.]|[.]$", ""); if (id.equals("")) { id += "a"; } if (id.length() >= 16) { id = id.substring(0, 15); id = id.replaceAll("[.]$", ""); } while (id.length() <= 2) { id += id.charAt(id.length() - 1); } return id; }}

0

프로그래머스 - 키패드누르기 Python

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 키패드누르기 Cpp 프로그래머스 - 키패드누르기 Python def solution(numbers, hand): answer = '' left_hands = [1, 4, 7] right_hands = [3, 6, 9] middle = [2, 5, 8, 0] key_pad = { 1: [0, 0], 2: [0, 1], 3: [0, 2], 4: [1, 0], 5: [1, 1], 6: [1, 2], 7: [2, 0], 8: [2, 1], 9: [2, 2], 0: [3, 1], } left_position = [3, 0] right_position = [3, 2] for key in numbers: if key in left_hands: left_position = key_pad[key] answer += 'L' elif key in right_hands: right_position = key_pad[key] answer += 'R' else: # print(key_pad[key][0]) left_dist = abs( left_position[0] - key_pad[key][0]) + abs(left_position[1] - key_pad[key][1]) right_dist = abs( right_position[0] - key_pad[key][0]) + abs(right_position[1] - key_pad[key][1]) if left_dist == right_dist: if hand == 'right': right_position = key_pad[key] answer += "R" else: left_position = key_pad[key] answer += "L" elif left_dist < right_dist: left_position = key_pad[key] answer += 'L' else: right_position = key_pad[key] answer += 'R' return answer

0

프로그래머스 - 로또의 최고 순위와 최저 순위 Python

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python def ranking(cnt): if cnt == 6: return 1 elif cnt == 5: return 2 elif cnt == 4: return 3 elif cnt == 3: return 4 elif cnt == 2: return 5 else: return 6def cmp(lottos, win_nums): answer = [] cnt = 0 zeros = 0 for i in lottos: if i == 0: zeros += 1 elif i in win_nums: cnt += 1 answer.append(ranking(cnt+zeros)) answer.append(ranking(cnt)) return answerdef solution(lottos, win_nums): answer = cmp(lottos, win_nums) return answer

0

프로그래머스 - 로또의 최고 순위와 최저 순위 Java

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python class Solution { private int findScore(int value) { if (value == 6) { return 1; } else if (value == 5) { return 2; } else if (value == 4) { return 3; } else if (value == 3) { return 4; } else if (value == 2) { return 5; } else { return 6; } } private int[] cmpStrings(int[] lottos, int[] win_nums) { int[] result = new int[2]; int length = lottos.length; int zeroCnt = 0; int sameCnt = 0; for (int i = 0; i < length; i++) { if (lottos[i] == 0) { zeroCnt++; continue; } for (int j = 0; j < length; j++) { if (lottos[i] == win_nums[j]) { sameCnt++; } } } result[0] = findScore(sameCnt + zeroCnt); result[1] = findScore(sameCnt); return result; } public int[] solution(int[] lottos, int[] win_nums) { int[] answer = new int[2]; answer = cmpStrings(lottos, win_nums); return answer; }}

0

프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python #include <bits/stdc++.h>using namespace std;int findScore(int value) { if (value == 6) { return 1; } else if (value == 5) { return 2; } else if (value == 4) { return 3; } else if (value == 3) { return 4; } else if (value == 2) { return 5; } else { return 6; }}vector<int> cmpString(vector<int>& lottos, vector<int>& win_nums) { vector<int> result; int zeroCnt = 0; int sameCnt = 0; for (int i = 0; i < 6; i++) { if (lottos[i] == 0) { zeroCnt++; continue; } for (int j = 0; j < 6; j++) { if (lottos[i] == win_nums[j]) { sameCnt++; } } } result.push_back(findScore(sameCnt + zeroCnt)); result.push_back(findScore(sameCnt)); return result;}vector<int> solution(vector<int> lottos, vector<int> win_nums) { vector<int> answer; answer = cmpString(lottos, win_nums); return answer;}

0

프로그래머스 - 키패드누르기 Cpp

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 키패드누르기 Cpp 프로그래머스 - 키패드누르기 Python #include <iostream>#include <map>#include <queue>#include <string>#include <vector>using namespace std;bool isLeft(int number) { if (number == 1 || number == 4 || number == 7) { return true; } return false;}bool isRight(int number) { if (number == 3 || number == 6 || number == 9) { return true; } return false;}bool isMiddle(int number) { if (number == 2 || number == 5 || number == 8 || number == 0) { return true; } return false;}string solution(vector<int> numbers, string hand) { string answer = ""; map<int, pair<int, int>> keypad; keypad[1] = {0, 0}, keypad[2] = {0, 1}, keypad[3] = {0, 2}; keypad[4] = {1, 0}, keypad[5] = {1, 1}, keypad[6] = {1, 2}; keypad[7] = {2, 0}, keypad[8] = {2, 1}, keypad[9] = {2, 2}; keypad[0] = {3, 1}; pair<int, int> left_point = {3, 0}; pair<int, int> right_point = {3, 2}; cout << keypad[2].first << " " << keypad[2].second << endl; for (int number : numbers) { if (isLeft(number)) { left_point = keypad[number]; answer.append("L"); } if (isRight(number)) { right_point = keypad[number]; answer.append("R"); } if (isMiddle(number)) { pair<int, int> key_point = keypad[number]; int left_dist = abs(key_point.first - left_point.first) + abs(key_point.second - left_point.second); int right_dist = abs(key_point.first - right_point.first) + abs(key_point.second - right_point.second); if (left_dist == right_dist) { if (hand == "right") { right_point = keypad[number]; answer.append("R"); } else { left_point = keypad[number]; answer.append("L"); } } else if (left_dist < right_dist) { left_point = keypad[number]; answer.append("L"); } else { right_point = keypad[number]; answer.append("R"); } } } return answer;}

0

Redux Saga

목차 Redux Saga Redux Middleware 만들기 Redux 사용하기 - 계산기 만들기 Redux 사용하기 Redux Saga 액션을 모니터링하고 있다가 특정 Action 이 발생하면 특정 작업을 진행한다. 비동기 작업을 진행할 때 기존 요청을 취소 할 수 있다. 특정 Action 이 발생했을 때 다른 액션을 디스패치 하거나 자바스크립트 코드를 실행할 수 있다. Generator 에 기반한 미들웨어 Generator 함수의 흐름을 특정 구간에 멈춰 놨다가 다시 실행 할 수 있다.return 값을 여러번 보낼 수 있다. import { delay, put, takeEvery, takeLatest } from "redux-saga/effects";const SET_DIFF = "counter/SET_DIFF";const INCREASE = "counter/INCREASE";const DECREASE = "counter/DECREASE";const INCREASE_ASYNC = "NCREASE_ASYNC";const DECREASE_ASYNC = "DECREASE_ASYNC";export const setDiff = (diff) => ({ type: SET_DIFF, diff });export const increase = () => ({ type: INCREASE });export const decrease = () => ({ type: DECREASE });export const increaseAsync = () => ({ type: INCREASE_ASYNC });export const decreaseAsync = () => ({ type: DECREASE_ASYNC });function* increaseSaga() { yield delay(1000); yield put(increase()); // put 은 dispatch 와 비슷한 개념}function* decreaseSaga() { yield delay(1000); yield put(decrease());}export function* counterSaga() { yield takeEvery(INCREASE_ASYNC, increaseSaga); yield takeLatest(DECREASE_ASYNC, decreaseSaga);}const initialState = { number: 0, diff: 1,};export default function counter(state = initialState, action) { switch (action.type) { case SET_DIFF: return { ...state, diff: action.diff, }; case INCREASE: return { ...state, number: state.number + state.diff, }; case DECREASE: return { ...state, number: state.number - state.diff, }; default: return state; }} import React from "react";import { useSelector, useDispatch } from "react-redux";import Counter from "./Counter";import { increase, decrease, setDiff, increaseAsync, decreaseAsync,} from "../modules/counter";const CounterContainer = () => { const { number, diff } = useSelector((state) => ({ number: state.counter.number, })); const dispatch = useDispatch(); // const onIncrease = () => dispatch(increase()); // const onDecrease = () => dispatch(decrease()); const onIncrease = () => dispatch(increaseAsync()); const onDecrease = () => dispatch(decreaseAsync()); const onSetDiff = (diff) => dispatch(setDiff(diff)); return ( <Counter number={number} diff={diff} onIncrease={onIncrease} onDecrease={onDecrease} onSetDiff={onSetDiff} /> );};export default CounterContainer;

0

Redux Middleware 만들기

목차 Redux Saga Redux Middleware 만들기 Redux 사용하기 - 계산기 만들기 Redux 사용하기 Redux Middleware 만들기Middleware 생성Dispatch 되는 이력을 콘솔로 찍는 로거를 만든다. const myLogger = store => next => action => { console.log(action); const result = next(action); // 반환하는 result 는 Container 에서 Disaptch 됐을 때 결과 물이 result return result;}export default myLogger; Middleware 적용applyMiddleware 함수를 이용해 Redux 에 미들웨어를 적용한다. import React from 'react';import ReactDOM from 'react-dom';import './index.css';import App from './App';import reportWebVitals from './reportWebVitals';import { createStore, applyMiddleware } from 'redux';import rootReducer from './modules';import { Provider } from 'react-redux';import myLogger from './middlewares/myLogger';const store = createStore(rootReducer, applyMiddleware(myLogger));ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root'));reportWebVitals();