방의 개수 (프로그래머스) JAVA

2023. 8. 16. 13:11·BackEnd/알고리즘 공부

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

입력으로는 방향이 주어진다. 이 방향으로 움직였을 때, 방이 생기는지 확인하면 됩니다. 예시로 살펴보면 

주어진 방향대로 움직이면 삼각형 1개, 큰 사각형1개, 평행사변형 1개가 생깁니다.

 

문제에 대한 아이디어

이 문제는 프로그래머스 코딩 테스트 문제 풀이 전략에서 나온 문제입니다. 간선을 지나갔는지 유무를 확인하는 문제를 어떻게 풀어야 할까 고민하고 있었는데  책에 이 문제가 있어 책의 해결책을 공부해봤습니다.

이 문제는 배열의 크기가 10만입니다. 이러면 한 방향으로 10만번 이동 할 수 있고 총 배열의 크기는 20만 * 20만입니다. 그러므로 2차원 배열로 푸는 문제는 아닌 것 같습니다. 그래서 인접 리스트를 이용해 그래프를 표현해야 합니다.

 

방이 생길 조건

  • 기존에 방문 했던 정점에 갔을 때
  • 이 때 잇고자 하는 두 정점이 이미 이어져 있으면 안됨

즉, 기존에 방문 했던 정점에 도달 했을 때 처음 간 간선 이어야 한다.

 

방이 2개 생길 경우

  • 상,하,좌,우로만 움직인다면 방은 무조건 한개가 생깁니다.
  • 하지만 대각선으로 움직인다면 두 개의 대각선이 만나 2개의 삼각형이 생길 수 도 있습니다.

이걸 해결하기 위해 2번 움직이면 됩니다. 즉, 모든 크기를 2배 씩으로 하면 대각선으로 움직여도 하나의 도형이 생깁니다.

 

전체 코드

 public static class  Vertex{
        public final int y;
        public final int x;
        public final String id;
        public final Set<String> connectedVertices;
        
        public Vertex(int y, int x){
            this.y = y;
            this.x = x;
            this.id = id(y,x);
            this.connectedVertices = new HashSet<>();
        }
        
        public static String id(int y, int x){
            return String.format("(%d, %d)", y, x);
        }
    }
  • Vertex 클래스는 한 점 입니다.
  • connectedVertices는 그 정점이 누구랑 연결되어 있는지를 저장하는 Set입니다.
  • 이번 책에서 배운 내용은 id를 설정하면 더 편하게 Map에서 관리 할 수 있다는 점 입니다.
public int solution(int[] arrows) {
        int answer = 0;
        Map<String, Vertex> vertices = new HashMap<>();
        Vertex v = new Vertex(0, 0);
        vertices.put(v.id, v);
        
        for(int d : arrows){
            for(int i = 0; i < 2; ++i){
                int ny = v.y + dy[d];
                int nx = v.x + dx[d];
                String id = Vertex.id(ny,nx);
                
                if(!vertices.containsKey(id)){
                    vertices.put(id, new Vertex(ny, nx));
                } else if(!v.connectedVertices.contains(id)){
                    ++answer;
                }
                
                Vertex u = vertices.get(id);
                v.connectedVertices.add(u.id);
                u.connectedVertices.add(v.id);
                v = vertices.get(id);
            }
            
        }
        return answer;
    }
  • Map<String, Vertex> 에서 key는 id입니다. 지나간 정점을 확인 할 수 있습니다.
  • for문을 2번 도는 것은 모든 크기를 2배로 했기 때문입니다.
  • vertices가 key를 포함했다면 즉 한번 갔던 정점이면 v.connectedVertices를 통해 이미 이 간선으로 왔는지 조사합니다.
  • 그리고 이전 정점과 다음 정점에 방문한 간선을 추가해 줍니다.

 

'BackEnd > 알고리즘 공부' 카테고리의 다른 글

백준 11000 강의실 배정 (JAVA)  (1) 2023.10.14
백준 1976 여행 가자 (JAVA)  (0) 2023.10.12
주식 가격 (프로그래머스) JAVA  (0) 2023.08.15
디펜스 게임 (프로그래머스) JAVA  (0) 2023.08.05
연속 펄스 부분 수열의 합 (프로그래머) JAVA  (0) 2023.08.01
'BackEnd/알고리즘 공부' 카테고리의 다른 글
  • 백준 11000 강의실 배정 (JAVA)
  • 백준 1976 여행 가자 (JAVA)
  • 주식 가격 (프로그래머스) JAVA
  • 디펜스 게임 (프로그래머스) JAVA
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    자동 배포
    상속
    완전탐색
    VPN
    쿼드 압축
    디팬스 게임
    유니온 파인드
    정렬
    이것이 자바다
    중첩 선언
    dp
    스프링 핵심 원리-기본편
    프로그래머스
    querydsl
    백트래킹
    다이나믹 프로그래밍
    자바
    네트워크 기본 용어
    linux
    조합
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
방의 개수 (프로그래머스) JAVA
상단으로

티스토리툴바