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; }



영어회화 멘토링을 받게 된 계기는 5가지다.


1. 취업을 위한 OPIC 점수가 필요하기 때문에. 

부연설명 : 토익은 무쓸모하다고 판단했음.


2. 요새 글로벌 시대 아닌가? 그래서 비즈니스 영어를 익혀서 영어로 업무 전화, 프로젝트 발표를 하기 위함이 크다. 

부연설명 : 18년 10월 17일 오늘 실제로 회사에서 몇일 후에 있을 회의에서 현재 Vuzix m100 관련해서 '발표 해볼래?'라는 제안을 받았다. 해당 회의에는 외국인들도 많고 큰 회의실에서 열리는 회의인데... 일게 실습생인 주제에 하기가 겁났는데 오히려 기회로 포착했다. 12월쯤에 발표할 기회가 있다면 발표를 하기 위해서 준비하겠다는 목표가 커졌다.


3. 외국인이 말 걸때 영어를 잘하고 싶다.

부연설명 : 길을 지나가다가 길 잃은 외국인을 도와주는 한국인의 영어회화 실력이 일취월장했다. 그 모습이 너무 멋있었고 후광효과까지 주었다. '나도 그렇게 될 수 있지 않을까?' 생각했고 되려고 한다.


4. 외국인 친구들의 열린 마인드를 경험하고 그들하고 친하게 지내고 싶기 때문이다.

부연설명 : 넓은 세상을 경험하고 싶고 친구들을 사귀면 그 친구들이 지내는 나라에 가서 얼굴도 보고 그 나라의 문화를 더 생생히 체험하면서 현지인의 팁을 얻을 수 있는 기회이기 때문이라고 생각했다.


5. 생각없이 해외 편한 마음으로 여행하려고.

부연설명 : 해외 여행 갈 때 일정을 짜고 여러번 검토하는 과정을 많이 거치게 된다. 이러한 과정이 매우 귀찮다. 그냥 대충 갑자기 '어느 나라의 어느 지역이 끌린다. ' 라는게 생기면 그냥 무작정 비행기, 숙소 예약하고 현지인 혹은 여행객들과 친해져서 그들과 같이 다니면서 편하게 여행하고 싶기 때문이다. 그리고 한국인 하나도 없는 곳에 있어도 당당할 수 있다고 확신한다.



J...학원? 강사님들이 서울에서 강의하다가 지방에 가끔씩 와서 강의를 하려고 한다고 했다.


무료강의를 하는 이유는 현재 한국에서 영어를 배우는 체계가 안좋다고 말을 했고 나중에 훗날 이것을 뒤집어서


진짜 영어회화를 위한 교육이 되었으면 하는 바램에 우리가 잘 성장해서 나중에 일을하면서도 꼭 영어 교육을 해주었으면 한다고 전했다.


여하튼 후기 시작한다.





학교 게시판에 올라온 글을 확인하고 부산 서면에서 무료 멘트링을 받게 되었다.


멘토링을 받기 전에 보증금 만원을 주었다. 


처음에 옆에 있는 사람과 가위바위보를 해서 한명씩 나가서 앞에는 7명의 사람이 모였다.


그들에게 질문을 한개해서 그들이 맞추면 다시 자리로 들어오는 방식이었다.


그런데 그들의 실력은 매우 대단했다. 나는 너무 부끄러웠고 고개만 숙였다.


그런데 강사님은 여기서 그들에게 꾸중을 했다. '본인이 영어 잘하는건 알겠다. 그런데 그거 여기있는 사람들이 알아들을거 같냐고' 라고


그 말을 듣는 순간 너무 공감이 되었다. 진짜 영어 잘하긴 하는데 너무 빨라서 말의 강약조절 또한 잘 들리지 않는다는 것이 단점이었다.


그래서 선생님이 계속 천천히 다시 하라고 하자, 그 말이 너무 듣기 편하게 되었다.


앞에 나온 사람들 대부분이 그렇게 영어를 하고 몇가지 멘토링을 받고 자리로 들어갔다.


그러다가 나중에 자리에 앉아 있는 뒤의 사람에게 급습 질문을 하긴 했는데 기억이 잘 안난다.


질문에 따른 답변은 자신감이 부족했고 상대방에게 의사전달이 잘 안되도록 목소리가 안으로 들어갔다.


그러한 지적을 선생님이 정확하게 집어냈고 다음으로 나에게 질문을 했다.


" '나는 긍정적인 사람이다' 영어로 해보세요. "라고.


머리가 하얗게 되었는데, 그냥 편하게 얘기했다.


"I'm happy"


갑자기 영어는 이렇게 간단하게 말하는 거라고 강조하면서 박수를 받았고 강의가 끝날때


강사님은 " I'm happy" 처럼 간단간단하게 의사만 전달하라고 하면서 강의가 끝났다.


이것 외에도 강의 중에 영어에 있어서 중요한 요소 여러개를 알려주었다.


과거시제, 과거분사 이딴거 왜 쳐하냐고 했다.


그냥 자신감 있게 단어 한두개씩이라도 그냥 뱉으라고 했다.


예를 들면, 외국인이 한국회사에 입사하기 위한 한국어 면접을 보는 예시를 들어주었다.


'나는 먹는다. 밥을. 낮에' 라고 또박또박 말하는 것과


'나는 낮에... 밥...을 먹..는다.' 를 자신감없이 얘기하는 것을 비교해주었는데


확실히 전자가 듣기 더 좋고 알아 들을 수 있었다.


그렇기 때문에 영어는 그냥 의사소통 수단일 뿐이지 정확하게 하지말라는 강조를 많이 해주었다.


그래서 장문보다는 단문으로 여러개를 자신감있게 얘기하는 연습이 중요함을 확실히 몸으로 깨달았다.


그러면서 이러한 영어를 편하게 하기 위한 패턴 50가지를 숙지하면 영어회화 왠만큼은 다 된다고 했다.


그래서 그 패턴이라는 것을 항상 염두해두고 패턴을 늘려가고자 한다.


올해의 목표는 30패턴을 익히는 것이다.


70일 정도 남아서 안될 수도 있지만 일단 기회되는대로 하고자 한다.


그리고 그 외 영어회화의 내용은 대부분 취업과 관련된 이야기였다.


자기소개서, 면접 등 실제로 입사 준비할 때 '무엇이 중요한가?' 라는 얘기를 많이 하였다.


그리고 7명이 앞에 나가서 임의로 면접 질문 한가지씩 받았다.


나는 그 날따라 왠지 모르게 자신감이 넘쳤는데, '어떠한 친구들이 싫은가?' 라는 질문을 받았다.


그래서 '나는 째째한 친구들을 싫어한다.' ... ... '왜냐 하면, ... ... ...'


이렇게 끝났는데 내 자신이 너무 한심해보였다.


그들은 컴퓨터전공이 아니어서 그들과 공감되는 말을 하는 것에 있어서 '중간을 어떻게 잡고 의사소통을 해야하는가?'


라는 말이 계속 떠올랐기 때문이다.


그리고 나중에 디스 당했는데, 그 내용은 '평소에 말하기 편한 친구들만 있지 않냐?' 였는데, 당당하게 '네' 라고 했다.


왜냐하면, 불편한 친구는 점점 내가 멀리한다는 것이 느껴졌다. 자신의 주장이 강한 친구들 말이다.


틀린 말은 아니지만, 기분이 나쁜 것은 확실했다. 당연히 싫은 사람을 친구로 둘 필요가 없기 때문이다.


그래도 강사님의 말이 다 맞고 내가 너무 벙쪄있어서 그냥 나 자신한테 너무 화가 났다.


그러다가 강의를 마무리하면서 강사님은 다시 한번 강조를 했다.


제발 짧게 짧게 얘기하는 습관을 기르라고 했다.


그렇게 수업이 마무리 되면서 OPIC 책과 함께 보증금 만원을 현찰로 돌려 받게 되었다.


그리고 모임공간을 나가는 길에 강사님이 나중에도 기회되면 계속 봤으면 좋겠다고 얘기를 하면서 바쁘게 택시를 타고 떠났다.






나는 서면에 온 겸에 겸사겸사 Moma라는 Bar에 가서 술을 먹었다.


Moma는 예전에 팔로우했던 사람이 일하고 있는 곳이고 그냥 왠지 생각나서 갔는데 혼자 가니까 쓸쓸해서 금방 나왔다.


Moma는 스피커가 매우 짱짱했고 힙한 노래들이 많이 나왔다. 그리고 DJ 스테이지 따로 있고 앞에는 춤 추기 넓은 공간이 있었다.


일단 아무래도 칵테일을 파는 것이니까 가격대가 8~9천원대로 비쌌다.


그래서 나중에 서면에서 술을 진탕 먹고 기회될 때 다시 가려고 한다.



sitemap.xml


'IT 생존기' 카테고리의 다른 글

블로그를 시작한 이유  (1) 2018.10.15

결과보고서.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' 입력하면 실행이 됨.





1. 많은 경험들 중 몇가지만 남고 증발하는 것이 현실이다. 그런데 이러한 경험들을 남기고자 한다.


2. IT 기업 입사할 때, 블로그 주소 혹은 Github 주소를 자꾸 내놓으라고 한다. 이 부분이 없어서 개부끄럽고 열받는다. 나중을 위해서라도 지금 시작한다.


3. 공부할 때 로컬에서 보관해봤는데 순식간에 자료들이 사라진다. 그래서 클라우드를 사용해봤다. 생각보다 체계적으로 자료정리가 잘 된다. 그런데 얘네는 한달에 10,000원 넘게 달라고 하는데 개열받는다. 그래서 공부자료를 블로그에 저장하고자 한다.



+ Recent posts