<Lv.5> 방의 개수 (프로그래머스 : C#)

이도희·2023년 8월 26일
0

알고리즘 문제 풀이

목록 보기
155/185

https://school.programmers.co.kr/learn/courses/30/lessons/49190

📕 문제 설명

원점에서 시작해서 다음 숫자의 방향으로 이동하며 선을 그을때 방의 개수 반환하기
(사방이 막힌 것을 방이라 정의한다.)

  • Input
    이동하는 방향이 담긴 배열
  • Output
    방의 개수

예제


풀이

방문한적 있는 점에 대해 간선 방문 여부를 확인해서 도형이 생긴지 아닌지 알 수 있다. 간선이 이미 방문되었다면 그냥 직선을 왔다갔다한 케이스라 도형이 생기지 않는다. 추가로 대각선 부분을 확인하기 위해 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;
    }
        
}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글