eaz_coding

[Programmers] 무인도 여행(Python, Java, JavaScript) 본문

eaz_algorithm

[Programmers] 무인도 여행(Python, Java, JavaScript)

eaz_silver 2024. 6. 5. 09:12

문제

요약

각 칸마다의 머무를 수 있는 날짜가 적힌 maps가 주어질 때, 무인도에서 머무를 수 있는 최대 기간 오름차순으로 구해라.

없으면 [-1] 반환.

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/154540?language=python3

 

프로그래머스

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

programmers.co.kr

 


풀이

Python

def solution(maps):
    answer = []
    n, m = len(maps), len(maps[0])
    visited = [[0]*m for _ in range(n)]
    directions = [(-1,0), (1,0), (0,-1), (0,1)]
    stack = []
    
    for i in range(n):
        for j in range(m):
            if maps[i][j] != "X" and visited[i][j] == 0:
                visited[i][j] = 1
                stack.append((i, j))
                t = int(maps[i][j])
                
                while stack:
                    x, y = stack.pop()
                    for dx, dy in directions:
                        nx, ny = x+dx, y+dy
                        if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and maps[nx][ny] != "X":
                            stack.append((nx, ny))
                            visited[nx][ny] = 1
                            t += int(maps[nx][ny])
                
                answer.append(t)
    answer.sort()              
    return answer if answer else [-1]

 

Java

1. 배열 길이는 .length로 속성으로 가져오지만, 문자열 길이는 .length()로 가져온다.

2. 자바는 Stack을 제공하기 때문에 배열이 아니라 Stack을 사용하면 된다.

3. substring을 이용한 슬라이싱을 해서 문자열로 비교하면 ==, != 비교가 아니라 equals를 이용한 비교를 해야 한다.

4. Integer.parseInt말고 character에서 숫자로 바꾸는 것은 Character.getNumericValue(

import java.util.*;

class Solution {
    public ArrayList<Integer> solution(String[] maps) {
        ArrayList<Integer> answer = new ArrayList<Integer>();
        int n = maps.length;
        int m = maps[0].length();
        int[] dx = {-1, 1, 0, 0};
        int[] dy = {0, 0, -1, 1};
        
        int[][] visited = new int[n][m];
        for (int i = 0; i < n; i++) {
            Arrays.fill(visited[i], 0);
        }
        
        Stack<int[]> stack = new Stack<>();
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                
                if (maps[i].charAt(j) != 'X' && visited[i][j] == 0) {
                    stack.push(new int[]{i, j});
                    visited[i][j] = 1;
                    int t = Character.getNumericValue(maps[i].charAt(j));
                    
                    while (!stack.isEmpty()) {
                        int[] popped = stack.pop();
                        
                        for (int k = 0; k < 4; k++) {
                            int nx = popped[0] + dx[k];
                            int ny = popped[1] + dy[k];
                            if (0 <= nx && nx < n && 0 <= ny && ny < m && visited[nx][ny] == 0 && maps[nx].charAt(ny) != 'X') {
                                stack.push(new int[]{nx, ny});
                                visited[nx][ny] = 1;
                                t += Character.getNumericValue(maps[nx].charAt(ny));
                            }
                        }       
                    }
                    answer.add(t);
                }
            }
        }

        if (answer.isEmpty()) {
            ArrayList<Integer> result = new ArrayList<>();
            result.add(-1);
            return result;
        } else {
            Collections.sort(answer);
            return answer;            
        }
    }
}

 

JavaScript

갑작스레 자바스크립트 코테를 보게 되어서 자바스크립트로 문제 풀기

새로 알게 된 것

1. 여러개 함수 한번에 선언하는 법

2. 2차원 배열 만드는 방법 Array.from(Array(n), () => Array(m).fill(0)); (중요! 꼭 외울것)

3. 문자열 to 숫자 : parseInt, Number

4. Stack 구현은 리스트에서 push, pop으로 가능/ Queue는 리스트에서 push, unshift로 가능

5. Sort 사용할 때, 값 비교할 수 있도록 .sort((a, b) => a-b); 필요. 내림차순은 b-a

function solution(maps) {
    let answer = [];
    const [n, m] = [maps.length, maps[0].length];
    
    let visited = Array.from(Array(n), () => Array(m).fill(0));
    const directions = [[-1,0], [1, 0], [0, -1], [0, 1]];
    let stack = [];
    
    for (let i = 0; i < n; i++){
        for (let j = 0; j < m; j++){
            if (maps[i][j] !== "X" && !visited[i][j]){
                stack.push([i, j]);
                visited[i][j] = 1;
                let t = parseInt(maps[i][j]);
                
                while (stack.length) {
                    const p = stack.pop();
                    for (let k =0; k<4; k++){
                        const nx = p[0] + directions[k][0];
                        const ny = p[1] + directions[k][1];
                        
                        if (0 <= nx && nx < n && 0 <= ny && ny < m && maps[nx][ny] !== "X" && !visited[nx][ny]){
                            stack.push([nx, ny]);
                            visited[nx][ny] = 1;
                            t += Number(maps[nx][ny]);
                        }
                    }
                }
                answer.push(t);
            }
        }
    }
    
    if (answer.length){
        return answer.sort((a, b) => a - b);
    } else {
        return [-1];
    }
}