1.인공지능은 인공신경망 학습을 통해 발전하는데
인공신경망 학습은 각각의 조건에 따라 가중치를 받는 뉴런들을 생성하고
그 뉴런들을 일정한 가중치로 받는 새로운 뉴런이 존재하며
그런 뉴런들을 통과한 최종적인 값을 통해 결과를 확인하는 방식으로 진행되며
그 최종결과물이 정답이 나올 수 있도록 각각의 가중치를 계속해서 조정하는 과정을 학습이라고 한다.
2.이미지를 저장할 수는 있지만 인식하는 것은 어려운데
이러한 것을 가능하게 할 수 있는 가장자리 분석 방식이 Prewitt Operatiors라고 할 수 있다.
사진의 색상을 흑백으로 변경한 다음 0~255의 밝기 차이를 각각의 픽셀에서 확인한 다음
H모양으로 각각의 픽셀에서 데이터를 받아와서 왼쪽의 3개와 오른쪽 3개의 차이를 구한다.
만약 같은 배경 내의 공통된 내용이라면 차이는 거의 없거나 없는 수준일 것이고
가장자리일 경우 구분되는 색상이기 때문에 수치의 차이가 상당히 많이 나올 것이다.
이런 방식을 통해 수직선의 외곽을 구별해낼 수 있으며
이와 반대로 H를 눞힌 것과 같은 방식으로 위, 아래의 차이를 구해
수평선의 외곽을 구별해낼 수 있다.
3.카메라의 발전을 통해 점점 더 명확하게 이미지를 받아올 수 있고
비전 알고리즘을 통해 여러 가지 조건으로 외곽선들을 구별할 수 있게 되었다.
이를 통해 손, 팔, 다리, 몸통, 얼굴 등을 인식할 수 있게 되고
cctv, 게임기, 표정분석, 자율주행 등 여러가지 기능을 구현할 수 있게 되었다.
(1).백준 2178번 미로 탐색은 0,0에서 x,y로 이동하는 거리를 구하는 문제로
주어진 배열에서 1은 정상통로, 0은 벽을 의미한다.
일단 input에서 받은 값을 map 형태로 변경하고
변경된 map에서 거리 저장을 위한 값 세팅에 들어갔다.
더 적은 값이 들어가야 하기 때문에 가능한 최대값(보다는 조금 더 큰)인 10000을 넣어줬고
다행히 목적지에는 무조건 도착할 수 있는 미로라는 조건이 있었기 때문에
만약 목적지에 도착한 경우 break를 통해 반복문을 중단하고 결과를 출력했다.
해결 방식은 BFS로 queue에 현재 위치에서 네 방향을 이동하지만
이동 전 이동 가능한 위치인지를 먼저 체크하고
이동이 가능하다면 해당 위치에 저장된 값이 (현재 값 +1)보다 큰지 확인했다.
만약 (현재 값 +1)보다 작다면 이동할 필요가 없기 때문에 무시했고
조건이 통과될 경우 해당 위치의 값을 현재 위치의 값 +1로 변경해준 다음
queue에 해당 위치를 추가하고 그 위치는 queue의 순환 끝에 네 방향을 다시 체크하는 방식이다.
아래와 같이 a~q까지의 미로가 있다고 가정할 때
queue = [a]
abcd 1999
efgh 9999
ijkl 9999
mopq 9999
a에서는 b와 e 방향으로 진행하고
위, 오른쪽, 아래, 왼쪽 순서(정하기 나름)인 현재 상황에서는
queue에는 b와 e가 저장된다.
queue = [b,e]
abcd 1299
efgh 2999
ijkl 9999
mopq 9999
b와 e가 저장되었지만 queue의 특성상 b가 먼저 shift로 꺼내지고
그 뒤 b에서 c,f,a를 체크하지만 a는 현재 위치 값보다 1 작은 상태기 때문에
a는 무시한 채 c와 f의 값을 변경하고 다음으로 넘어간다.
queue = [e,c,f]
abcd 1239
efgh 2399
ijkl 9999
mopq 9999
그 다음 e의 경우 a, f, i 순서로 확인하지만
a는 현재 값보다 작으니 무시하고 f 또한 현재 값 +1보다 "크지 않기" 때문에
방문하지 않고 i만 3으로 초기화 한 다음 queue에 i를 추가하고 넘어간다.
queue = [c,f,i]
abcd 1239
efgh 2399
ijkl 3999
mopq 9999
이런 방식으로 이미 방문했던 위치를 더 빠른 경로가 아닌 방식으로 접근할 경우
queue에 추가하지 않기 때문에 중복없이 각각 한번씩만 queue에 들어가게 처리할 수 있다.
또한 벽에 막힌 경우라도 벽은 처리하지 않고 넘어가기 때문에
갈 수 있는 경로로만 뻗어나간다.
const input = `7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111`.split('\n')
const [xLength, yLength] = input[0].split(' ').map(Number)
const [xTarget, yTarget] = [xLength-1, yLength-1]
const map = []
const queue = [[0,0]]
for(let i = 1 ; i < input.length ; i++){
map.push([...input[i].split('').map(Number)])
}
for(let i = 0 ; i < map.length ; i++){
for(let j = 0 ; j < map[0].length ; j++){
if(map[i][j]){
map[i][j] = 10000
}
}
}
map[0][0] = 1
while (queue.length) {
const [xNow, yNow] = queue.shift()
if(map[xNow+1] && map[xNow][yNow] +1 < map[xNow+1][yNow]){
map[xNow+1][yNow] = map[xNow][yNow]+1
if(xNow+1 === xTarget && yNow === yTarget){
break
}
queue.push([xNow+1,yNow])
}
if(map[xNow][yNow] +1 < map[xNow][yNow+1]){
map[xNow][yNow+1] = map[xNow][yNow]+1
if(xNow === xTarget && yNow+1 === yTarget){
break
}
queue.push([xNow,yNow+1])
}
if(map[xNow-1] && map[xNow][yNow] +1 < map[xNow-1][yNow]){
map[xNow-1][yNow] = map[xNow][yNow]+1
if(xNow-1 === xTarget && yNow === yTarget){
break
}
queue.push([xNow-1,yNow])
}
if(map[xNow][yNow] +1 < map[xNow][yNow-1]){
map[xNow][yNow-1] = map[xNow][yNow]+1
if(xNow === xTarget && yNow-1 === yTarget){
break
}
queue.push([xNow,yNow-1])
}
}
console.log(map[xTarget][yTarget])
'회고' 카테고리의 다른 글
[취업준비일지] - 137 (0) | 2023.03.06 |
---|---|
[취업준비일지] - 136 (0) | 2023.03.05 |
[취업준비일지] - 134 (0) | 2023.03.03 |
[취업준비일지] - 133 (0) | 2023.03.02 |
[취업준비일지] - 132 (0) | 2023.03.01 |