반응형

무인도 여행 문제

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

 

프로그래머스

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

programmers.co.kr

 

핵심 내용

지도를 나타내는 문자열 배열 maps가 매개변수로 주어질 때, 각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담아 return 하는 solution 함수를 완성해주세요. 만약 지낼 수 있는 무인도가 없다면 -1을 배열에 담아 return 해주세요.

 

코드 및 분석(다른 분의 코드)

*주석은 해당 코드 위에 적는 방식으로 적겠습니다.

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

class Solution {
    static int sum=0;
    
    public int[] solution(String[] maps) {
        List<Integer> list = new ArrayList<>();
        
        # 방문한 node를 기록할 객체 생성합니다.
        boolean[][] visited = new boolean[maps.length][maps[0].length()];
        
        # maps의 길이만큰 돌도록 for문 돌립니다.
        for(int i=0; i<maps.length; i++) {
        	for(int j=0; j<maps[i].length(); j++) {
        		
                node마다 dfs 함수를 실행합니다.
                dfs(maps, visited, i, j);
        		if(sum>0) {
        			list.add(sum);
        			sum=0;
        		}
        	}
        }
        
        # 조건 중 list가 0이면 -1 값을 return 합니다.
        if(list.size()==0) return new int[] {-1};
        
        int[] answer = new int[list.size()];
        for(int i=0; i<answer.length; i++) {
        	answer[i]=list.get(i);
        }
        
        # 배열을 오름차순으로 바꿔줍니다.
        Arrays.sort(answer);
        return answer;
    }
    
    public void dfs(String[] maps, boolean[][] visited, int i, int j) {
    	# 인덱스 값이 0 아래이거나 maps의 길이보다 크면 안되기 때문에 체크를 합니다.
        if(i<0 || j<0 || i>=maps.length || j>=maps[0].length()) return;
        
        # 2번째 조건으로 'X'이거나 벌써 사용한 node인지 체크 합니다.
    	if(maps[i].charAt(j) == 'X' || visited[i][j]) return;
    	else {
        	# visited[i][j] 값을 true로 바꿔줍니다.
    		visited[i][j]=true;
            # Ascii code를 사용해서 int로 형변환합니다. '0'의 아스키코드는 48입니다.
    		sum+=maps[i].charAt(j)-'0';
    	}
        
        # i와 j 전체를 탐색하도록 dfs를 호출해줍니다.
    	dfs(maps, visited, i+1, j);
    	dfs(maps, visited, i-1, j);
    	dfs(maps, visited, i, j+1);
    	dfs(maps, visited, i, j-1);
    }
}
반응형
반응형
반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제

배열로 받은 숫자 중 3가지를 더하거나 뺴서 숫자 0을 만들수 있는 방법을 총합해서 reuturn하면 됩니다.

 

코드

1. 제가 푼 for문 여러번 충첩하는 것보다 다른 분의 코드가 훨씬 복잡하지 않고 간결해서 가져왔습니다.

from itertools import combinations

def solution(number):    
    cnt = 0
    for i in combinations(number,3) :
        if sum(i) == 0 :
            cnt += 1
    return cnt

* combinations(list,number)

위와 같이 함수를 사용하면 list 내의 원소 중 number개를 뽑아 조합을 만들어서 return 해줍니다.

예를 들어 list = [1, 2, 3], number = 2인 경우 (1, 2), (1, 3), (2, 3)이 반환됩니다.

반응형
반응형
반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제

최대공약수와 최소공배수를 구해서 reutnr 하면 됩니다.

 

코드

1. math import 해서 풀어봤습니다.

import math

def solution(n, m):
    answer = [math.gcd(n, m), (n * m) // math.gcd(n, m)]
    return answer

- math.gcd()는 최대 공약수를 구해줍니다.

- math 사용하지 않고 푸는 방법도 있습니다.

def solution(n, m):
    # 최대공약수
    for i in range(min(n,m),0,-1): 
        if n%i ==0 and m%i==0:
            answer.append(i)
            break

    # 최소공배수
    for i in range(max(n,m),n*m+1)
        if i%n == 0 and i%m == 0:
            answer.append(i)
            break
            
    return answer
반응형
반응형
반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제

numbers, target 값을 파라미터로 받아 numbers 값들을 +, - 로 두었을 때 target 값이 몇개가 나오는지 구하는 문제입니다.

 

코드

1. dfs 문제 해결은 이해하면 쉽지만, 이해가 되지 않으면 어렵습니다. 그리고 자세하게 설명하지 않으면 알기 어렵기 때문에 다른 사람이 잘 적은 코드를 가져왔습니다.

def solution(numbers, target):
    global count # 전역변수
    count = 0
    dfs(0,0, numbers, target)
    
    return count

def dfs(idx, value, numbers, target):
    global count 
    length = len(numbers)
    
    if idx == length:
        if value == target:
            count+= 1
        return 

    dfs(idx+1, value + numbers[idx],numbers, target)
    dfs(idx+1, value - numbers[idx],numbers, target)

* global 전역변수

 

반응형
반응형
반응형

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

 

프로그래머스

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

programmers.co.kr

문제

두 행렬의 같은 행, 같은 열의 값을 서로 더한 값을 return 하면 됩니다.

 

코드

1. zip() 함수와 for문을 사용해서 배열 안에 있는 값을 꺼내 더한 후 배열 [] 안에 다시 넣어주고 return 헀습니다.

def solution(arr1, arr2):
    return [[x + y for x, y in zip(_arr1, _arr2)] for _arr1, _arr2 in zip(arr1, arr2)]

반응형
반응형
반응형

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

 

프로그래머스

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

programmers.co.kr

문제

파라미터 s가 4, 6개야 하며, 문자가 있으면 False return, 없고 숫자만 있으면 True를 return 하면 됩니다.

 

코드

1. try except을 사용해 문자열 중 int()화 하지 못하면 False로 return 하도록 코딩을 써봤는데 테스트 5, 6, 28, 29에서 실패했습니다.

def solution(s):
    answer = True
    if len(s) not in (4, 6):
    	return False
        
    for i in range(len(s)):
        try:
            int(s[i])
        except:
            answer = False
    return answer

 

2. 좀 더 생각해보니 파이썬 isdigit() 함수를 사용할 수 있어서 사용했습니다.

def solution(s):
    return len(s) in (4, 6) and s.isdigit()

반응형
반응형
반응형

문제

파라미터 n이라는 자연수를 받으면 그 숫자만큼 '수'와 '박'을 번갈아 가면서 적은 문자열을 return하면 됩니다.

 

코드

1. for 과 if

def solution(n):
    answer = ''
    for i in range(n):
        if i%2 == 0:
            answer = answer + '수'
        else:
            answer = answer + '박'
    
    return answer

 

2. 정말 완벽하게 문제를  이해하고 푼 코드입니다.

def water_melon(n):
    str = "수박"*n
    return str[:n]

 

반응형
반응형

 

문제

문자열을 파라미터로 받으면 그 문자열 중간에 있는 글자를 가져와 return하면 됩니다.

만약 문자열이 짝수면 중간에 있는 2개의 글자를 return하면 됩니다.

 

코드

1. math import 해서 푸는 방법입니다.

import math
def solution(s):
    answer = ''
    i = int(len(s) / 2)
    if len(s) % 2 == 0:
        answer = s[i-1] + s[i]
    else:
        answer = s[i]
    return answer

 

2. 다른 분의 코드

def string_middle(str):
    a = len(str)
    if a % 2 == 0 :
        a = (a-2) / 2
    else :
        a = (a-1) / 2
    return str[int(a) : -int(a)]

 

3. 다른 분의 코드

def string_middle(str):
    return str[(len(str)-1)//2 : len(str)//2 + 1]
반응형

+ Recent posts