| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
- 딥러닝
 - 알고리즘
 - 티스토리챌린지
 - heapq
 - 백준
 - 자바스크립트
 - 탐욕법
 - 현대
 - 파이썬
 - Algorithm
 - 토이프로젝트
 - softeer
 - JavaScript
 - Baekjoon
 - alogorithm
 - cs공부
 - GAN
 - Python
 - cim
 - re_lunchu
 - boj
 - 프로그래머스
 - 현대자동차
 - 힙큐
 - 스마트팩토리
 - 오블완
 - 자바
 - programmers
 - Java
 - 소프티어
 
- Today
 
- Total
 
eaz_coding
[Programmers] 무인도 여행(Python, Java, JavaScript) 본문
문제
요약
각 칸마다의 머무를 수 있는 날짜가 적힌 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];
    }
}'eaz_algorithm' 카테고리의 다른 글
| [Programmers] 괄호 변환(Javascript) (0) | 2024.06.05 | 
|---|---|
| [Programmers] 줄 서는 방법(JavaScript) (0) | 2024.06.05 | 
| [Programmers] 방금그곡 (Python, Java) (1) | 2024.06.03 | 
| [Programmers] 배달(Python, Java) (0) | 2024.06.03 | 
| [Programmers] 시소 짝꿍(Python, Java) (0) | 2024.05.30 |