내가 이해한 바:
영상은 다음과 같습니다.
........... ........... ...X....... ........... .....Y..... <---1N from top X, 2N from bottom X ........... .......Y... <---2N from top X, 1N from bottom X ........... .........X. ...........
시각적으로 선명합니다.
알고리즘적으로 어떻게 판단할 수 있나요?
다음은 그리드 예시입니다.
............ ........0... .....0...... .......0.... ....0....... ......A..... ............ ............ ........A... .........A.. ............ ............
0에 집중하겠습니다:
처음 두 가지 비교:
1,8 vs. 2,5 1 row apart 3 col apart 2 possible antinodes: 0,11: 0 = min(1,2) - 1 3,2 For 0,11 0 = min(1,2) - 1 11 = ....
글을 쓰면서 두 점을 연결하는 선의 기울기를 꼭 알아야 한다는 걸 깨달았습니다.
그러면 각 축을 더하거나 빼서 배 노드가 어디에 있는지 알 수 있습니다.
공식은 다음과 같습니다.
(y2 - y1) / (x2 - x1)
결과는 다음 네 가지 중 하나입니다.
예로 돌아가기:
1,8 and 2,5 (5 - 8) / (2 - 1) = -3 / 1 = -3
뭐? 음의 기울기? 아니요, 그 선은 양의 기울기를 가지고 있습니다!
아... 그렇군요.
배열 인덱싱의 개수는 증가했지만 시각적으로는 감소하고 있습니다.
지수를 거꾸로 세어야 합니다.
이렇게 하는 대신:
0 ............ 1 ........0... 2 .....0...... 3 .......0.... 4 ....0....... 5 ......A..... 6 ............ 7 ............ 8 ........A... 9 .........A.. ............ ............ 0123456789
다음과 같이 계산해야 합니다.
............ ........0... 9 .....0...... 8 .......0.... 7 ....0....... 6 ......A..... 5 ............ 4 ............ 3 ........A... 2 .........A.. 1 ............ 0 ............ 0123456789
좀 더 수학적인 지식이 필요할 뿐입니다:
array length - current row/col index
노력하겠습니다.
최상위 0의 경우:
12 rows Row index: 1 12 - 1 = 11 Column index: 8 Coordinates: 8,11
다음 행의 0:
Row index: 2 12 - 2 = 10 Column index: 5 Coordinates: 5,10
그리고 경사:
(10 - 11) / (5 - 8) -1 / -3 1/3
긍정적인 기울기! 맞습니다!
중첩된 for 루프로 채워진 빈 객체:
let graph = input.split('\n').map(el => el.split('')) let antennas = {} for (let y = 0; y < graph.length; y++) { for (let x = 0; x < graph[0].length; x++) { if (graph[y][x] !== '.') { if (!(graph[y][x] in antennas)) { antennas[graph[y][x]] = [] } antennas[graph[y][x]].push([graph.length - y,x]) } } } <p>예제 입력을 위해 다음 개체를 생성합니다.<br> </p> <pre class="brush:php;toolbar:false">{ '0': [ [ 11, 8 ], [ 10, 5 ], [ 9, 7 ], [ 8, 4 ] ], A: [ [ 7, 6 ], [ 4, 8 ], [ 3, 9 ] ] }
멋져요!
다음으로 기울기를 계산합니다.
내 범위 기능은 간단합니다.
function getScope(p1,p2) { return (p2[0] - p1[0]) / (p2[1] - p1[1]) }
2개의 배열을 예상하고 4개의 좌표를 모두 사용하여 범위를 반환합니다.
모든 유사 주파수 좌표 쌍을 비교할 때 이 함수를 호출하고 싶습니다.
이 비교는 슈퍼 중첩 for 루프에서 이루어집니다.
for (let freq in antennas) { let f = antennas[freq] for (let i = 0; i < f.length; i++) { for (let j = i + 1; j < f.length; j++) { // Comparing two antennas of the same frequency } } }
예제 입력에서 작동하는지 확인:
[ 11, 8 ] [ 10, 5 ] [ 11, 8 ] [ 9, 7 ] [ 11, 8 ] [ 8, 4 ] [ 10, 5 ] [ 9, 7 ] [ 10, 5 ] [ 8, 4 ] [ 9, 7 ] [ 8, 4 ] [ 7, 6 ] [ 4, 8 ] [ 7, 6 ] [ 3, 9 ] [ 4, 8 ] [ 3, 9 ]
9가지 비교. 그렇죠!
각각의 범위는 어떻게 되나요?
그것도 다행히 맞는 것 같네요.
이제 지나치게 복잡한 부분인 것 같습니다.
다음과 같습니다.
........... ........... ...X....... ........... .....Y..... <---1N from top X, 2N from bottom X ........... .......Y... <---2N from top X, 1N from bottom X ........... .........X. ...........
이건 처리해보겠습니다.
많지만 각 절의 미묘한 부분이 중요합니다.
............ ........0... .....0...... .......0.... ....0....... ......A..... ............ ............ ........A... .........A.. ............ ............
다행히 확인된 모든 항노드가 올바르게 배치된 것 같습니다.
다음으로, 범위를 벗어난 것은 제외
...추가 조건을 입력하세요!
1,8 vs. 2,5 1 row apart 3 col apart 2 possible antinodes: 0,11: 0 = min(1,2) - 1 3,2 For 0,11 0 = min(1,2) - 1 11 = ....
각 좌표가 0부터 행이나 열의 길이 사이인지 확인 중입니다.
그런 다음 antinode-finder의 각 절 하단에서 가능한 두 노드 모두에 대해 함수를 호출합니다.
(y2 - y1) / (x2 - x1)
그리고 내 대답은 내 유효한 세트의 크기가 될 것입니다.
실행하면 14가 아닌 12가 생성됩니다.
왜 안 되나요?
...
몇 가지 디버깅 후에 오류를 발견했습니다.
1,8 and 2,5 (5 - 8) / (2 - 1) = -3 / 1 = -3
제가 맡은 줄의 과제가 한 차나 늦었습니다. 하나 적은 값이 필요합니다.
0 ............ 1 ........0... 2 .....0...... 3 .......0.... 4 ....0....... 5 ......A..... 6 ............ 7 ............ 8 ........A... 9 .........A.. ............ ............ 0123456789
문제가 해결되었습니다.
이제 14개 보이네요.
퍼즐 입력으로 실행할 시간입니다.
...
정답!!!
생각보다 시간이 많이 걸렸지만 해냈습니다!
파트 2에 무엇이 필요할지 상상만 되네요.
꿀꺽.
비교적 간단한 조정일 수도 있지만 이것이 더 어렵게 느껴집니다.
생각해볼 시간입니다.
...
주로 이 문제 때문에:
동일한 주파수의 안테나 2개 이상과 정확하게 일치
저는 생각합니다 이 기준을 이해합니다.
내 직감으로는 특정 주파수에 3개의 안테나가 있는 한 세 개의 안테나도 모두 배점이라는 것입니다.
내가 틀렸다면 안테나를 안티노드로 착각하는 대답이 나오지 않을 것입니다.
하지만 새로운 안티노드를 모두 식별할 수 있는 전략은 있는 것 같아요.
현재 알고리즘은 두 안테나의 양쪽 끝에서 안티노드를 찾습니다.
대신 경계를 벗어나기 직전까지 양방향으로 선을 따라 걷고 싶습니다.
일부 리팩토링이 필요합니다.
준비됐어요
양의 경사선에 대한 업데이트된 조건은 다음과 같습니다.
............ ........0... 9 .....0...... 8 .......0.... 7 ....0....... 6 ......A..... 5 ............ 4 ............ 3 ........A... 2 .........A.. 1 ............ 0 ............ 0123456789
변경된 사항:
각 절마다 이렇게 해야 했어요.
하나를 약간 어지럽혀서 예제 입력을 사용하여 off-by-1 답변을 얻었고, 정말 이상한 그리드를 보고 어떤 절이 제대로 작동하지 않는지 진단하는 데 도움이 되었습니다.
결국 예제 입력 작업에 성공했습니다.
그런 다음 퍼즐 입력으로 실행했습니다.
그리고...
정답을 생성했습니다!!!
제 자신이 너무 자랑스럽습니다!
그리고 제 퍼즐 입력에 은밀한 엣지 케이스가 없어서 너무 감사해요!
와우, 이 문제를 해결하는 데 며칠이 걸렸습니다.
어려운 금별 2개를 획득한 또 다른 날.
위 내용은 공명 공선성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!