https://school.programmers.co.kr/learn/courses/30/lessons/49190
원점에서 시작해서 다음 숫자의 방향으로 이동하며 선을 그을때 방의 개수 반환하기
(사방이 막힌 것을 방이라 정의한다.)
방문한적 있는 점에 대해 간선 방문 여부를 확인해서 도형이 생긴지 아닌지 알 수 있다. 간선이 이미 방문되었다면 그냥 직선을 왔다갔다한 케이스라 도형이 생기지 않는다. 추가로 대각선 부분을 확인하기 위해 scale 자체를 2배로 해서 대각선 부분도 점이 거칠 수 있도록 만들어준다.
+) 도형 개수 세주는 if문을 하나로 합치면 에러가 난다.. (&&로 합쳤을때..?)
using System;
using System.Collections.Generic;
public class Solution {
struct Node
{
public int x;
public int y;
}
public int solution(int[] arrows) {
int answer = 0;
int n = arrows.Length;
int x = 0;
int y = 0;
int[] deltaX = new int[] {0,1,1,1,0,-1,-1,-1};
int[] deltaY = new int[] {1,1,0,-1,-1,-1,0,1};
Dictionary<Node, HashSet<Node>> visited = new Dictionary<Node, HashSet<Node>>();
visited[new Node(){x=0,y=0}] = new HashSet<Node>();
// 대각선 확인위해 2번씩 move
for(int i = 0; i < arrows.Length; i++)
{
int dir = arrows[i];
for(int j = 0; j < 2; j++)
{
int newX = x + deltaX[dir];
int newY = y + deltaY[dir];
Node currNode = new Node(){x=x,y=y};
Node newNode = new Node(){x=newX,y=newY};
if(visited.ContainsKey(newNode)) // 방문한적 있는 점
{
if(!visited[newNode].Contains(currNode)) // 간선은 처음 보는 경우 (도형 생김)
{
answer += 1;
}
}
else
{
visited[newNode] = new HashSet<Node>();
}
visited[newNode].Add(currNode);
visited[currNode].Add(newNode);
x = newX;
y = newY;
}
}
return answer;
}
}