728x90

https://www.acmicpc.net/problem/10773

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net

 

 

풀이)

import java.util.ArrayDeque;
import java.util.Scanner;

public class Main_BJ_10773_제로 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        ArrayDeque<Integer> q = new ArrayDeque<>();
        for(int i=0; i<k; i++){
            int n = sc.nextInt();
            if(n!=0)
                q.offer(n);
            else
                q.pollLast();
        }
        int ans = 0;
        while(!q.isEmpty()){
            ans+= q.poll();
        }
        System.out.println(ans);
    }//main

}

queue는 First In First Out 자료구조이므로 ArrayDeque를 이용해서 풀이했다.

ArrayDeque는 양 옆으로 자료를 넣고, 뺄 수 있으므로 편리함!!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 12851 숨바꼭질2(JAVA)  (0) 2023.04.25
백준 10807 개수 세기(JAVA)  (0) 2023.04.23
백준 2583 영역 구하기(JAVA)  (0) 2023.04.20
백준 10951 A+B - 4(JAVA)  (0) 2023.04.18
백준 2468 안전 영역(JAVA)  (0) 2023.04.12
728x90

https://www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main_BJ_2583_영역구하기 {
    static int n, m, sum;
    static int[][] map;
    static boolean[][] visited;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static ArrayList<Integer> areas = new ArrayList<>();
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        map = new int[n][m];
        visited = new boolean[n][m];
        for(int i=0; i<k; i++){
            st = new StringTokenizer(br.readLine());
            int ly = Integer.parseInt(st.nextToken());
            int lx = Integer.parseInt(st.nextToken());
            int ry = Integer.parseInt(st.nextToken());
            int rx = Integer.parseInt(st.nextToken());
            for(int x=lx; x<rx; x++){
                for(int y=ly; y<ry; y++){
                    visited[x][y] = true;
                    map[x][y]++;
                }
            }
        }//k

        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(!visited[i][j]) {
                    int area = bfs(i, j);
                    sum++;
                    areas.add(area);
                }
            }
        }
        System.out.println(sum);
        Collections.sort(areas);
        for(int i=0; i<areas.size(); i++)
            System.out.print(areas.get(i)+" ");

    }//main
    private static int bfs(int x, int y){
        int area = 0;
        visited[x][y] = true;
        Queue<int[]> q = new ArrayDeque<>();
        q.offer(new int[] {x, y});

        while(!q.isEmpty()){
            int[] cur = q.poll();
            area++;
            for(int i=0; i<4; i++){
                int nx = cur[0] + dx[i];
                int ny = cur[1] + dy[i];

                if(check(nx, ny) && !visited[nx][ny]){
                    q.offer(new int[] {nx, ny});
                    visited[nx][ny] = true;
                }
            }
        }//while
        return area;
    }//bfs
    private static boolean check(int x, int y) {
        if(x<0 || y<0 || x>=n || y>=m)
            return false;
        return true;
    }
}

만약, 완탐과 dfs, bfs 문제를 많이 풀어봤다면 문제 자체는 어렵지 않다!

다만,,,, 조건을 좀 많이 주의해야해서...ㅎ

 

처음에는 너무 단순히 아래를 0,0 을 잡았다해서 위 아래만 바뀐거라 괜찮아~~ 했는데,,

1. 행과 열이 바뀌어 있는 문제입니다....

2. 최소 좌표와 최대 좌표가 있는데, 최대 좌표를 -1 만큼 탐색하면 일반 탐색과 다를 것이 없습니다.

 

나머지는 입력을 받으면서 직사각형을 그린 영역을 visited 처리해주고,

전체 완탐을 하면서 visited 안 한 곳을 찾아주면 된다!

 

bfs를 통해 visited가 아닌 곳의 영역 수를 구하면 되고, 이는 bfs의 return값을 이용하여 영역을 저장해준다.

그리고 areas라는 ArrayList 배열을 정렬하면 끝!!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 10807 개수 세기(JAVA)  (0) 2023.04.23
백준 10773 제로(JAVA)  (0) 2023.04.21
백준 10951 A+B - 4(JAVA)  (0) 2023.04.18
백준 2468 안전 영역(JAVA)  (0) 2023.04.12
백준 1715 카드 정렬하기(JAVA)  (0) 2023.04.11
728x90

https://www.acmicpc.net/problem/10951

 

10951번: A+B - 4

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_BJ_틀 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        String str;
        while((str=br.readLine())!=null){
            st = new StringTokenizer(str);
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            sb.append(a+b).append("\n");
        }
        System.out.println(sb);
    }
}

입력을 그냥 끝까지 받아야 할 때 어떻게 해야할지 잘 몰라서 검색했다.(이전에 이와 관련된 문제 올린듯..)

BufferedReader일 경우엔 문자열을 입력받을때, 존재하지 않는다면 null을 리턴하기 때문에 null인지 아닌지 확인하면 된다.

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 10773 제로(JAVA)  (0) 2023.04.21
백준 2583 영역 구하기(JAVA)  (0) 2023.04.20
백준 2468 안전 영역(JAVA)  (0) 2023.04.12
백준 1715 카드 정렬하기(JAVA)  (0) 2023.04.11
백준 10844 쉬운 계단 수(JAVA)  (0) 2023.04.06
728x90

https://www.acmicpc.net/problem/2468

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_BJ_2468_안전영역 {
    static int[][] map;
    static int low=Integer.MAX_VALUE;
    static int high=Integer.MIN_VALUE;
    static int n;
    static boolean[][] visited;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        map = new int[n][n];

        for(int i=0; i<n; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j=0; j<n; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
                low = Math.min(low, map[i][j]);
                high = Math.max(high, map[i][j]);
            }
        }


        int sum=1;
        for(int k = low; k<high; k++){
            visited = new boolean[n][n];
            int temp = 0;
            for(int i=0; i<n; i++){
                for(int j=0; j<n; j++){
                    if(!visited[i][j] && map[i][j]>k){
                        bfs(i, j, k);
                        temp++;
                    }
                    else if(!visited[i][j] && map[i][j]<=k)
                        visited[i][j] = true;
                }
            }
            if(sum <= temp) {
                sum = temp;
            }
        }

        System.out.println(sum);

    }//main
    private static void bfs(int x, int y, int level){
        Queue<int []> q = new ArrayDeque<>();
        visited[x][y] = true;
        q.offer(new int[] {x, y});

        while(!q.isEmpty()){
            int[] cur = q.poll();
            for(int i=0; i<4; i++){
                int nx = cur[0]+dx[i];
                int ny = cur[1]+dy[i];

                if(check(nx, ny) && map[nx][ny]>level && !visited[nx][ny]){
                    visited[nx][ny] = true;
                    q.offer(new int[] {nx, ny});
                }
            }

        }//while
    }//bfs
    private static boolean check(int x, int y){
        if(x<0 || y<0 || x>=n || y>=n)
            return false;
        return true;
    }//check
}

이 문제는 완탐과 bfs를 이용하면 간단한 문제다!!

전체 지도를 입력받고, bfs를 이용해서 잠기지 않은 부분을 탐색한다!

이때, visited 배열을 이용해서 방문 처리를 한다.(이때, 잠긴 부분도 방문 처리를 해야 편하다!)

 

먼저 맵에서 가장 작은 수위와 높은 수위를 체크한 후 for문을 돌린다.

그리고 전체 맵을 완전 탐색 하면서 방문하지 않았고, 잠기지 않으면 다시 bfs를 한다.

이때, bfs를 수행한다는 것은 적어도 하나의 잠기지 않은 땅이 생기는 것이므로 땅의 개수를 추가해주면 된다.

그리고 하나의 탐색이 끝날때마다 가장 큰 값으로 교체하면 끝!

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 2583 영역 구하기(JAVA)  (0) 2023.04.20
백준 10951 A+B - 4(JAVA)  (0) 2023.04.18
백준 1715 카드 정렬하기(JAVA)  (0) 2023.04.11
백준 10844 쉬운 계단 수(JAVA)  (0) 2023.04.06
백준 1946 신입 사원(JAVA)  (0) 2023.04.06
728x90

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

 

프로그래머스

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

programmers.co.kr

 

 

 

풀이)

import java.io.*;
import java.util.*;

class Solution {
    public int solution(int[][] sizes) {
        int maxX = 0;
        int maxY = 0;
        for(int i=0; i<sizes.length; i++){
            int x = Math.max(sizes[i][0], sizes[i][1]);
            int y = Math.min(sizes[i][0], sizes[i][1]);
            maxX = Math.max(x, maxX);
            maxY = Math.max(y, maxY);
        }
        
        
        int answer = maxX*maxY;
        return answer;
    }
}

처음에는 이걸 어떻게 기준을 삼고 어떻게 돌려야 할지 잘 모르겠어서 애먹었다.

(greedy처럼 해야할것 같은데... 어떻게 해야할지 고민했다)

 

그러다가 기준은 내가 정하면 된다는 것을 깨닫고....(검색했다ㅎㅎ)

가로와 세로를 그냥 내가 정해버리면 된다!!

나는 가로를 긴 길이로, 세로를 작은 길이로 해서 가로끼리, 세로끼리 비교하여 값을 구했다.

이러면 나름 간단해지는 문제!!

728x90

'코테 > 프로그래머스' 카테고리의 다른 글

프로그래머스 K번째수(JAVA)  (0) 2023.04.05
프로그래머스 체육복(JAVA)  (0) 2022.12.19
728x90

https://www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;

public class Main_BJ_1715_카드정렬하기 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for(int i=0; i<n; i++){
            pq.offer(Integer.parseInt(br.readLine()));
        }
        int max = 0;
        while(pq.size()>1){
            int a = pq.poll();
            int b = pq.poll();
            pq.offer(a+b);
            max += a+b;
        }
        System.out.println(max);

    }//main
}

해당 문제는 greedy로 해결할 수 있다.

 

1. 카드를 priority queue에 넣어두고 차례로 뽑는다.(자동으로 오름차순 정렬!)

2. 그 후 priority queue에서 두 개씩 뽑으며 수를 더하고, 다시 priority queue에 넣어둔다.(누적합이기 때문)

3. 이때, 뽑은 두 수를 더한 값을 계속 누적해서 더해줄 변수에 넣어둔다.

4. 이 수를 출력하면 끝!

 

사실 본격적으로 풀기 전에 어쩌다보니 푸는걸 얼핏 들은적이 있어서... 금방 풀었디만...

혼자 아이디어를 생각했을땐 조금 헷갈렸을 것 같기도 하다.

 

다른 골드 문제도 정복해 봐야징!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 10951 A+B - 4(JAVA)  (0) 2023.04.18
백준 2468 안전 영역(JAVA)  (0) 2023.04.12
백준 10844 쉬운 계단 수(JAVA)  (0) 2023.04.06
백준 1946 신입 사원(JAVA)  (0) 2023.04.06
백준 14503 로봇 청소기(JAVA)  (0) 2023.04.04
728x90

https://www.acmicpc.net/problem/10844

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

 

 

풀이)

import java.util.Scanner;

public class Main_BJ_10844_쉬운계단수 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // dp[i][j]: i번째 자리수가 j일 때 계단수 값
        long[][] dp = new long[n+1][10];
        long mod = 1000000000;

        // 첫 번째 자리수는 1개
        for(int i=1; i<10; i++){
            dp[1][i] = 1;
        }

        for(int i=2; i<=n; i++){
            for(int j=0; j<10; j++){
                if(j==9){
                    dp[i][9] = dp[i-1][8]%mod;
                }
                else if(j==0){
                    dp[i][0] = dp[i-1][1]%mod;
                }
                else
                    dp[i][j] = (dp[i-1][j-1]+dp[i-1][j+1])%mod;
            }//j
        }//i

        long ans = 0;
        for(int i=0; i<10; i++){
            ans += dp[n][i];
        }
        System.out.println(ans%mod);
    }//main
}

솔직히 일일히 찾아보다가 어떻게 표현해야할지 몰라서 찾아봤다.

내가 찾은 방식이랑 비슷한 아이디어였는데, 결국 0과 9를 제외하고는 양 옆을 탐색한다는 것이다.

 

따라서 2차원 배열을 선언하고, dp[i][j]라면 i번째 자리수가 j일때 계단수 값을 의미한다.

예를 들어,,,

3XX라면, 34X와 36X를 봐야하므로... dp[i][j] = dp[i-1][j-1]+dp[i-1][j+1]이 점화식이 됨을 확인할 수 있다.

 

또한!!

dp는 long으로 잡아야 하고, ans 또한 mod 값으로 나눠줘야 한다는 사실을 잊지 말자!

 

 

참고 블로그

https://code-lab1.tistory.com/108

 

[백준] 10844번 쉬운 계단 수 (자바 풀이)

문제 https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 풀이 이 문제는 다이나믹 프로그래밍을 이용해서 해결할 수 있다. T

code-lab1.tistory.com

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 2468 안전 영역(JAVA)  (0) 2023.04.12
백준 1715 카드 정렬하기(JAVA)  (0) 2023.04.11
백준 1946 신입 사원(JAVA)  (0) 2023.04.06
백준 14503 로봇 청소기(JAVA)  (0) 2023.04.04
백준 1245 농장 관리(JAVA)  (0) 2023.04.04
728x90

https://www.acmicpc.net/problem/1946

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main_BJ_1946_신입사원 {
    public static class person implements Comparable<person>{
        int paper;
        int interview;

        public person(int paper, int interview){
            this.paper = paper;
            this.interview = interview;
        }

        @Override
        public int compareTo(person p){
            return this.paper-p.paper;
        }
    }//person

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int t = Integer.parseInt(br.readLine());
        for(int tc = 0; tc<t; tc++){
            int n = Integer.parseInt(br.readLine());
            ArrayList<person> arr = new ArrayList<>();
            for(int i=0; i<n; i++){
                StringTokenizer st = new StringTokenizer(br.readLine());
                arr.add(new person(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
            }
            Collections.sort(arr);

            // 이미 오름차순 정렬을 했기 때문에, 마지막으로 합격한 사람보다 인터뷰 순위가 작으면 무조건 합격!
            // 서류는 이미 이전사람보다 클 것이고, 인터뷰 순위마저 큰다면 조건에 위배가 된다.

            int ans = 1;
            // 처음은 서류1등 인터뷰 성적
            int min = arr.get(0).interview;
            // 서류 2등 친구부터
            for(int i=1; i<arr.size(); i++){
                // 만약 기준 등수 보다 살펴보는 친구의 등수가 높다면? -> 선발
                // 가장 최근에 채용된 지원자의 면접 순위보다 높은 지원자 찾기
                if(arr.get(i).interview < min){
                    // 기준 등수 갱신
                    min = arr.get(i).interview;
                    // 선발
                    ans++;
                }
            }//for

            // 시간초과 나는 코드
//            for(int i=1; i<arr.size(); i++){
//                for(int j=0; j<i; j++){
//                    if(arr.get(i).interview < arr.get(j).interview){
//                        ans++;
//                        break;
//                    }
//                }
//            }//for
            sb.append(ans+"\n");
        }//tc
        System.out.print(sb);
    }//main
}

진짜 시간초과가 도저히 해결이 안 나서 여러 블로그를 읽어보고...

왜 저렇게 푸는지 생각한 것 같다.

 

일단... 절대절대 2중 for문 돌려서 해결할 생각 하지 말 것!!!!

시간초과가 난다...(N이 10만이라서 시간 초과 난다)

 

먼저, 서류 성적 순으로 정렬을 해준다!

Collections.sort는 NlogN으로 정렬을 해주기 때문에 시간초과 걱정은 할 필요 없다.

 

그리고 기준 변수를 정해주고, 확인하는 방식으로 해야한다.

이때, 변수란 마지막으로 합격한 사람의 인터뷰 성적이다.

 

이미 오름차순 정렬을 했기 때문에, 마지막으로 합격한 사람보다 인터뷰 순위가 작으면 무조건 합격!!!

서류는 이미 이전 사람보다 클 것이고(등수가 낮을 것이고), 인터뷰 순위마저 크다면 조건에 위배가 된다!

 

처음에는 이게 무슨소리인가... 했는데,,, 차근차근 보면 안다..

꼭 한 번 깊게 생각해보길ㅠㅠㅠ

 

어쨌든 이번 문제는,,, 실버1치고는 시간 초과 때문에 힘들었다...

문제 자체는 어렵지 않고, greedy로 할 수 있는 문제!

 

 

 

참고한 블로그...

https://dundung.tistory.com/69

 

백준 1946 신입 사원 Java

문제를 이해하는 것부터 나에겐 시간이 걸렸고 구현하는 데에도 여러 번의 시행착오를 겪었던 그리디 문제인 신입 사원이다. 흔히들 말하는 맞았는데 왜 틀리지.가 자동으로 연발됐던 문제였다

dundung.tistory.com

https://dy-coding.tistory.com/entry/%EB%B0%B1%EC%A4%80-1946%EB%B2%88-%EC%8B%A0%EC%9E%85-%EC%82%AC%EC%9B%90-java

 

백준 1946번 : 신입 사원 java

이 문제는 정렬을 이용하여 신입 사원을 뽑는 문제입니다. 이 문제에서 신입 사원을 뽑는 기준은 서류, 면접 등수가 둘 다 다른 지원자보다 낮은 사람은 뽑지 않는 것입니다. 이때 신입 사원이

dy-coding.tistory.com

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1715 카드 정렬하기(JAVA)  (0) 2023.04.11
백준 10844 쉬운 계단 수(JAVA)  (0) 2023.04.06
백준 14503 로봇 청소기(JAVA)  (0) 2023.04.04
백준 1245 농장 관리(JAVA)  (0) 2023.04.04
백준 15903 카드 합체 놀이(JAVA)  (0) 2023.04.03
728x90

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

 

프로그래머스

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

programmers.co.kr

 

 

풀이)

import java.io.*;
import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        for(int i=0; i<commands.length; i++){
            ArrayList<Integer> arr = new ArrayList<>();
            int start = commands[i][0]-1;
            int end = commands[i][1]-1;
            int find = commands[i][2]-1;

            for(int idx=start; idx<=end; idx++){
                arr.add(array[idx]);
            }
            Collections.sort(arr);
            answer[i] = arr.get(find);
        }
        
        return answer;
    }// solution
}

 

범위에 맞춰서 list에 저장해주고 collections.sort를 사용했다.

다른 풀이를 보니, CopyOfRange도 있더라!!

 

for(int i=0; i<commands.length; i++){
            int[] temp = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);
            Arrays.sort(temp);
            answer[i] = temp[commands[i][2]-1];
        }

이렇게 활용할 수도 있다는 것!!

 

정렬 기초문제!!

728x90

'코테 > 프로그래머스' 카테고리의 다른 글

프로그래머스 최소직사각형(JAVA)  (0) 2023.04.12
프로그래머스 체육복(JAVA)  (0) 2022.12.19
728x90

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

 

 

 

풀이)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_BJ_14503_로봇청소기 {
    static int n, m, ans;
    static int[][] map;
    // 상하좌우
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        map = new int[n][m];

        st = new StringTokenizer(br.readLine());
        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken());

        for(int i=0; i<n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<m; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        simulation(r, c, d);
        System.out.println(ans);
    }//main
    private static void simulation(int r, int c, int d){
        int x = r;
        int y = c;
        int dir = d;

        while(true){
            boolean flag = false;
            if(map[x][y] == 0) {
                //현재 칸 청소
                map[x][y] = 2;
                ans++;
            }

            //주변 살펴보기
            for(int i=0; i<4; i++){
                int nx = x + dx[i];
                int ny = y + dy[i];

                // 청소되지 않은 칸이 있는 경우
                if(check(nx, ny) && map[nx][ny] == 0){
                    // 반시계 방향으로 회전
                    dir--;
                    if(dir < 0)
                        dir = 3;
                    flag = true;
                    break;
                }
            }//for

            //주변 청소되지 않은 칸이 있을 때
            if(flag){
                // 앞쪽 칸이 청소되지 않았을 때
                int[] next = front(x, y, dir);
                if(check(next[0], next[1]) && map[next[0]][next[1]] == 0) {
                    //전진
                    x = next[0];
                    y = next[1];
                }
            }

            // 주변 4칸 중 청소되지 않은 빈 칸이 없을 때
            else {
                int[] next = back(x, y, dir);
                //한 칸 후진할 수 있으면
                if(check(next[0], next[1])){
                    x = next[0];
                    y = next[1];
                }

                //없으면 탈출
                else
                    break;
            }
        }//while
    }//simulation
    private static boolean check(int x, int y){
        if(x<0 || y<0 || x>=n || y>=m || map[x][y] == 1)
            return false;
        return true;
    }//check

    private static int[] front(int x, int y, int dir){
        switch (dir) {
            case 0: {//북
                int nx = x - 1;
                return new int[]{nx, y, dir};
            }

            case 1: { //동
                int ny = y + 1;
                return new int[]{x, ny, dir};
            }

            case 2: {//남
                int nx = x + 1;
                return new int[]{nx, y, dir};
            }

            case 3: { //서
                int ny = y - 1;
                return new int[] {x, ny, dir};
            }
        }//switch
        //아무것도 아닐 때
        return new int[] {-1, -1, -1};
    }//front
    private static int[] back(int x, int y, int dir){
        switch (dir) {
            case 0: {//북
                int nx = x + 1;
                return new int[]{nx, y, dir};
            }

            case 1: { //동
                int ny = y - 1;
                return new int[]{x, ny, dir};
            }
            case 2: {//남
                int nx = x - 1;
                return new int[]{nx, y, dir};
            }

            case 3: { //서
                int ny = y + 1;
                return new int[] {x, ny, dir};
            }
        }//switch
        //아무것도 아닐 때
        return new int[] {-1, -1, -1};
    }//back
}

골드5 치고는 살짝 쉬운 편이라고 생각한다!

말 그대로 열심히 구현하면 되는 문제였다.

 

다만,,, 문제가 좀 읽기 힘드니 2번 밑에 1이 나올경우 2-1, 2-2..

이런 식으로 유동적으로 읽기를 바란다..

 

또한,,,, 조건을 잘 읽기!!! 1이 벽이라는 사실을 나는 왜 못본거지!!!!!

눈을 뜨자~~~~

 

그것만 뺀다면 순서대로 구현한다면 어렵지 않게 구현했을 문제였다!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 10844 쉬운 계단 수(JAVA)  (0) 2023.04.06
백준 1946 신입 사원(JAVA)  (0) 2023.04.06
백준 1245 농장 관리(JAVA)  (0) 2023.04.04
백준 15903 카드 합체 놀이(JAVA)  (0) 2023.04.03
백준 2217 로프(JAVA)  (0) 2023.04.02

+ Recent posts