묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
인덱스 관련 질문!
인덱스에 대해서 약간의 의문을 질문드립니다. 인덱스가 조회의 성능 향상을 위한다는 점은 이해가 갑니다만..특정한 인덱스의 이름을 설정하는 부분이 약간 헷갈립니다. 가령 std_id 라는 인덱스를 학번을 저장 하는 column에 만들었을 때를 예시로 들겠습니다. 제가 학번의 데이터를 조회 하는경우 자체 프로그램에서 std_id의 인덱스만을 쉽게 찾는다는 의미이며, 이름설정은 단순 사용자들의 이해를 편하게 하기 위함인지가 궁금합니당
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-D 뭐가 문제인지 잘 모르겠습니다..
안녕하세요 선생님강의 잘 보고 있습니다.아래의 코드가 왜 탈락하는 지 잘 모르겠습니다..ㅜ/****************************************************************************** Welcome to GDB Online. GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl, C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog. Code, Compile, Run and Debug online from anywhere in world. *******************************************************************************/ #include <iostream> #include <queue> #include <vector> #include <string> #include <cmath> std::string map[1000]; bool visited[1000][1000]; bool visitedFire[1000][1000]; int personMap[1000][1000]; int fireMap[1000][1000]; int exitY, exitX; int cnt; #define INF 420000000 void bfsFire(const int y, const int x, const int R, const int C) { std::queue<std::pair<int, int>> que; que.push({y, x}); visitedFire[y][x] = true; int newX, newY, currX, currY; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; while(que.empty() != true) { currY = que.front().first; currX = que.front().second; que.pop(); for(int i = 0; i < 4; ++i) { newY = currY + dy[i]; newX = currX + dx[i]; if (newX >= 0 && newX < C && newY >= 0 && newY < R && !visitedFire[newY][newX] && map[newY][newX] != '#') { que.push({newY, newX}); fireMap[newY][newX] = std::min(fireMap[currY][currX] + 1, fireMap[newY][newX]); visitedFire[newY][newX] = true; } } } } void bfs(const int y, const int x, const int R, const int C) { std::queue<std::pair<int, int>> que; que.push({y, x}); visited[y][x] = true; int newX, newY, currX, currY; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; while(que.empty() != true) { currY = que.front().first; currX = que.front().second; que.pop(); if (currY == R - 1 || currX == C - 1) { cnt = personMap[currY][currX]; return; } for(int i = 0; i < 4; ++i) { newY = currY + dy[i]; newX = currX + dx[i]; if (newX >= 0 && newX < C && newY >= 0 && newY < R && !visited[newY][newX] && map[newY][newX] == '.') { if (fireMap[newY][newX] > personMap[currY][currX] + 1) { que.push({newY, newX}); personMap[newY][newX] = personMap[currY][currX] + 1; } visited[newY][newX] = true; } } } } bool isPossible(int R, int C) { for (int i = 0; i < R; ++i) { if (personMap[i][0] < fireMap[i][0]) return true; if (personMap[i][C - 1] < fireMap[i][C - 1]) return true; } for (int i = 0; i < C; ++i) { if (personMap[0][i] < fireMap[0][i]) return true; if (personMap[R - 1][i] < fireMap[R - 1][i]) return true; } return false; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int R, C; std::cin >> R >> C; std::vector<std::pair<int, int>> fire; exitX = C; exitY = R; int y, x; std::fill(&fireMap[0][0], &fireMap[999][1000], INF); for(int i = 0; i < R; ++i) { std::cin >> map[i]; for (int j = 0; j < C; ++j) { if (map[i][j] == 'J') { y = i; x = j; personMap[i][j] = 1; } else if (map[i][j] == 'F') { fireMap[i][j] = 1; fire.push_back({i, j}); } } } bfs(y, x, R, C); for(int i = 0; i < fire.size(); ++i) bfsFire(fire[i].first, fire[i].second, R, C); if (!isPossible(R, C)) cnt = 0; if(cnt == 0) { std::cout << "IMPOSSIBLE" << std::endl; } else { std::cout << cnt << std::endl; } return 0; }
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
22년 3회 문제 질문
반복문 돌리다가 궁금해진게 있어서 질문드립니다.다중 for문에서 저렇게 여러개의 변수가 중간에 껴있는 경우에 내부 for문을 한 사이클 돌고나면 외부 for문에서 ++해서 다음 사이클 돌릴 경우에 변수들이 다시 초기화가 되나요? 그러니까 n=6일 때 한 사이클을 돌리고 나니 s=6 , el=1 값이 이렇게 나왔는데, n=7, 8, 9.... 이렇게 그 다음 사이클로 갈 때마다 다시 s=0, el=0 부터 시작하는건지 아니면 값이 남아있는건지 궁금합니다.+해설을 보고 나서 완전수라는 걸 알았네요 ㅎㅎ
-
해결됨스프링 핵심 원리 - 기본편
localhost 8080 서버 안 뜸 문제
https://drive.google.com/file/d/1Napy4xVoywSNcyohTGH3kevfrdSkgfWg/view?usp=sharingrequest 스코프 예제 만들기 중 스프링부트 돌려보니 서버가 열리지 않습니다. 로그를 보니 repository 주입을 뭘 해야할지 모른다 되어있는데 어느부분을 고쳐야 할지 알려주심 감사하겠습니다!
-
미해결따라하면서 배우는 Power Apps
파워엡스에서 Share Point 테이블 Dataverse 로 변환
안녕하십니까? 질문 드립니다.엑셀파일을 Share Point 로 가져와서 테이블을 만들고 파워엡스에서 만들어진 Share Point 테이블을 Dataverse 로 변환하면 300개 전체 레코드가 생성되지 않고 매번 20개 레코드만 생성이 되는데 왜 그런지 도무지 알수가 없습니다. ..
-
해결됨[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
캐싱 데이터 질문
getCalendarPosts()는 [queryKeys.POST,queryKeys.GET_CALENDAR_POSTS,year,month] 4개의 캐싱키를 이용해서 데이터를 캐싱하고 있고, 포스트를 삭제할 시 성공하면 [queryKeys.POST,queryKeys.GET_CALENDAR_POSTS] 캐싱키로 저장한 캐싱데이터를 무효화하는데 getCalendarPosts()로 받아온 데이터가 무효화되고 최신 데이터(삭제된 포스트를 제외한 나머지 포스트)를 다시 받아올 수 있는건가요?<EventList/> 에서 보여주는 포스트 데이터는 4개의 캐싱키를 이용해서 받아온 왔으니, 그 데이터를 무효화 하기 위해선 삭제할 때도 동일한 캐싱키를 이용해야하지 않나요?
-
해결됨Next + React Query로 SNS 서비스 만들기
compose modal 관련 질문입니다. history stack에 강제로 url을 추가 하는 방법이 있나요?
만약 새창에서 /compose/tweet을 열었을 때 X버튼을 누르면 back()으로 동작되어 창이 닫히지 않거나, 이 전페이지 (트위터 창이 아닌 다른 창)으로 이동하는 이슈가 발생하여 x.com은 어떻게 동작되는지 확인했는데, 이미지 처럼 새창에서 /compose/tweet을 열었을 때, history에 home url이 추가가 되어 뒤로가기를 눌렀을 때 홈으로 돌아가는 것 같습니다.이렇게 hitory url을 제어하는 방법이 있을까요? 구글링해도 정보를 얻을 수 없어 글 올립니다ㅠ
-
미해결김영한의 실전 자바 - 중급 2편
제네릭 메서드, 와일드카드
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제네릭 메서드에서는 <Dog>가 타입추론으로 생략이 가능하다고 하셨는데WildCardEx.<Dog>printGenericV1(dogBox); 와일드 카드의 경우에는 <타입> 해당 부분에 대해서는 설명을 안해주셨는데 와일드카드의 경우에는 "<타입>" 은 어떻게 되는 건가요?? 항상 생략인건가요..???WildCardEx.printWildCardV1(dogBox);
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
셀필드 코드로 수정하기
안녕하세요 일코님. 늘 많은 도움 감사합니다.셀필드명을 표에 차례대로 부여하는데,매크로 녹화를 이용해서아래와 같이 코드를 짜보았습니다.hwp.move_to_field("답안") index = 1 while hwp.TableLowerCell(): hwp.HAction.Run("TableCellBlock"); hwp.HAction.GetDefault("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet); hwp.HParameterSet.HShapeObject.ShapeTableCell.CellCtrlData.Name = f"{index}" hwp.HAction.Execute("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet) hwp.Run("Cancle") index += 1 그런데 이렇게 실행하였을 때,AttributeError: '<win32com.gen_py.HwpObject 1.0 Type Library.HCtrlData instance at 0x2683750010768>' object has no attribute 'Name' 위와 같이 오류가 나는데요..매크로 스크립트를 잘 복붙한거 같은데 어떻게 수정할 수 있을까요?감사합니다!
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
몽고Db 기초 질문
안녕하세요 강사님mongoDB를 이번에 처음 사용하는데,세팅하는 과정에서 궁금한게 생겨 질문 남깁니다.저는 지금까지 mysql로 토이프로젝트를 진행했었는데요~fastAPI 기반의 프로그램을 실행시키기 전에 항상 mysql 을 구동시켜 놓았었습니다.그런데 이번 mongoDB의 경우엔, 별도로 mongoDB 를 실행시키지 않고 바로 app을 실행시키더군요 !몽고DB도 결국 별도의 프로그램이기에, webapp이 띄워지기 전에 미리 프로세스로 올라온 상태이어야할 것 같은데, 맞을까요? 그렇다면 mongoDB가 프로세스로 띄워지는 순간은 언제인가요?혹시 __init__.py 에서 connect() 함수에서 프로그램을 띄우고 연결하는 작업을 진행하는걸까요?
-
미해결설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
7~8장 질문드립니다
실습 다 해봤는데, vitis HLS 작성하는건 따로안알려주시고 코드는 복붙만 하면 되는건가요?수강 후, 스스로 할 수 있어진다 보단 이 코드가 "있으면" vivado 및 vitis 조작하는 정도만 할 수 있을것 같은데이런 부분은 실무에서 배워야 하는 건가요? 나중에 이러이러한 방식으로 'axi4 lite를 이용하는 경험을 해봤고 이해를 하였다'라고 하기엔 혼자 짤 수가 없으니 무리가 있어 보이는데...사실 vivado및 vitis 조작 부분에서도 이거 누르고 이거 누르고 하면 된다 하시는데, 그거 말고 다른 옵션을 눌렀을때는 어떻게 되는건지, 또는 예를들어 zynq ip에서 안쓰는 부분이니까 끈다고 하는데 안끄면 무슨일이 일어나는건지처럼 좀더 자세했으면 좋겠어요.. 이 파트에서는 그냥 이런식으로 제어가 가능하고 시리얼통신으로 받아오는 것 까지가 "가능하다" 정도만 배우면 되는건가요?
-
미해결모두를 위한 대규모 언어 모델 LLM(Large Language Model) Part 2 - 랭체인(LangChain)으로 나만의 ChatGPT 만들기
하이퍼클로바 X 랭체인
GPT api말고 하이퍼클로바X api를 이용하는 방법이 있는지 궁금합니다.
-
해결됨하루만에 배우는 AWS REDIS
강사님께서 보고있는 파일은 어디서 볼 수 있나요?
다음과 같은 양식으로 남겨주세요.질문을 한 배경 : 자료가 어디있는지 못찾겠습니다질문내용 : 강사님이 보고계신 AWS Serverless 파일은 어디서 볼 수 있나요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
퍼널별 유저들의 새로운 세션 시작 횟수의 총합 _ 윈도우 함수 마지막 문제 응용
안녕하세요. 저는 이번에 마지막 문제를 응용해서, 퍼널별로 유저들의 새로운 세션 시작 횟수의 총합을 계산해보았습니다.[결과 그래프]새로운 세션 시작 기준: 이전 세션 시간 대비 20초 이상이 지나면, 새로운 세션을 활성화했다고 가정 (강의 내용과 동일)첫번째 강의에서 배운, UNNEST 문법과 PIVOT 을 하는 방법을 활용해서, event_params에 있는 firebase_screen의 string_value 값을 새로운 열인 firebase_screen 이라고 만듭니다. 전체 데이터를 조회하면, 쿼리 비용이 많이 들기 때문에, where 조건 절로 값을 작게 명시해줍니다.WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep WHERE event_date = '2022-08-18' AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL )LAG() 함수를 사용하여, 이전 날짜 값을 가져옵니다. 이 때, 퍼널별로 구해야하기 때문에, PARTITION BY에 firebase_screen 을 써줍니다. 그 후, DATETIMEDIFF 함수를 사용해서, 현재값과 이전값의 차이를 계산합니다.WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep WHERE event_date = '2022-08-18' AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL ), diff_funnel_time AS ( SELECT *, DATETIME_DIFF(event_timestamp, prev_event_timestamp, SECOND) AS second_diff FROM ( SELECT *, LAG(event_timestamp, 1) OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS prev_event_timestamp FROM base ) ) SELECT * FROM diff_funnel_time3. ROW_NUMBER() 함수를 사용해서, 퍼널별로 순서를 매깁니다. 그 후, second_diff 의 값이 NULL인 경우는 해당 퍼널의 첫 시작 위치를 가리키므로 1을 넣어주고, rn > 1이고 second_diff >= 20인 경우는 1을 넣어줍니다. 이 때 funnel_per_session_start 컬럼은 퍼널별로 새로운 세션이 시작했는지 여부를 가리킵니다. , funnel_start AS ( SELECT *, CASE WHEN second_diff IS NULL THEN 1 WHEN rn > 1 AND second_diff >= 20 THEN 1 ELSE 0 END AS funnel_per_session_start FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS rn FROM diff_funnel_time ) )이제, 퍼널별로 세션 시작 여부를 SUM()하고, GROUP BY를 해줍니다.SELECT firebase_screen, SUM(funnel_per_session_start) AS funnel_per_session_start_cnt FROM funnel_start GROUP BY ALL ORDER BY 2 DESC;WHERE 조건절을 주석처리하고, 전체 데이터에 대해서, 집계해봅니다. WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep -- WHERE -- event_date = '2022-08-18' -- AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL ), diff_funnel_time AS ( SELECT *, DATETIME_DIFF(event_timestamp, prev_event_timestamp, SECOND) AS second_diff FROM ( SELECT *, LAG(event_timestamp, 1) OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS prev_event_timestamp FROM base ) ) , funnel_start AS ( SELECT *, CASE WHEN second_diff IS NULL THEN 1 WHEN rn > 1 AND second_diff >= 20 THEN 1 ELSE 0 END AS funnel_per_session_start FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS rn FROM diff_funnel_time ) ) SELECT firebase_screen, SUM(funnel_per_session_start) AS funnel_per_session_start_cnt FROM funnel_start GROUP BY ALL ORDER BY 2 DESC;
-
해결됨Jenkins를 이용한 CI/CD Pipeline 구축
window에서 docker minikube 사용하시는 분들... ssh 접속 ping 테스트 공유
https://learn.microsoft.com/ko-kr/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell를 따라서 window ssh 서버 클라이언트 설치하고ansinble-server와 윈도우 pc(쿠버네티스 돌아갈 host)에 python 3.9로 설치해줬고,ansible-server에서 pip install pywinrm 설치linux에서 ssh-keygen 한 것 윈도우 pc에 authorized_key에 직접 복사해줬음https://github.com/AlbanAndrieu/ansible-windows/blob/master/files/ConfigureRemotingForAnsible.ps에서 파일 직접 받아서파워쉘에서powershell.exe -ExecutionPolicy ByPass -File C:\Users\user\Downloads\ConfigureRemotingForAnsible.ps1파워쉘에서 실행ansible-server에서 vi /ect/ansible/host[local] localhost [docker] 172.17.0.3 [windows] 본인 컴퓨터(윈도우) host pc의 ip입력 [windows:vars] ansible_password='본인 컴퓨터((윈도우) host pc 비밀번호 입력' ansible_connection=winrm ansible_winrm_server_cert_validation=ignore ansible_user=user ansible_port=5986를 작성해서 저장ansible windows -m win_ping -u userwin_ping으로 핑 테스트 하면 정상 동작함➕ ./k8s/hosts파일 에서 [kubernetes]도 [kubernetes:vars] 위와 같이 작성해줘야 -i ./k8s/hosts kubernetes 로 win_ping 보냈을 때 응답 받을 수 있어요
-
미해결
How much is a boat cruise in dubai
How much is a boat cruise in dubai the cost of a boat cruise in Dubai varies widely based on the type of cruise and level of luxury. For a traditional dhow cruise, which typically includes a buffet dinner and a tour of Dubai Creek or Dubai Marina, prices usually range from $30 to $60 per person. These cruises offer a charming view of Dubai’s skyline and landmarks. For a more upscale experience, private yacht charters are available and generally cost between $200 to $500 per hour. The price for these charters depends on the yacht's size, amenities, and duration. Luxury packages, which may include exclusive services and high-end dining, can start at approximately $1,000 for a few hours. Booking in advance and comparing options can help you find the best deals.
-
해결됨실전 프론트엔드 테스트 시작하기
테스트 오류
테스트가 안됩니다못찾는다는거 같은데 오류 떠서 그런가요??오류 해결 어떻게 하나요
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
try-catch에서
public static void checkAge(int age) { if (age < 18) { throw new IllegalArgumentException("나이는 18세 이상이어야 합니다."); } System.out.println("나이가 적합합니다."); }이거에서 if가 18이상이면 if문조건을 충족하지 않으므로 빠져나가서 나이가 적합합니다. 를 프린트 하는 건 알겠는데15세일때 if문 조건(age<18)을 충족해서 throw로 예외를 던지고 나서 실행한 뒤 System.out.println("나이가 적합합니다."); 를 다시 실행해야 하는 거 아닌가요?checkAge() 가 System.out.println("나이가 적합합니다."); 를 실행해야 끝난다고 생각되어서요;.else문이 아니라 그냥 if문이라서 ..throw 에 대해서 조금더 자세한 설명해주실수있나요??
-
미해결
[기획자 구인] 실제 런칭! 스타트업 프로젝트 같이 성장하실분! 한번 보세요! '프리디어 팀'
안녕하세요!저희는 실제 런칭 될 디자인C2C 플랫폼 '프리디어' 를 개발중에 있습니다! 프리디어란?FREE IDEA 자유로운 아이디어라는 뜻으로 나의 아이디어가 작가에게 연결되어 현실이 되는 곳 이라는 의미를 가지고 있습니다. ‘프리디어’는 그림 및 제품 디자인, 영상편집 등 다양한 예술 및 취미 카테고리의 창작물 판매를 중개하는 서비스로, 의뢰자(구매자)의 창의적인 아이디어를 작가(판매자)에게 의뢰하여 본인만의 소중한 아이디어를 현실로 구현하게 해주는 아이디어 중개 플랫폼입니다. 이런분을 구인해요!-모르는 것들을 질문, 답변하며 적극적으로 소통하시는 분-프로젝트에 많은 시간을 할애할 수 있거나 빠르게 진행이 가능하신 분-경험이 부족해도 열정이 가득하신 분 현재 팀원 구성-총괄, 마케팅 (1명)-백엔드, 프론트엔드, 풀스택 개발자 (1명)-프론트엔드 개발자 (2명)-기획 및 고객 문의 담당 (1명)-결제 및 세무 담당 (1명)-개발기획pm (1명)-웹 디자이너(2명) 진행도-웹 백엔드 기획 (진행중)-웹 플랫폼 디자인 (전체적인 디자인은 나왔으나 수정사항 및 유저플로우 디자인 진행중)-프론트엔드 (개발 전)-'프리디어' 마스코트 캐릭터 초기 시안 (완료) 역할-사용자 중심의 기획 구조를 잡고 상세 설계 가능하신 분(기획은 피그마로 진행) 실제 런칭 기간과 수익-실제 런칭 기간은 2024년 10월까지 목표로 두고있어요!-실제 런칭 후 수익이 난다면 플랫폼에 재투자 되는 금액 제외 나머지 수익들을 %로 분배하려 합니다! 커뮤니케이션 방식-보통은 대표자(글쓴이)와 모든 커뮤니케이션을 진행합니다!-필요 시 팀원들과 디스코드(DISCORD)를 통해 회의를 합니다. 그 외 궁금하신 사항 있으시면 편하게 문의 주세요!※오픈카톡으로 간단한 자기 소개 한번 부탁드립니다!https://open.kakao.com/o/sJrnrRzg
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
eslint 다운로드하면서
eslint다운로드하면서 자꾸 정렬이 안돼요코드 작성하면 하나하나 띄워쓰기랑 스페이스바 눌러야되고 정렬 정리가 안돼요 ㅠㅠ