2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

<내 코드>

 

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
        int sum = 0;
        int[] nums = new int[9];
        boolean ck = false;
        
        // 입력
        Scanner sc = new Scanner(System.in);
        for(int i=0; i<9; i++) {
        	int n = sc.nextInt();
        	nums[i] = n;
        	sum += n;
        }
        
        for(int i=0; i < 9; i++) {
        	for(int j=0; j < 9; j++) {
        		if (ck) break;
        		if(i==j) continue;
        		
        		if(sum - nums[i] - nums[j] == 100) {
        			nums[i] = 0;
        			nums[j] = 0;
        			ck = true;
        			break;
        		}
        	}
        }
        
        Arrays.sort(nums);
        for(int i=0; i < 9; i++) {
        	if (nums[i] != 0) {
        		System.out.println(nums[i]);
        	}
        }

	}
}

 

반응형

 

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

 

<내 코드>

 

import copy
heights = [int(input()) for _ in range(9)]

for i in range(8):
    tmp = copy.deepcopy(heights)
    tmp[i] = 0
    for j in range(i+1, 9):
        tmp_num = tmp[j]
        tmp[j] = 0
        if(sum(tmp) == 100):
            ans = tmp
            break
        tmp[j] = tmp_num
ans.sort()
for i in ans:
    if i != 0:
        print(i)

 

얇은 복사와 깊은 복사의 차이를 알 수 있는 문제였다. 일반 copy는 외부적으로는 다른 객체가 생성되나 내부 요소에는 결국 같은 객체를 가리키고 있다는 것을 알았다. 이것을 방지하기 위해 deepcopy를 해주면 외, 내부 모두 다른 새로운 객체로 만들 수 있다.

반응형

 

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 ��

programmers.co.kr

 

 

<내 코드>

 

- Java

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        List<Integer> temp = new ArrayList<>();
        List<Integer> result = new ArrayList<>();
        
        for(int i=0; i < progresses.length; i++){
            if((100-progresses[i]) % speeds[i] == 0){
                temp.add((100-progresses[i]) / speeds[i]);
            }else{
                temp.add(((100-progresses[i]) / speeds[i]) + 1);
            }
        }
        
        // 리스트 temp를 비교해 배포마다 몇 개씩 되는지 
        int cnt = 1;
        int ck = temp.get(0);
        for(int j=1; j < temp.size(); j++){
            if(ck >= temp.get(j)){
                cnt += 1;
            }else{
                result.add(cnt);
                ck = temp.get(j);
                cnt = 1;
            }
            
            if(j == (temp.size()-1)){
                result.add(cnt);
            }
        }
        
        // 리스트를 배열로 바꿔 출력
        int[] answer = new int[result.size()];
        for(int i=0; i<result.size(); i++){
            answer[i] = result.get(i);
        }

        return answer;
    }
}

 

- Python

def solution(progresses, speeds):
    answer = []
    temp = []

    for i in range(len(progresses)):
        days = (100 - progresses[i]) % speeds[i]
        if (days) == 0:
            temp.append((100 - progresses[i]) // speeds[i])
        else:
            temp.append((100 - progresses[i]) // speeds[i] + 1)

    ck = temp[0]
    cnt = 1
    for i in range(1, len(temp)):
        if ck >= temp[i]:
            cnt += 1
        else:
            ck = temp[i]
            answer.append(cnt)
            cnt = 1
            
        if i == (len(temp)-1):
            answer.append(cnt)

    return answer
반응형

 

 

코딩테스트 연습 - 주식가격

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,00

programmers.co.kr

 

 

<내 코드>

 

class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        
        for(int i=0; i<prices.length; i++){
            for(int j=i+1; j< prices.length; j++){
                if (prices[i] > prices[j]) {
                    answer[i] = j-i;
                    break;
                }
                if(j == prices.length-1){ // 마지막 요소 확인
                    answer[i] = j-i;
                }
            }
        } 
        return answer;
    }
}

 

def solution(prices):
    answer = []
    
    n = len(prices)
    for i in range(n): #0~4
        cnt = 0
        if i == n-1:
            answer.append(cnt)
            break
        for j in range(i+1,n): #1~4
            if prices[i] <= prices[j]:
                cnt += 1
            else:
                cnt += 1
                break
        answer.append(cnt)
    
    return answer
반응형

 

 

10818번: 최소, 최대

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

 

<내 코드>

 

import java.util.Arrays;
import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in); 
		
		
		int N = in.nextInt(); //정수형 입력값
		int[] arr = new int[N];
		
		for(int i=0; i<N; i++) {
			arr[i] = in.nextInt(); //정수형 입력값
		}
		
		in.close(); // scanner 사용시 닫아줘야 에러 방지(필수는 아니지만)
		Arrays.sort(arr); // 배열 정렬
		System.out.println(arr[0] + " "+arr[N-1]);
	}
}

 

Arrays.sort(배열) : 배열을 오름차순(기본) 정렬한다. 

Arrays.sort(배열, start, end) : 배열 [start~end-1] 까지 정렬한다.

 

반응형

 

 

1026번: 보물

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거�

www.acmicpc.net

 

 

<내 코드>

 

N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

A.sort()
B.sort(reverse=True)

num = 0
for i in range(N):
    num += A[i]*B[i]

print(num)
반응형

 

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. ��

www.acmicpc.net

 

<내 코드>

 

N, M = map(int, input().split())

n_p = [input() for _ in range(N)]
m_p = [input() for _ in range(M)]

# 교집합
result = list(set(n_p) & set(m_p))

print(len(result))
for i in sorted(result):
    print(i)

 

집합 자료형의 교집합 성질을 이용해 두 리스트의 공통 요소를 찾는다.

 

교집합 - '&'

합집합 - ' | '

차집합 - ' - '

반응형

 

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

 

<내 코드>

 

N = int(input())
cards = list(map(int, input().split()))
M = int(input())
nums = list(map(int, input().split()))

cards.sort()


for i in range(M):
    low, high = 0, N-1
    while low <= high:
        mid = (low + high) // 2
        if cards[mid] == nums[i]:
            print(1, end=" ")
            break
        elif cards[mid] < nums[i]:
            low = mid + 1
        else:
            high = mid - 1

        if low > high:
            print(0, end=" ")
            break

처음에 데이터 양을 생각하지 못하고 브루트포스처럼 풀었었다..

정렬된 리스트를 이분탐색으로 범위를 줄여나가면 많은 데이터에서 빠른 시간에 탐색이 가능하다.

반응형

+ Recent posts