반응형

무인도 여행 문제

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/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/138476

 

프로그래머스

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

programmers.co.kr

 

문제

귤의 개수와 귤의 크기를 받아 같은 크기의 귤을 개수만큼 리턴할 때 가작 적은 숫자 구하시오. 

 

시도

- 귤의 개수가 1개면 1을 바로 리턴합니다.

- 귤의 크기 배열 값의 같은 값을 몇개씩 가지고 있는지 구합니다.

- 가장 많이 같은 값을 가지고 있는 순서대고 정리를 합니다.

 

코드

1. 첫 번째 시도

import time
def solution(k, tangerine):
    if k == 1: return 1

    answer = 0
    st = time.time()
    
    counter = [0] * len(set(tangerine))
    for x in tangerine:
    	try: counter[x-1] += 1
    	except: counter[x-1] = 1
    
    counter.sort(reverse=True)
    
    for x in counter:
        answer += 1
        k = k - x
        if k <= 0:
            break
    
    end = time.time()
    print(f'time = {st - end}')
    return answer

런타임 에러가 발생했습니다.

 

2.  런타임 에러 해결 후 코드

def solution(k, tangerine):
    if k == 1: return 1
    answer = 0
    
    counter = [0] * max(tangerine)
    for x in tangerine:
    	try: counter[x-1] += 1
    	except: counter[x-1] = 1
    
    counter.sort(reverse=True)
    
    for x in counter:
        answer += 1
        k = k - x
        if k <= 0:
            break
    return answer

 

 

반응형
반응형
반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제

문자열로 된 숫자에서 최소값과 최대값을 구한 후 문자열로 return.

(자세한 내용은 상단 프로그래머스 사이트에서 확인!)

 

시도

1. split(" ") 사용하여 문자열 값을 나눕니다.

2. map()을 통해 문자열을 정수 값으로 변경합니다.

3. map()을 사용 후 min()과 max() 사용하여 return 할려고 했지만 에러가 발생했습니다.

* ValueError: max() arg is an empty sequence

4.map()을 값을 다시 list() 함수를 사용하여 리스트 형태로 만들어 준 후 min()과 max() 값을 사용하여 결과 값을 return 했습니다.

 

알아야할 것

- split()

- map()

- list()

 

정답

def solution(x):
    arr = list(map(int, x.split()))
    return str(min(arr)) + " " + str(max(arr))
반응형
반응형
반응형

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

 

프로그래머스

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

programmers.co.kr

 

 

문제

폭격 미상일을 요격할 때, 최소한으로 요격 미사일 수를 구해서 return 합니다.

(자세한 내용은 상단 프로그래머스 사이트에서 확인!)

 

주의사항

1. 단, 개구간로 표현되는 폭격 미사일은 s와 e에서 발사하는 요격 미사일로는 요격할 수 없습니다.

 

시도

1. defense 값 설정합니다.

2. sort()를 사용합니다.

* sort() 함수에서 reverse=True로 설정해도 시간이 느려지지 않습니다.

3. 배열의 [1] 값과 defense 값을 비교한 후 만약 defense 값이 크면 defense 값을 배열[0]의 값과 0.5를 더해 defense 값을 수정해줍니다.

* 0.5를 더한 이유는 s, e 구간에서는 요격할 수 없기 때문입니다.

 

알아야할 것

- sort(): 파이썬 정렬 함수입니다

 

정답

def solution(targets):
    answer, defense = 0, 100000001
    
    for s, e in sorted(targets, reverse=True):
        if e <= defense:
            defense = s + .5
            answer += 1

    return answer

걸린 시간: 4.291534423828125e-06

반응형

+ Recent posts