1697 - 숨바꼭질 https://www.acmicpc.net/problem/1697


문제 분류에서는 DFS라고 나와있는데, 사실상 알고보면 BFS 문제다.


아무 것도 모르던 나에게 DFS라고 하길래 노가다 하면서 계속 고민을 해봤는데 이거는 ㄹㅇ 암만 봐도 노답이었다. BFS 쓰자.


BFS를 잘 모르겠다면 체스 나이트 최단거리 구하는 문제부터 연습하자

9466 - 텀 프로젝트 https://www.acmicpc.net/problem/9466


기존의 흔히 사용하는 DFS는 2차원 배열에서 값을 찾는 것이지만,


해당 문제는 1차원 배열에서 문제를 찾는 방식임.


1. 이미 방문한 곳은 방문하지 않도록 하기 위해서 visit1을 선언했다.
그냥 한번이라도 들리게 된다면 visit1의 값을 1로 변경했다.
그렇기 때문에 visit1의 값이 0일때만 깊이를 파고들도록 한다.

2. 순회의 끝을 찾기 위해서 visit2를 사용했다.
깊이를 들어갈 때마다 visit2의 값을 1로 변경했다.
그러다가 다음에 나올 visit2의 값이 만약에 0이라면 순회의 끝에 도달했다고 볼 수 있다.
그렇기 때문에 사이클을 돌려서 얼마만큼의 깊이까지 들어갔는지 체크를 하도록 한다.

#include<stdio.h> #include<string.h> #include<stdlib.h> int map[100001]; int visit1[100001]; //map에서 한번이라도 체크되었는지 확인. int visit2[100001]; //순회의 끝을 찾기 위함. int total, visit_count=0; void dfs(int i) { int a; int next = map[i]; visit1[i] = 1; //printf("visit1[%d] : %d, visit_count: %d\n", i, map[i], visit_count); if(visit1[next] == 0) { dfs(next); } else { if(visit2[next] == 0) { for(a=next; a!=i; a=map[a]) { visit_count++; //printf("i : %d, a: %d, map[%d] : %d, visit_count : %d\n", i, a, a, map[a], visit_count); } visit_count++; } } visit2[i] = 1; } int main(void) { int i, total_count = 0, non_visit_count =0, n; scanf("%d", &total); fflush(stdin); while(total_count++ <total) { memset(map, 0, sizeof(map)); memset(visit1, 0, sizeof(visit1)); memset(visit2, 0, sizeof(visit2)); scanf("%d", &n); for(i=1; i<=n; i++) { scanf("%d", &map[i]); } fflush(stdin); visit_count = 0; for(i=1; i<=n; i++) { if(visit1[i] == 0) { dfs(i); } } printf("%d\n", n-visit_count); } return 0; }



2667-단지번호붙이기 acmicpc.net/problem/2667


해당 문제는 DFS 기초문제이다.


DFS를 사용한 이후에 나온 값들에 대한 정렬이 필요하다.


나는 처음에 퀵정렬 사용하려고 qsort함수를 사용하기 위해서 int compare(const void* a, const void* b) 함수를 새로 만들어서 사용하기도 했는데


왜인지 잘 모르겠지만 정렬이 잘 안됬음.


그래서 그냥 버블정령 만들어서 바로 사용했음.


#include<stdio.h> #include<string.h> #include<stdlib.h> int map[100][100]; int visit[100][100]; int* result; int stack=0; int n; int max=0; void dfs(int i, int j) { int x, y,k; int dx[] = {0,1,0,-1}; int dy[] = {1,0,-1,0}; visit[i][j] = 1; max++; for(k=0; k<4; k++) { x=i+dx[k]; y=j+dy[k]; if(x<0 || y<0 || x>n-1 || y>n-1) continue; if(visit[x][y] == 0 && map[i][j] == map[x][y]) { dfs(x, y); } } } int main(void) { int i, j; char input[100]; int temp; scanf("%d", &n); fflush(stdin); result = (int*)malloc(sizeof(int)*n*n); memset(map, 0, sizeof(map)); memset(visit, 0, sizeof(visit)); memset(result, 0, sizeof(result)); for(i=0; i<n; i++) { scanf("%s", input); fflush(stdin); for(j=0; j<n; j++) { map[i][j] = input[j]-48; } } for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(visit[i][j] == 0 && map[i][j] == 1) { max=0; dfs(i, j); result[stack++] = max; } } } for(i=0; i<stack-1; i++) { for(j=0; j<stack-1; j++) { if(result[j] > result[j+1]) { temp = result[j]; result[j] = result[j+1]; result[j+1] = temp; } } } printf("%d\n", stack); for(i=0; i<stack; i++) { printf("%d\n", result[i]); } return 0; }


10026-적록색약 acmicpc.net/problem/10026


DFS를 활용한 기초문제


dfs함수 안에서 조건문의 값 크기를 잘 설정하자.


저기서 x, y 조건을 약간 잘못걸어서 에러를 찾지 못하고 오래동안 헤맸음.

#include<stdio.h> #include<string.h> #include<stdlib.h> int arr[1000][1000]; int visit[1000][1000]; int result = 0; int n = 0; void dfs(int i, int j) { int x,y,k; int dx[4] = {0,1,0,-1}; int dy[4] = {1,0,-1,0}; for(k=0; k<4; k++) { x = i + dx[k]; y = j + dy[k]; if( x<0 || y<0 || x>n-1 || y>n-1) continue; if(visit[x][y] == 0 && arr[i][j] == arr[x][y]) { //printf("Log i,j,x,y : %d %d %d %d\n", i,j,x,y); //printf("Log 좌표값 : %d %d\n", arr[i][j], arr[x][y]); //printf("Log visit값 : %d %d\n\n\n", visit[i][j], visit[x][y]); visit[x][y] = 1; dfs(x,y); } } } int main(void) { int i, j; char str[1000]; memset(visit,0,sizeof(visit)); memset(arr,0,sizeof(arr)); scanf("%d", &n); fflush(stdin); for(i=0; i<n; i++) { scanf("%s", str); fflush(stdin); for(j=0; j<n; j++) { if(str[j] == 'R') { arr[i][j] = 2; } else if(str[j] == 'B') { arr[i][j] = 1; } } } //일반인 for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(visit[i][j] == 0) { dfs(i, j); result ++; } } } printf("%d ", result); //장애인 memset(visit,0,sizeof(visit)); for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(arr[i][j] == 2) { arr[i][j] = 0; } } } result = 0; for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(visit[i][j] == 0) { visit[i][j] = 1; dfs(i, j); result ++; } } } printf("%d\n", result); return 0; }



결과보고서.zip

프로젝트 수행계획서 제출본 - 수정본.docx


m100에 관해서 제가 도울 수 있는 부분에 대해서는 도와드리겠습니다. 답글 달아주세요.


프로젝트 : 공장 조립부에서 사용중인 테블릿을 스마트 글래스로 대체하기 위함.



목차


1. 소개

2. 기능 - Regonition

3. 데모를 위한 Android Screen Monitor



1. 소개



여름 방학 때, 학교에서 볼보그룹코리아 창원지점의 P&IT 부서에서 현장실습을 갔다.


4주간의 프로젝트 기간 중 1주차는 부서 안내와 교육 등 받으면서 프로젝트 설정하기 위한 시간으로 보냈다.


회사에 있던 스마트 글래스 m100을 활용해서 '공장 조립부의 테블릿을 대체하기 위한 스마트 글래스' 프로젝트를 진행했다.


해당 프로젝트는 스마트 글래스의 가능성을 알아보기 위한 프로젝트였다.


공장에 대한 이해도가 낮은 우리는 상무님의 요구사항에 맞추어서 프로그램을 개발하기 시작했다.


Vuzix m100에 대한 소개는 다음과 같다.




API Level : 15 ( = 갤럭시s1 ~ 갤럭시 s2)


회사 : Vuzix


가격 : 약 1,000,000원


RAM : 1gb


flash : 4gb


voice : 지원 가능


Android Studio 지원.


이처럼 Vuzix는 API부터 엄청나게 낮고 RAM과 용량 전부 갤럭시 s1 정도의 사양이다. 이것은 약 2012년대의 스마트폰 사양으로 스마트폰이 보급되기 시작할 때라서 라이브러리가 매우 적다. 그런데 도대체 왜 1,000,000원씩이나 하는지는 잘 모르겠다. 이거로 시작할라는데 화면은 매우 작아서 잘 보이지도 않는다.


하여튼 이러한 스마트 글래스로 작업을 시작했다. Android Studio에서 앱 작동을 위해서 Vuzix m100 SDK 설치하고 머 이것저것 했는데 잘 안 되었다.

그러다가 그냥 컴파일 버전 15로 맞추고 그냥 Run 눌렀는데 된다. 이유는 아직 모르겠는데 다른 컴퓨터도 테스트해본 결과 그냥 된다.

그래서 해당 기기를 가지고 우리는 상무님이 말한 요구사항에 맞추어서 진행하였고 아래 그림은 해당 프로젝트의 흐름도이다.




 


2. 기능 - Recognition



개발을 QR code 기능을 이용해서 데이터를 받아와서 해당 데이터로 URL을 접속한 이후 웹 데이터를 파싱하는 방식으로 진행했다.

여러가지 기능 중 가장 중요하다고 생각되는 Recognition에 대한 설명을 하도록 하겠다.


개발을 위해서 STT 기능이 필요해서 Android에 적용되는 구글 라이브러리와 몇 가지 더 사용해보았는데 외부망이 필요하거나 m100이랑 호환이 안되는 경우가 대부분이었다. 그래서 조금 더 찾아보니 누군가 만들어놓은 Vuizx m100 STT 라이브러리가 있었다. 해당 라이브러리를 사용하는 것은 순식간에 되서 현재 사용중이고 해당 링크는 다음과 같다.

https://github.com/scottw-vuzix/M100Empty

해당 링크에서 사용중인 com.vuzix.speech.jar 라이브러리를 그대로 가져와서 사용했다.


해당 라이브러리 안을 살펴보니 api 3 레벨의 Speech To Text 라이브러리를 사용하는 것을 발견했다.

그리고 단어 목록이 수록되어있고 해당 단어들을 글어와서 사용이 가능하다.

private void restrictWords()

라는 함수에서 필요한 단어만 골라서 사용이 가능하다.

그리고 직접적인 단어장을 만들기 위해서는 Vuzix에 문의해보았는데 돈을 주어야 한다고 한다. 자세한 내용은 더 이상 물어보지 않았는데 필요할 경우 Vuzix에 바로 문의해보자.


단어장 추가는 다음과 같이 addGrammer를 이용한다.

addGrammar(Constants.GRAMMAR_CAMERA);

(Kotlin에서 개발한 github 자료도 발견했는데 18년 10월 12일 마지막 업데이트가 되기도 했는데 누군가 계속 개발중인 프로젝트도 있는듯하다. 링크는 다음과 같다.

https://github.com/vuzixtokyo/vuzix_speechrecognition_sample

이 링크 또한 recognition을 포함한 프로젝트임이 분명하다.)



3. 데모를 위한 Android Screen Monitor



https://adakoda.github.io/android-screen-monitor/

페이지에서 다운받아서 이용하면 된다.

이를 위해서 버전에 맞는 jdk 설치를 해야한다. 그리고 adb와 java 등 환경변수 설정으로 경로를 미리 만들어두는 것이 편하다.

이러한 과정이 끝나면 'java -jar asm.jar' 입력하면 실행이 됨.





+ Recent posts