묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비전공 기획자 및 관리자를 위한 IT 필수 지식
강의 자료 부탁 드립니다.
강의 자료 병행하면서 스터디 하고자 합니다.sihwang0605@naver.com 입니다.감사합니다.
-
미해결Vue.js + TypeScript 완벽 가이드
프로젝트 레포 권한부탁드려요
evelo0702@gmail.com 입니다 !
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
팔로워 삭제시 에러
안녕하세요? 현재 백엔드(서버)부분 '팔로우/언팔로우' 강의까지 들었는데,팔로워 삭제하는 부분에서 에러가 발생해서 원인을 찾지못해 질문 올립니다!REMOVE_FOLLOWER_REQUEST 를 하면 REMOVE_FOLLOWER_FAILURE이 뜹니다.백엔드콘솔에는 DELETE /user/followers/2 404 8.090 ms - 158 라는 에러메세지?가 나오는데아무리 봐도 이부분 코드는 동일하게 작성한것같아서 해결못하고 있습니다일단 화면 첨부할게요!
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
게시글 작성 에러 질문
안녕하세요 선생님. 로그인 후 게시글 등록할 때 에러가 떴는데 해결방법을 몰라 질문 드립니다. at async C:\Users\내컴\Desktop\project\myback\routes\post.js:9:21 { errors: [ ValidationErrorItem { message: 'content cannot be an array or an object', type: 'string violation', path: 'content', value: [Object], origin: 'CORE', instance: [Post], validatorKey: 'not_a_string', validatorName: null, validatorArgs: [] } ]}SequelizeValidationError: string violation: content cannot be an array or an object at InstanceValidator._validate (C:\Users\내컴\Desktop\project\myback\node_modules\sequelize\lib\instance-validator.js:50:13) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async InstanceValidator._validateAndRunHooks (C:\Users\내컴\Desktop\project\myback\node_modules\sequelize\lib\instance-validator.js:60:7) at async InstanceValidator.validate (C:\Users\내컴\Desktop\project\myback\node_modules\sequelize\lib\instance-validator.js:54:12) at async model.save (C:\Users\내컴\Desktop\project\myback\node_modules\sequelize\lib\model.js:2368:7) at async Function.create (C:\Users\내컴\Desktop\project\myback\node_modules\sequelize\lib\model.js:1344:12) at async C:\Users\내컴\Desktop\project\myback\routes\post.js:9:21POST /post 500 19.803 ms - 1083에러 메시지가 이렇게 떴는데, 에러메시지가 가리키는 부분의 코드가router.post('/', isLoggedIn, async(req, res, next) => { try{ const post = await Post.create({ content: req.body.content, UserId: req.user.id }); const fullPost = await Post.findOne({ where: {id: post.id}, include: [{ model: Image },{ model: Comment, include: [{ model: User, attributes: ['id', 'nickname'] }] },{ model: User, attributes: ['id', 'nickname'] }] }); res.status(201).json(fullPost); } catch(error){ console.error(error); next(error); } });이렇거든요. 저기서 에러메시지가 말하는 content가 배열이나 객체가 될 수 없다고 하는게 무슨 말인지 모르겠습니다ㅠㅠ배열 혹은 객체의 형태로 입력되었다는 말인가요? saga의 post.js 에서 이 부분때문에 문제라고 해도이렇게 수정하니까 Post.content는 null이 될 수 없다는 에러가 뜨는데 어떻게 해결할 수 있을까요?
-
해결됨따라하며 배우는 리액트 A-Z[19버전 반영]
안녕하세요 이번 강좌와 리액트 테스트강좌질문입니다
안녕하세요. 처음 강좌 신청할 때 tdd도 있길래 넷플릭스 강좌에서 이어 진행하시는 줄 알았는데, 이번 강좌에 test는 가볍게 다루셨군요..ㅠㅠ 예전 react test(jest) 강좌를 들었어서, 이번 netflix강의에도 혼자 tdd를 진행하려 하는데, 조금 궁금한 점이 생겼습니다. 테스트를 진행할 때 props를 사용하는 컴포넌트에 대해서는 어떻게 하나요?(이전 react-test강좌에서는 contextAPI를 사용하셨는데, 그때 props로 내린 데이터를 가진 컴포넌트에 대해서는 테스트를 진행하지 않으셔서 여쭤봅니다.) netflix클론 정도의 규모만 해도 api가 많아 생각보다 까다로운 것 같습니다. 어떤 기능에 대해서 테스트를 집중적으로 하는지 방법? 이나 강사님의 조언을 듣고 싶습니다. (하나하나 단위 테스트를 실제로 진행하는 게 맞을까요? 아직 test는 익숙치 않네요..)
-
미해결따라하며 배우는 웹 게임
문제점 2가지
이동하는 부분에서 주사율이 높으면 펭귄이 천천히갑니다.올려진 소스에서는 두번째 로그인 할 경우 기존에 있는 펭귄은 만들어지지가 않습니다.
-
미해결스프링 시큐리티
provider안쪽에
log.info("username : "+username); log.info("password : "+password ); AccountContext accountContext = (AccountContext) userDetailsService.loadUserByUsername(username);이부분에서 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exceptionjava.lang.NullPointerException: null이에러가나는데@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.info("로그로그로그");여기 자체로 넘어오지를 않습니다.어떤거를 손봐야할까요..@RequiredArgsConstructor public class CustomUserDetailsService implements UserDetailsService { private final UserRepository userRepository;지금 보통 RequiredArgsConstructor 로 초기화중입니다.빼고 해봐도 별차이가없네요.. @Getter public class AccountContext extends User { private Account account; public AccountContext(Account account, ArrayList<GrantedAuthority> roles) { super(account.getUsername(), account.getPassword(), roles); this.account = account; } }AccountContext 코드입니다.제가 혼자 해보려고해도 시간이많이없어서 질문올립니다..오래된강의인거는 알고있었지만 너무많이 바뀐거같아요..
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
Module Provider 관련 추가 질문
먼저 보다 자세한 설명을 해주기 위해 이렇게 보충강의도 올려주신점 감사드립니다! 그리고 설명도 이해가 아주 잘 되었습니다.간단한 질문인데요, 비단 AppModule 뿐만 아니라 A Module에서 B Module의 Provider를 등록하면 결과적으로 의존성 주입이 되서 서버가 실행되더라구요 원래 그런건가요 ?? 그리고 결국 이것도 안좋은 패턴이니 하지 말아야하는게 맞겠죠 ?
-
미해결스프링부트 시큐리티 & JWT 강의
강사님 마지막 강의 질문이 있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 좋은 강의 너무 잘 들었습니다.!스프링 시큐리티랑 jwt 너무 막막했었는데 이 강의 듣고 진짜 이해가 잘 갔어요! 배운 내용 복습만 해도 시큐리티 부분은 충분할것 같아요 정말 감사드립니다 😊 마지막 강의까지 다 들었는데 오류가 나서 문의 드립니다super를 지우기 전에는 로그인 후 /user 로 해도 403에러가 떴었는데 super를 지우면 아무것도 안 뜨는데 어떤게 잘못된건지 알 수 있을까요?마지막 부분 JwtAuthorizationFilter 클래 doFilterInternal 메서드에서 super부분을 지우면 아예 Controller를 안 타는것 같아서요ㅜ http://localhost8080/api/v1/user 로 보내면 403이나 500등 에러코드도 안 뜨고 인텔리제이에서도 따로 에러 로그도 안 뜨는데 무슨 문제인지 모르겠어서 질문 드립니다ㅜnellizi/jwt (github.com) 깃허브 주소입니다!
-
해결됨디자인 시스템 with 피그마
*2, *3, *4 하면 안될까요?
안녕하세요 범쌤! 강의 잘 보고있습니다. 감사합니다.보던중에 궁금한 점이 있어서요.Spacing값을 직전함수?에 더하는 방식으로 작업해주신 이유가 base값이 변했을 때 반영되게라고 해주셨는데요.그냥 {Spacing.baseSpacing}*2, {Spacing.baseSpacing}*3, {Spacing.baseSpacing}*4, ...이런식으로 해주는것과 나중에 차이가 있을까요?처음에만 곱하고 나중엔 더하는게 헷갈려서요.
-
미해결CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
재귀함수 관련 강의 추가 가능할까요?
재귀적으로 생각하는 방법과 재귀 함수를 사용했을 때 디버깅하는 방법을 알고 싶습니다. 특히 재귀 함수가 여러 줄에서 여러 번 호출됐을 경우와 재귀 호출의 결과를 변수에 저장해서 다른 함수의 매개변수로 사용됐을 때 어떤 방식으로 동작하는지와 재귀적으로 생각하는 방법 디버깅하는 방법을 알고 싶습니다. DEEP DIVE에 하노이탑 문제 구현해주세요
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
docker 이미지 다운로드 불가
[Windows환경에서 SSH+Docker 컨테이너 기동 시 발생하는 오류 해결] 관련하여 문의드립니다... Windows 1) docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/docker:latest /usr/sbin/init위 명령어로 컨테이너 실행 시, 이미지는 잘 다운받아지지만 ssh 접속시 아래와 같은 메시지가 나옵니다.docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/docker:latest /usr/sbin/init $ ssh root@localhost -p 10022 kex_exchange_identification: Connection closed by remote host Connection closed by ::1 port 10022 도커 데스크탑에서 컨테이너 상세 내역을 보니 아래와 같이 나옵니다.. Windows 2, 위 명령어로 실행되지 않을 때) docker run -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/docker:latest /usr/sbin/init위 명령어 실행시, 이미지 다운로드 자체가 불가합니다.$ docker run -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/docker:latest /usr/sbin/init docker: Error response from daemon: invalid mount path: 'C' mount path must be absolute. See 'docker run --help'.윈도우 환경입니다....
-
미해결스프링 시큐리티
질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 안녕하세요실전프로젝트 -인증 프로세스 Form 인증 구현 - 1강을 듣고 따라하고있는데저는 user ID로 로그인했을때 /messages에도 접근가능한데 왜 이럴까요 ㅠㅠ@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } //사용자 추가 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { String password = passwordEncoder().encode("1111"); auth.inMemoryAuthentication().withUser("user").password(password).roles("USER"); auth.inMemoryAuthentication().withUser("manager").password(password).roles("MANAGER"); auth.inMemoryAuthentication().withUser("admin").password(password).roles("ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/").permitAll() //루트 페이지는 전부 접근 가능 .antMatchers("/config").hasRole("ADMIN") .antMatchers("/messages").hasRole("MANAGER") .antMatchers("/mypage").hasRole("USER") .anyRequest().authenticated() .and() .formLogin(); } }@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } //사용자 추가 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { String password = passwordEncoder().encode("1111"); auth.inMemoryAuthentication().withUser("user").password(password).roles("USER"); auth.inMemoryAuthentication().withUser("manager").password(password).roles("MANAGER"); auth.inMemoryAuthentication().withUser("admin").password(password).roles("ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/").permitAll() //루트 페이지는 전부 접근 가능 .antMatchers("/config").hasRole("ADMIN") .antMatchers("/messages").hasRole("MANAGER") .antMatchers("/mypage").hasRole("USER") .anyRequest().authenticated() .and() .formLogin(); } }있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결웹 게임을 만들며 배우는 React
웹팩 설정 질문
안녕하세요.리액트 강의보다가 요즘에는 cra로 하면 웹팩설정을 따로 할 필요가 없다고 하던데 그러면 웹팩부분은 신경 안써도 되는건가요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Next 페이지별 컴포넌트 사용
next의 라우팅에서 컴포넌트 사용에 대해 질문드립니다우선 components와 pages의 구성은 이런식으로 되어있는데요 |-- components |-- AppLayout.js --> 부모 |-- Nav.js --> AppLayout의 자식 |-- NavItem.js --> Nav의 자식|-- pages |-- store |-- index.js |-- upload.js|-- index.jsAppLayout은 모든 페이지에서 사용 되고있습니다 여기서 store로 시작되는 페이지에선 NavItem이 사용 되지 않습니다.'/store', '/store/upload' 이 처럼 /store으로 시작하는 주소에선 모두 NavItem을 렌더링 하고싶지 않은데 방법이 있을까요? 키워드를 몰라서 그런건지.. 구글링으로 도저히 찾을수가없어서 질문드립니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
typescript getServerSideProps 에러
type script, redux toolkit으로 진행하고 있습니다.getServerSideProps에서 type에러가 나고 있는데 검색으로도 해결이 어렵습니다. .ㅜㅜ store설정에 문제가 있는걸까요 ..? /pages/index.tsx export const getServerSideProps = wrapper.getServerSideProps( async (context: any) => { context.store.dispatch(loadMyInfoRequest()); context.store.dispatch(loadPostRequest(undefined)); context.store.dispatch(END); await context.store.sagaTask.toPromise(); } ); //에러메세지 Argument of type '(context: any) => Promise<void>' is not assignable to parameter of type 'GetServerSidePropsCallback<EnhancedStore<any, AnyAction, SagaMiddleware<object>[]>, any>'. Type 'Promise<void>' is not assignable to type 'GetServerSideProps<any, ParsedUrlQuery, PreviewData>'. Type 'Promise<void>' provides no match for the signature '(context: GetServerSidePropsContext<ParsedUrlQuery, PreviewData>): Promise<GetServerSidePropsResult<any>>'. /store/config.ts import { applyMiddleware, compose, configureStore } from "@reduxjs/toolkit"; import axios from "axios"; import createSagaMiddleware from "redux-saga"; import { all, fork } from "redux-saga/effects"; import { authSaga } from "../sagas/auth.saga"; import { postSaga } from "../sagas/post.saga"; import { createWrapper } from "next-redux-wrapper"; import { composeWithDevTools } from "@reduxjs/toolkit/dist/devtoolsExtension"; import rootReducer from "../reducers"; axios.defaults.baseURL = "http://localhost:3001"; axios.defaults.withCredentials = true; const sagaMiddleware = createSagaMiddleware(); const middlewares = [sagaMiddleware]; const enhancer = process.env.NODE_ENV === "production" ? compose(applyMiddleware(...middlewares)) : composeWithDevTools(applyMiddleware(...middlewares)); export const store = configureStore({ reducer: rootReducer, middleware: [sagaMiddleware], devTools: process.env.NODE_ENV !== "production", enhancers: [enhancer], }); function* rootSaga() { yield all([fork(authSaga), fork(postSaga)]); } sagaMiddleware.run(rootSaga); const wrapper = createWrapper(() => store); export default wrapper;
-
미해결Vue.js 완벽 가이드 - 실습과 리팩토링으로 배우는 실전 개념
깃 권한 요청드립니다.
인프런 아이디 : yoonmin9411인프런 이메일 : yoonmin9411@medialog.co.kr깃헙 아이디: shineminscat@naver.com깃헙 Username: shineminscat
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Memory Pool#2 삭제 Lockfree stack 과의 값 교환 차이가....?
이전에 Lock free stack 에서는 ABA problem 이 발생하지 않는다고 별도로 들고 있었기 때문이라고 하셨는데 이전에도 링크드 리스트 처럼 포인터를 들고 있던 방식이고 현재 이것도 그것과 유사한 방식인데 왜 이전에는 ABA 가 발생하지 않았다고 하는건지 잘 이해가 가질 않네요 이전 lock free stack 에서 삭제 할때의 로직과 크게 달라보이진 않는것 같은데요..이전 lock free stack 에서도 ABA Problem 이 발생하지 않나요?차이점이 명확하게 어떤 부분인지 모르겠습니다..답변좀 부탁드려요! Memory Pool#2 시간은 26:55 초에서 정도에서..
-
미해결Slack 클론 코딩[실시간 채팅 with React]
proxy 504 에러
몇 번 재확인 해도 webpack proxy 설정을 잘 한 것 같은데혹시 proxy 설정을 보여주신대로 하면 network에 Request URL이 3095로 되는게 정상 아닌가요?dev server 껐다 다시 실행, localhost를 127.0.0.1로 바꿔서 실행도 해봤습니다. 웹팩이 제대로 연결(?)이 안된건지.. 504 Gateway timeout은 새로고침하거나 네트워크 장치를 다시시작하라는데,. 좀 더 구글링 해보겠습니다. 근데 이게 근본적인 원인은 아닌것같아서.. 질문남깁니다.
-
미해결C 프로그래밍 - 입문부터 게임 개발까지
질문있습니다!
자꾸 알 수 없는 오류가 발생해서 여기저기 찾아보고 해결해보려고 헤더에 <stdlib.h>도 넣고 해봤고 나도코딩 님께서 올리신 소스코드를 그대로 복사 붙여넣기 해서 실행하는데도 아래 사진과 같은 상태로 에러가 나서 여쭤봅니다.혹시 왜 에러가 나는지, 그리고 그 해결법을 알 수 있을까요..?혹시 몰라 소스코드도 첨부합니다.#include <stdio.h>#include <time.h>#include <stdlib.h>// 10마리의 서로 다른 동물 (각 카드 2장씩)// 사용자로부터 2개의 입력값을 받아서 -> 같은 동물 찾으면 카드 뒤집기// 모든 동물 쌍을 찾으면 게임 종료// 총 실패 횟수 알려주기int arrayAnimal[4][5]; // 카드 지도 (20장의 카드)char* strAnimal[10]; // 10개의 공간배열을 만드는데, 거기에 들어가는게 문자 포인터int checkAnimal[4][5]; // 뒤집혔는지 여부 확인void initAnimalArray();void initAnimalName();void shuffleAnimal();int getEmptyPosition();int conv_pos_x(int x);int conv_pos_y(int y);void printAnimals();void printQuestion();int foundAllAnimals();int main(void){ srand(time(NULL)); initAnimalArray(); initAnimalName(); shuffleAnimal(); int failCount = 0; // 실패 횟수 while (1) { int select1 = 0; // 사용자가 선택한 처음 수 int select2 = 0; // 사용자가 선택한 두번째 수 printAnimals(); // 동물 위치 출력 printQuestion(); // 문제 출력 (카드 지도) printf("뒤집을 카드를 2개 고르세요 : "); scanf_s("%d %d", &select1, &select2); if (select1 == select2) // 같은 카드 선택 시 무효 continue; // 좌표에 해당하는 카드를 뒤집어 보고 같은지 안 같은지 확인 // 정수 좌표를 (x,y) 로 변환 int firstSelect_x = conv_pos_x(select1); int firstSelect_y = conv_pos_y(select1); int secondSelect_x = conv_pos_x(select2); int secondSelect_y = conv_pos_y(select2); // 카드가 뒤집히지 않았는지 확인하고 같은 동물인지 확인 if ((checkAnimal[firstSelect_x][firstSelect_y] == 0 && checkAnimal[secondSelect_x][secondSelect_y] == 0) && (arrayAnimal[firstSelect_x][firstSelect_y] == arrayAnimal[secondSelect_x][secondSelect_y]) ) { printf("\n\n빙고! : %s 발견!\n\n", strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]); checkAnimal[firstSelect_x][firstSelect_y] = 1; checkAnimal[secondSelect_x][secondSelect_y] = 1; } else // 다른 동물인 경우 { printf("\n\n 땡!! (틀렸거나, 이미 뒤집힌 카드입니다)\n"); printf("%d : %s\n", select1, strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]); printf("%d : %s\n", select2, strAnimal[arrayAnimal[secondSelect_x][secondSelect_y]]); printf("\n\n"); failCount++; } if (foundAllAnimals() == 1) { printf("\n\n축하합니다! 모든 동물을 다 찾았네요 \n"); printf("지금까지 총 %d 번 실수하였습니다.\n", failCount); break; } } return 0;}void initAnimalArray(){ for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { arrayAnimal[i][j] = -1; } }}void initAnimalName(){ strAnimal[0] = "원숭이"; strAnimal[1] = "하마"; strAnimal[2] = "강아지"; strAnimal[3] = "고양이"; strAnimal[4] = "호랑이"; strAnimal[5] = "사자"; strAnimal[6] = "돼지"; strAnimal[7] = "코끼리"; strAnimal[8] = "기린"; strAnimal[9] = "낙타";}void shuffleAnimal(){ // ㅁㅁㅁㅁㅁ 0 1 2 3 4 // ㅁㅁㅁㅁㅁ 5 6 7 8 9 // ㅁㅁㅁㅁㅁ 10 11 12 13 14 // ㅁㅁㅁㅁㅁ 15 16 17 18 19 // 이 배열에서 빈 공간 두 곳에 랜덤으로 동물을 배치 for (int i = 0; i < 10; i++) { for (int j = 0; j < 2; j++) { int pos = getEmptyPosition(); // 비어있는 위치 반환 int x = conv_pos_x(pos); int y = conv_pos_y(pos); // 반환한 값을 (x,y) 좌표로 변환 arrayAnimal[x][y] = i; } }}// 좌표에서 빈 공간 찾기int getEmptyPosition(){ while (1) { int randPos = rand() % 20; // 0~19 사이의 숫자 반환 // ex) 19 = (3,4) int x = conv_pos_x(randPos); int y = conv_pos_y(randPos); if (arrayAnimal[x][y] == -1) { return randPos; } } return 0; // int로 반환하는 함수이기 때문에 적은것이지, 큰 의미는 없음}int conv_pos_x(int x){ // ex) 19 = (3,4) return x / 5;}int conv_pos_y(int y){ return y % 5; // y를 5로 나눈 나머지 값}void printAnimals(){ printf("\n==================정답==================\n\n"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j ++) { printf("%8s", strAnimal[arrayAnimal[i][j]]); } printf("\n"); } printf("\n========================================\n\n");}void printQuestion(){ printf("\n\n(문제)\n"); int seq = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { // 카드를 뒤집어서 정답을 맞혔으면 '동물 이름' if (checkAnimal[i][j] != 0) { printf("%8s", strAnimal[arrayAnimal[i][j]]); } // 정답을 못 맞혔으면 다시 뒷면 -> 위치를 나타내는 숫자 else { printf("%8d", seq); } seq++; } printf("\n"); }}int foundAllAnimals(){ for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { if (checkAnimal[i][j] == 0) { return 0; } } } return 1;}