반응형
반응형

Two Sum

https://leetcode.com/problems/two-sum/

 

Two Sum - LeetCode

Can you solve this real interview question? Two Sum - Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target. You may assume that each input would have exactly one solution, and you may not

leetcode.com

 

코드

import time
import datetime

def twoSum(nums, target):
    start = time.time()
    # filter를 통해 뒤에 오는 숫자가 많으면 제거 후 index() 값을 구하는게 빨라질꺼 같아서 적용해보았지만 
    # 주어진 nums 배열에서는 속도 차이가 없었습니다.
    # nums = list(filter(lambda x: x < target, nums))

    for i, num in enumerate(nums):
        n = target - num
        if n in nums[i + 1:]:
            # 걸린 시간: 0:00:00.000013
            # return [i, nums.index(n)]
            # 위에 코드는 Example 3에서 [3, 3] 배열에서 2번째 인덱스 값이 틀리게 계산됩니다.
            # 이유는 값은 값이 있을 때 index() 함수는 가장 먼저 같은 값으로 있는 index를 return 해주기 때문입니다.

            # 걸린 시간: 0:00:00.000013
            # 시간복잡도:O(n^2)
            # nums.index(n)으로 구한 것과 시간 차이가 없읍니다.
            # nums의 i + 1 부터 검색하여 n 숫자의 index를 구하고 i만큼 빼고 index를 구했으니 다시 i의 값을 더해줍니다.
            # 그리고 나서 i가 0일 수 있으니 1을 더해줍니다.
            return [i, nums[i + 1:].index(n) + i + 1]

    end = time.time()
    sec = (end - start)
    sec = datetime.timedelta(seconds=sec)
    print(sec)

nums = [2,7,11,15] 
target = 9
# nums = [3, 3]
# target = 6
twoSum(nums, target)

 

결과

 

다른 분의 코드

def twoSum_dict(nums, target):
    start = time.time()

    dict = {}
    for i, num in enumerate(nums):
        dict[num] = i

    #타겟에서 첫번째 수를 뺀 결과를 키로 조회
    for i, num in enumerate(nums):
        if target - num in dict and dict[target - num] != i:
            # 걸린시간: 0:00:00.000001
            # 시간복잡도:O(1)
            # print([i, dict[target - num]])
            # return [i, dict[target - num]]

    end = time.time()
    sec = (end - start)
    sec = datetime.timedelta(seconds=sec)
    print(sec)

시간복잡도가 o(1)로 되면서 속도가 엄청 빨라집니다.

 

추가적으로 공부할 부분

- array.index(x) 리스트에서 x의 인덱스 반환
- array.index(x, start) 리스트[start:]에서 x의 인덱스 반환
- array.index(x, start, stop) 리스트[start:stop]에서 x의 인덱스 반환

 

반응형
반응형

무인도 여행 문제

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]

 

반응형

+ Recent posts