달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
반응형

문제 설명

원점(0,0)에서 시작해서 아래처럼 숫자가 적힌 방향으로 이동하며 선을 긋습니다.

ex) 1일때는 오른쪽 위로 이동

그림을 그릴 때, 사방이 막히면 방하나로 샙니다.
이동하는 방향이 담긴 배열 arrows가 매개변수로 주어질 때, 방의 갯수를 return 하도록 solution 함수를 작성하세요.

제한사항
  • 배열 arrows의 크기는 1 이상 100,000 이하 입니다.
  • arrows의 원소는 0 이상 7 이하 입니다.
  • 방은 다른 방으로 둘러 싸여질 수 있습니다.
입출력 예arrowsreturn
[6, 6, 6, 4, 4, 4, 2, 2, 2, 0, 0, 0, 1, 6, 5, 5, 3, 6, 0] 3
입출력 예 설명
  • (0,0) 부터 시작해서 6(왼쪽) 으로 3번 이동합니다. 그 이후 주어진 arrows 를 따라 그립니다.
  • 삼각형 (1), 큰 사각형(1), 평행사변형(1) = 3

출처

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class Solution {
    public int solution(int[] arrows) {
        int roomCount = 0;
        
        Dictionary<string, int> visitedVertex = new Dictionary<string, int>(); // 방문 꼭지점
        Dictionary<string, int> usedEdge = new Dictionary<string, int>(); // 지나간 엣지
        
        int curX = 0;   // 현재 X좌표
        int curY = 0;   // 현재 Y좌표
        string curPoint = string.Format("{0},{1}", curX, curY);
        
        int nextX;
        int nextY;
        string nextPoint;
        
        visitedVertex.Add(curPoint, 1); // 시작점
        
        // 엣지 이동 양방향 포함
        string edge_1;
        string edge_2;
                
        //입력 받은 방향을 2번씩 반복해서 움직일 것임
        //X로 교차하는 교점의 좌표도 고려해야하며, 단순히 좌표의 스케일을 2배로 늘리는 것으로 해결 가능.
        
        //arrows 수치 당 이동할 좌표
        int[] dirX = new int[] {0, 1, 1, 1, 0, -1, -1, -1};
        int[] dirY = new int[] {1, 1, 0, -1, -1, -1, 0, 1}; 
        
        for(int i = 0 ; i < arrows.Length; i++)
        {
            // 좌표스케일 단순 2배 늘리기 반복
            for(int j = 0 ; j < 2 ; j++) 
            {
                curPoint = string.Format("{0},{1}", curX, curY);
                nextX = curX + dirX[arrows[i]];
                nextY = curY + dirY[arrows[i]];
                nextPoint = string.Format("{0},{1}", nextX, nextY);
                edge_1 = string.Format("{0} -> {1}", curPoint, nextPoint);
                edge_2 = string.Format("{0} -> {1}", nextPoint, curPoint);
                
                //방문했던 위치 여부 체크(방문)
                if(visitedVertex.ContainsKey(nextPoint)) 
                {
                    //사용할 Edge가 사용 여부 체크(미사용)
                    if(!usedEdge.ContainsKey(edge_1))
                    {
                        roomCount++;
                        usedEdge.Add(edge_1, 1);
                        usedEdge.Add(edge_2, 1);
                    }
                }
                else 
                {
                    visitedVertex.Add(nextPoint, 1);
                    usedEdge.Add(edge_1, 1);
                    usedEdge.Add(edge_2, 1);
                }
                
                curX = nextX;
                curY = nextY;
                
            }
        }
        
        
            
        Console.WriteLine(roomCount);
        return roomCount;
    }
}

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.