#include<stdio.h> #include<time.h> #include<stdlib.h> /*10마리의 서로다른 동물 (각 카드 2장씩) 사용자로부터 2개의 입력값을 받아서 -> 같은 동물 찾으면 카드 뒤집기 모든 동물 쌍을 찾으면 게임 종료 총 실패 횟수 알려주기*/ int checkAnimal[4][5]; //뒤집혔는지 여부 확인 int arrayAnimal[4][5]; //카드 20장 - 4x5 const char* strAnimal[10]; //10개의 배열 => 캐릭터포인터 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; //좌표에 해당하는 카드를 뒤집어보고 같은지 안같은지 확인 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); //정수좌표를 x,y로 변환 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\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++; //실패횟수 +1 } //모든 동물을 찾았는지 여부. 1:참 , 0:거짓 if (foundAllAnimals() == 1) { 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() { 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); arrayAnimal[x][y] = i; } } } int getEmptyPosition() { while (1) { int randPos = rand() % 20; //0-19사이의 랜덤 숫자 반환 int x = conv_pos_x(randPos); int y = conv_pos_y(randPos); if (arrayAnimal[x][y] == -1) //초기에 -1로 설정했기때문에 -1이면 비어있다는 뜻 { return randPos; //현재 위치 반환 } } return 0; } int conv_pos_x(int x) //5로 나눴을 때 몫 / { return x / 5; } int conv_pos_y(int y) //5로 나눴을 때 나머지 % { return y % 5; } void printAnimals() //동물 위치 출력 { printf("\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"); } 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++); } } 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;//모두 다 찾음 }
이렇게 (N+2)*(N+2) list를 만들고 안에다가 복사해서 붙여넣어버리는 방법은 별로인가요? N = int(input()) input_list = [list(map(int, input().split())) for _ in range(N)] n_list = [[0] * (N + 2) for _ in range(N + 2)] for i in range(N): for j in range(N): n_list[i + 1][j + 1] = input_list[i][j]
안녕하세요. 컴파일 과정과 관련하여 잘 이해가 되지 않은 부분이 있어서 질문 드립니다. <질문1> 컴파일 관련 질문 1) 컴파일 작업 중 전처리 단계에서는 include한 헤더파일의 내용 즉, 헤더파일에 저장된 함수 선언 부분을 소스파일로 복사붙여넣기 하는 과정이고, 헤더파일은 일반적은 함수의 선언만 되어 있기 때문에 함수가 호출될 때는 함수의 body가 있는 다른 실행파일과 연결하는 '링킹'과정이 필요하다. 라고 이해하였는데 제대로 이해하였나요? 즉, 전처리 단계는 함수를 선언하는 과정이라면, 함수 호출이 될 때, 함수의 body부분을 알 수 있고, 제대로 body 부분을 파악하기 위해서 '링킹'이 제대로 되는 것이 중요하다고 이해했습니다! 2) inline함수는 위의 일반적인 함수 호출과 달리, 주소에 접근하여 함수의 코드를 가져오는 것이 아니라 단순히 헤더파일에 있는 함수의 코드를 복사하여 main함수에 붙여넣는 구조인 것인가요? 그렇다면, 일반적인 함수 호출보다 상대적으로 더 빠르다고 볼 수 있을까요? 또한, inline함수는 함수의 주소를 모른다고 했는데, 그 이유가 무엇인지도 궁금합니다. <질문2> 함수 관련 질문 함수 또한 포인터이기 때문에 함수가 호출되면, 함수가 가리키고 있는 주소에 접근하여 함수의 실행 코드를 실행한다고 하셨습니다. 예를 들어 sum함수를 호출한다고 할 때, a,b를 함수의 인자로 받게 되면, 변수 a,b를 통해서 접근할 수 있는 메모리에 들어있는 '값'과 함수 호출 종료 후 돌아올 주소값이 함수 실행 파일의 스택에 쌓이게 되고, 함수 실행 코드에서의 지역변수들이 그 위에 쌓이면서 스택 프레임이 생성되는 것인가요? 이러한 스택 프레임을 활용하여 code segment에 있는 함수 코드들이 실행되는 것인가요? 감사합니다!!!
소수 개수 구하기 문제 언어 : 파이썬 내용: 제가 작성한 하위 코드 for문 두 개 돌렸을뿐인데 리미트 타임에러가 뜹니다.. 구글링 해서 emurate함수 써서 푼 문제는 정답이라고 뜹니다. 난이도 초급에 emurate함수 방식으로 써서 풀라는 의도는 아니라고 판단되어 문의 드립니다. 아래 코드가 에러인지, 제가 잘 못하고 있는지 궁금합니다. (입사 전에는 자바로 면접 보고 들어갔는데 입사 한 회사에서 사용하는 언어는 파이썬이라서 파이썬으로 코테 풀고 있는점도 참고해서 피드백 부탁드립니다) received_data = int(input()) list = [] for i in range(2,received_data+1): list.append(0) for i in range(2,received_data+1): if list[i-2]==0: for j in range(2,received_data+1): if j>i and j%i==0: list[j-2]=1 print(list.count(0))
3:14부터 설명하시는 내용에 대해서 질문 있습니다. 다른 부분은 예외로 치고 반복문에서만 봤을 때, 반복문이 최대한 조금 돌아가게 만드는 게 효율성이 높고 좋은 코드라고 볼 수 있는건가요?? 그런 의미에서 21번 최대공약수 문제에서 for (i = 1; i <= a && i <= b; i++) { if (a % i == 0 && b % i == 0) max = i; } printf("%d", max); 이렇게 작성하였는데 코드를 최대한 간결하게 작성하는 것에 중점을 두었습니다. 그런데 의문인 점이 a, b 중 작은 값이 30이라면 반복문이 무조건 30번 돌아가기 때문에 선생님께서 작성하신 코드에 비해 비효율적이고 안좋은 코드라고 볼 수 있을까요? 그렇다면 앞으로 반복문이 들어가는 코드를 작성 할 때 반복횟수를 고려하면서 작성하는 게 좋은 습관을 만드는 길인걸까요? 아니면 이렇게까지 신경 쓸 필요는 없나요? 궁금합니다!
이 강의에서 에러가 발생했습니다. 소스코드는 다음과 같습니다. import requests from bs4 import BeautifulSoup url = "https://www.naver.com/" response = requests.get(url) # 에러 발생한 부분 html = response.text soup = BeautifulSoup(html, 'html.parser') word = soup.select_one("#NM_set_home_btn") print(word.text) 위 코드중 response = requests.get(url) 위 부분에서 에러가 발생했습니다. [ 에러 내용 ] Max retries exceeded with url:강의에서 접속한 url 이런 에러가 나오고 Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available. 뒤에 이런 문장이 나옵니다. 에러 해결 방법은 무었인가요? [ 에러 전체 내용 ] 에러의 전체 내용은 다음과 같습니다. Exception has occurred: SSLError HTTPSConnectionPool(host='search.naver.com', port=443): Max retries exceeded with url: /search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90 (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) urllib3.exceptions.SSLError: Can't connect to HTTPS URL because the SSL module is not available. During handling of the above exception, another exception occurred: urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='search.naver.com', port=443): Max retries exceeded with url: /search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90 (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) During handling of the above exception, another exception occurred: File "D:\crawling\05. 뉴스 제목과 링크 가져오기.py", line 4, in <module> response = requests.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90") requests.exceptions.SSLError: HTTPSConnectionPool(host='search.naver.com', port=443): Max retries exceeded with url: /search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90 (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))
안녕하세요!! 설명해주신 포인터와 배열 개념을 이해하는 도중 혼동이 와 질문을 남깁니다. double nums[1.0,2.0,3.0,4.0];와 같이 배열을 선언한 뒤 double *ptr = nums와 같이 포인터 변수에 nums를 넣어주는 상황으로 가정해보겠습니다. const를 배열이나 포인터 앞에 붙이면 배열의 요소들을 변경할 수 없지만 ptr++과 같이 증감연산자는 사용이 가능하다고 설명을 해주신 부분에서 ptr++을 하면 그 값은 nums[1]이 되는 것은 이해가 갑니다. 하지만 ptr++을 해주고 난 뒤 ptr[2]를 하면 nums[3]의 값이 출력된다고 하셨습니다. 저는 ptr++이라는 값이 nums[1]을 가리키는 것은 히해했지만 ptr[2]라는 값이 왜 nums[2]가 아닌 nums[3]을 가리키는지 모르겠습니다. nums ptr 포인터 변수 자체가 ptr++을 해주게 되면 nums[1]이라는 값으로 초기화가 되고 인덱싱을 하려면 기존의 nums[0]이 nums[1]과 같은 위치가 되는 것인가요??
안녕하세요. 데이터 증강 부분에 대해서 궁금점이 있어서 질문드립니다. 가지고 있는 데이터가 1000개 라고 가정했을 때, tr.Compose를 적용시키면 '기존 이미지 1000개 + 증강된 추가 이미지 개수' 가 되는건가요?? 제가 간단하게 해봤을 때는 transform 했을 때 이미지 개수 증가가 아니라 단순 이미지 변환까지만 이루어지는 것 같은데, 제가 잘못된 부분이 있는건가 좀 헷갈려서 질문 드립니다. 만약 단순 이미지 변환만 이루어지는 것이라면 이미지 개수 증가를 위해서 추가적인 작업을 진행해주어야 하는지도 궁금하네요.
200여개의 csv 파일이 있습니다. (용량은 각각 1메가에서 120메가 - 최대 100만건 데이터 등등 ). 결측치 가 있어서 판다스 에서 불러들여서 정리하고 for 반복문으로 파일 개별적으로 읽어 들여와 장고 모델에 save() 로 입력시키는 작업을 진행하고 있습니다. 초반 10여개 파일까지는 제법 속도가 나오는데 (7만행 데이터 20분 소요) 이후로 속도가 급격하게 감소해서 24시간 돌려서 30메가 파일 겨우 저장 중입니다(1건에 1초씩 걸리네요 ㅠㅠ). 개발중이라 로컬에 있는 장고 내장 sqlite 사용 했습니다. 속도를 좀 더 빠르게 하는 방법이 있을까요? 3일째 검색 해봤는데 별다른 해결책이 보이지 않아서 질문 남겨 봅니다. app.py # new 폴더에 정리된 csv 파일을 읽어서 DB에 저장 import pandas as pd # django 프로젝트에 있는 settings.py 파일을 읽어서 환경변수로 설정 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dbking.settings") import django django.setup() #django 프로젝트에 있는 models.py 파일에서 BasicData 클래스를 읽어온다 from common.models import BasicData # new 폴더에 있는 파일명을 읽어서 product 변수에 리스트에 저장 product_list = os.listdir("./script/newdb") # product_list 에 csv 파일 정렬(오름차순) for x in product_list: # csv 파일 하나씩 읽어오기 df = pd.read_csv("./script/newdb/" + x, encoding="cp949") # 결측치를 0으로 채운다 df = df.fillna(0) for a in list_of_csv: # 파일마다 컬럼수가 달라서 remark1, remark2 라는 예비컬럼 2개 추가 # -> 인덱스 에러 나는 경우 0 으로 저장 if a[16] is None: a.insert(16, 0) a.insert(17, 0) elif a[17] is None: a.insert(17, 0) # DB에 저장 try: db_insert = BasicData( opnSvcId = a[2], opnSfTeamCode = a[3], mgtNo = a[4], fileNumber = fileNumber, businessType = businessType, opnSvcNm = a[1], apvPermYmd = a[5], confirmNumber = a[6], businessCondition = a[7], siteTel = a[8], sitePostNo = a[9], siteWhlAddr = a[10], rdnWhlAddr = a[11], rdnPostNo = a[12], bplcNm = a[13], latitude = a[14], longitude = a[15], remark1 = a[16], remark2 = a[17], ) i += 1 # print(i) except Exception as e: print("쿼리", e) continue #DB에 저장 입력 try: db_insert.save() except Exception as e: print("저장중에러",e) continue from django.db import models class BasicData(models.Model): # 개방서비스아이디 opnSvcId = models.CharField(max_length=100) #개방자치단체코드 opnSfTeamCode = models.CharField(max_length=10) # 관리번호 mgtNo = models.CharField(max_length=100) #파일번호 fileNumber = models.IntegerField() #업종명 businessType = models.CharField(max_length=100) #개방서비스명 opnSvcNm = models.CharField(max_length=100) #인허가일자 apvPermYmd = models.DateField() #영업상태구분코드(1-정상, 2-폐업, 3-휴업, 4-전환) confirmNumber = models.IntegerField() #영업상태명 businessCondition = models.CharField(max_length=100) #소재지전화 siteTel = models.CharField(max_length=100) #우편번호 sitePostNo = models.CharField(max_length=100) #주소 siteWhlAddr = models.CharField(max_length=100) #도로명주소 rdnWhlAddr = models.CharField(max_length=100) #도로명우편번호 rdnPostNo = models.CharField(max_length=100) #사업장명 bplcNm = models.CharField(max_length=100) # 위도 latitude = models.FloatField() # 경도 longitude = models.FloatField() #비고1 remark1 = models.CharField(max_length=100) #비고2 remark2 = models.CharField(max_length=100) # 생성시점 created = models.DateTimeField(auto_now_add=True) update = models.DateTimeField(auto_now=True) def save(self, *args, **kwargs): queryset = BasicData.objects.filter(mgtNo__exact=self.mgtNo) # 중복된 이름이 없을 때만 저장 if len(queryset) == 0: super().save(*args, **kwargs) print('> Created new category') # if '&' in self.addr: # self.addr = self.addr.replace('&', ' ') # self.save() # 중복된 카테고리 있을 시 저장 안함 else: print('> Cannot create category with existing name') def __str__(self): return self.name
안녕하세요. 어제부터 DeepingSauce님 로드맵을 갓 시작한 코린이 입니다. 금일 강의를 전부 결재하고 시작점에 섰는데 확인해보니 공부 환경상 Jupyter lab 활용이 불가능 하여 두가지 질문 드립니다. Colab 활용 가능성 수강 환경상 Jupyter Notebook은 쓸 수 있지만 Jupyter Lab의 사용이 불가능합니다. 그래서 Colab을 사용해볼까 하는데, 수업 진행에 무리가 없을런지 질문 드립니다. (수업내용을 보니 Jupyter에 Extention까지 설치해서 사용하던데 Colab이 해당 기능들을 다 지원할지 모르겠습니다.) Colab 설치 및 세팅방법 Colab이 활용 가능하다면 선생님 수업을 위해 (Jupyter Lab에서 했듯이) Colab의 설치 및 세팅방법도 알고 싶습니다. 혹시 가능하다면 안내 부탁 드립니다. 아는 지식이 짧아 있는 그대로 질문 드립니다.
안녕하세요. 잘 이해가 되지 않은 부분이 있어서 질문 드립니다. <질문1> struct my_class{ char* name; int score; } int main() { struct my_class student; student.name = (char*)malloc(sizeof(char) * 20 + 1); student.score == (int*)malloc(sizeof(int)); scanf("%s %d", student.name , student.score ) 이전에 구조체.멤버 는 '주소'를 의미한다고 답변해주셨습니다. 근데 잘 이해가 되지 않은 부분이 위의 코드처럼 score에 대한 값을 받아올 때는 주소연산자(&)을 사용하지 않으면, 오류가 발생합니다. 구조체. 멤버가 배열의 경우에는 '주소'를 의미하고, 변수나 상수 등을 의미할 때는 '값'을 지칭한다고 이해해도 될까요? <질문2> 구조체에서 문자열을 가진 변수를 선언할 때, 포인터보다 배열을 선호 한다고 하셨는데 그 이유가 정확하게 이해가 되지 않아서 질문 드립니다. 1) 포인터를 사용하게 되면, 포인터도 메모리를 차지하고, 동적할당 받은 메모리 영역도 있기 때문에 배열을 사용했을 경우보다 메모리 측면에서 비효율적이기 때문에 배열을 선호한다고 이해하면 될까요? 2) 소스코드에 직접 문자열을 입력하는 경우에는 해당 문자열이 메모리레이아웃의 text segment에 저장되어, 읽기 전용 모드이기 때문에 수정을 할 수 없다. 하지만, 할당 받은 메모리에 직접 입력을 받는 경우에는 힙 영역에 해당 데이터가 저장되기 때문에 수정 등이 가능하다. 라고 이해했는데 제대로 이해한 것인지 궁금합니다. 즉, <질문1>의 예시 코드처럼 name에 대한 메모리를 할당 받았을 때, 콘솔창에서 입력 받은 값은 힙 영역에 저장되고, 구조체 변수 student는 스택에 저장되어 힙에 할당된 name이 할당 받은 메모리를 가리키고 있는 것이 맞는지 궁금합니다! 감사합니다.
a = {'Phone': '01095136634', 'birth': '910904', 'adress': 'Busan', 'rank': [1, 2, 3], 'test': 'test_dict'} a라는 딕셔너리에서 910904라는 value값을 통해 key 값을 찾아서 출력 하고 싶습니다. 제가 생각 해낸 방법은 딕셔너리에는 순서가 없음으로 리스트로 형 변환을 하여 해당하는 인덱스를 불러오는 방법을 사용했습니다. print(list(a.keys())[list(a.values()).index('910904')]) 이거보다 더 효율적이고 간결한 방법이 있을 가요?