반응형

좌표 정렬하기

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

 


알고리즘

N = int(input())
dot = []

for _ in range(N):
    x, y = map(int, input().split(" "))
    dot.append((x,y))
    
dot_sort = sorted(dot, key=lambda x : (x[0], x[1]))

for x,y in dot_sort:
    print(x,y)

 

 

반응형

'Algorithm Study > Baekjoon' 카테고리의 다른 글

2747.피보나치 수  (0) 2020.01.09
10989.수 정렬하기3  (0) 2020.01.09
10814.나이순 정렬  (0) 2020.01.09
1427. 소트인사이드  (0) 2020.01.05
2750. 수 정렬하기  (0) 2020.01.05
반응형

문제

배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.

입력

첫째 줄에 정렬하고자하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 자리수를 내림차순으로 정렬한 수를 출력한다.

예제 입력 1 복사

2143

예제 출력 1 복사

4321

 

알고리즘

메모리 29285KB

시간      64ms

코드길이 115B

array = input()
for i in range(9, -1, -1):
    for j in array:
        if int(j) == i:
            print(i, end='')
437239
974332

 

반응형

'Algorithm Study > Baekjoon' 카테고리의 다른 글

2747.피보나치 수  (0) 2020.01.09
10989.수 정렬하기3  (0) 2020.01.09
10814.나이순 정렬  (0) 2020.01.09
11650. 좌표 정렬하기  (0) 2020.01.07
2750. 수 정렬하기  (0) 2020.01.05
반응형
시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 46130 25876 18387 57.906%

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

입력

5 5 2 3 4 1

출력

1 2 3 4 5

 

 

알고리즘

메모리 : 29440KB

시간 : 172ms

언어 : python 3

코드 길이 302B

 

n = int(input())
array = list()

for _ in range(n):
    array.append(int(input()))

for i in range(n):
    lowest = i
    for j in range(i+1, n):
        if array[lowest] > array[j]:
            lowest = j
    array[i], array[lowest] = array[lowest], array[i]
    
for i in array:
    print(i)
        

 

반응형

'Algorithm Study > Baekjoon' 카테고리의 다른 글

2747.피보나치 수  (0) 2020.01.09
10989.수 정렬하기3  (0) 2020.01.09
10814.나이순 정렬  (0) 2020.01.09
11650. 좌표 정렬하기  (0) 2020.01.07
1427. 소트인사이드  (0) 2020.01.05
반응형

1. 삽입 정렬?

  • 삽입 정렬은 두 번째 인덱스부터 시작
  • 해당 인덱스(key 값) 앞에 있는 데이터(B)부터 비교해서 key 값이 더 작으면, B값을 뒤 인덱스로 복사
  • 이를 key 값이 더 큰 데이터를 만날때까지 반복, 그리고 큰 데이터를 만난 위치 바로 뒤에 key 값을 이동

2. 패턴 찾기

  • 처음은 항상 인덱스(0)+1 에서 시작
  • data_list = [9, 3, 2, 5]
    • 1회 : key 값 (9) , 인덱스(0) -1 보다 작으므로 => [9,3,2,5]
    • 2회 : key 값 (3) , key -1 값(9) 이 3보다 작으므로 => [3,9,2,5]
    • 3회 : key 값(2) , key -1 값(9) 보다 작고 -> key -2 값(2) 이 더 작으므로 => [2,3,9,5]
    • 4회 : key 값(5), 9보다 작고, 3보다 크므로 => [2,3,5,9]
1. for stand in range(len(data_list)) 로 반복
2. key = data_list[stand]
3. for num in range(stand, 0, -1) 반복
    - 내부 반복문 안에서 data_list[stand] < data_list[num - 1] 이면,
    - data_list[num - 1], data_list[num] = data_list[num], data_list[num - 1]

 

3. 알고리즘

def insertion_sort(data):
    for index in range(len(data) - 1):
        for index2 in range(index + 1, 0, -1):
            if data[index2] < data[index2 - 1]:
                data[index2], data[index2 - 1] = data[index2 - 1], data[index2]
            else:
                break
    return data
import random

data_list = random.sample(range(20), 10)
print (insertion_sort(data_list))

>>[0, 3, 4, 5, 11, 12, 14, 17, 18, 19]

 

rand_data_list = [3, 5, 1, 2]

def insertion_sort(data_list):
    for stand in range(len(data_list)):
        key = data_list[stand]
        for num in range(stand, 0, -1):
            if key < data_list[num - 1]:
                data_list[num - 1], data_list[num] = data_list[num], data_list[num - 1]
            else:
                break
    return data_list

print (insertion_sort(rand_data_list))

 

4. 알고리즘 분석

  • 반복문이 두 개 O(𝑛2)
    • 최악의 경우, 𝑛∗(𝑛−1)2
  • 완전 정렬이 되어 있는 상태라면 최선은 O(n)

 

반응형
반응형

1. 선택정렬

  • 주어진 데이터 중 최소 값을 찾음
  • 해당 최소값을 데이터 맨 앞에 위치한 값과 교체
  • 맨 앞의 위치를 뺀 나머지 데이터를 동일한 방법으로 반복

2. 패턴 찾기

  • data_list = [9,3,2,1]
    • 1회 : 1, 3, 2, 9
    • 2회 : 1, 2, 3, 9
    • 3회 : 1, 2, 3, 9
0 1 2 3

비교데이터

인덱스

비교시작

데이터

인덱스

비교 끝

데이터

인덱스

5 4 3 1      
1 4 3 5 0 1 3
1 3 4 5 1 2 3
1 3 4 5 2 3 3

 

  1. for stand in range(len(data_list) - 1) 로 반복
  2. lowest = stand 로 놓고, //기준점이 맨 앞 최소값이니까 
  3. for num in range(stand, len(data_list)) stand 이후부터 반복
    • 내부 반복문 안에서 data_list[lowest] > data_list[num] 이면,
      • lowest = num // 교환 해줌 
  4. data_list[num], data_list[lowest] = data_list[lowest], data_list[num]

 

3. 알고리즘

def Selection_sort(data):
    for stand in range(len(data) - 1):
        lowest = stand
        for index in range(stand+1, len(data)):
            if(data[lowest]> data[index]):
                lowest = index
            data[lowest], data[stand] = data[stand], data[lowest]
    return data
import random

data_list = random.sample(range(50), 10)
Selection_sort(data_list)

>>[4, 12, 20, 27, 28, 25, 30, 39, 40, 43]

 

4. 알고리즘 분석

  • 반복문이 두 개 O(𝑛2)
    • 실제로 상세하게 계산하면, 𝑛∗(𝑛−1)2
반응형
반응형

1. 정렬이란?

  • 어떤 데이터들이 주어졌을 때, 정해진 순서대로 나열하는 것
  • 다양한 정렬 알고리즘 이해를 통해 동일한 문제에 대한 다양한 알고리즘이 고안될 수 있고, 각 알고리즘 간 성능 비교를 통해 알고리즘 성능 분석도 이해할 수 있음

2. 버블 정렬(bubble sort)

  • 두 인접한 데이터를 비교하여 앞에 있는 데이터가 뒤에 있는 데이터보다 크면, 자리를 바꾸는 정렬 알고리즘

## https://visualgo.net/en 사이트에서 보면 쉽게 그림으로 이해할 수 있다. 

 

3. 패턴 찾기

  • 데이터가 4개 일 때 
    • data_list = [1,9.3.2]
      • 1차 로직
        • 1 vs 9 => X
        • 9 vs 3 => [1, 3, 9, 2]
        • 9 vs 2 => [1, 3, 2, 9]
      • 2차 로직
        • 1 vs 3 => X
        • 3 vs 2 => [1, 2, 3, 9]
        • 3 vs 9 => X
      • 3차 로직
        • 1 vs 2 => X
        • 2 vs 3 => X
        • 3 vs 9 => X

==> N 개의 리스트가 있는 경우 N-1 로직을 적용한다

==> 로직을 1번 적용할 때마다, 가장 큰 수가 뒤에서부터 1개씩 결정된다 

==> 로직이 일찍 끝날 수도 있다 

        => 로직을 적용 시,  한 번도 데이터가 교환되지 않는다면 이미 정렬된 상태므로 더 이상 로직을 반복 적용할

             필요가 없다 

==> 로직 한 회 끝날 때 마다 가장 큰 숫자가 뒤에서 1개씩 결정된다

리스트 1회 2회 3회 4회
1, 9, 3, 2 1, 3, 2, 9 1, 2, 3, 9    
9, 7, 5, 3, 1 7, 5, 3, 1, 9 5, 3, 1, 7, 9 3, 1, 5, 7, 9 1, 3, 5, 7, 9

 

4. 알고리즘

<프로토 타입>
1. for num in range(len(data_list)) 반복
2. swap = false // 교환되어있는지 확인,  false 가 기본값이여야 아래 for문에서 swap 이 멈춰야 알고리즘 종료

3. 반복문 안에서 , for index in range(len(data_list) - num - 1) 를 n-1번 반복해야한다 
    //num 을 빼는 이유는  data_list에서 로직이 돌면 맨 뒤에 가장 큰 값이 고정되기 때문에 
4. 반복문안의 반복문 안에서, if data_list[index] > data_list[index + 1]  이면
5. swap 시켜야한다
6. 더이상 swap 되지 않고 false 값이 나오면 break
def bubblesort(data):
    for index in range(len(data) - 1):
        swap = False
        for index2 in range(len(data) - index - 1):
            if data[index2] > data[index2 + 1]:
                data[index2], data[index2 + 1] = data[index2 + 1], data[index2]
                swap = True
        
        if swap == False:
            break
    return data
import random

data_list = random.sample(range(50), 20)
bubblesort(data_list)

>>[3, 5, 10, 11, 18, 19, 20, 21, 24, 26, 28, 29, 31, 33, 34, 38, 39, 44, 46, 49]

5. 분석

  • 반복문이 두개  :  O(𝑛2)
    • 최악 : 𝑛∗(𝑛−1)2
  • 완전 정렬 되어 있으면 최선 : O(n)
반응형
반응형

문제 설명

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

 

제한 조건

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 CBD로 표기합니다
  • 선행 스킬 순서 skill의 길이는 2 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

 

skill skill_trees return
CBD [BACDE, CBADF, AECB, BDA] 2

 

입출력 예 설명

  • BACDE: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • CBADF: 가능한 스킬트리입니다.
  • AECB: 가능한 스킬트리입니다.
  • BDA: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

 

반응형

'Algorithm Study > Programmers' 카테고리의 다른 글

타일 장식 / python  (0) 2020.03.06
N개의 최소공배수/java  (0) 2019.08.28
피보나치 수 / java  (0) 2019.08.28
자연수 뒤집어 배열로 만들기/java  (0) 2019.08.28
약수의 합 / java  (0) 2019.08.28
반응형

문제 설명

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.

 

제한 사항

  • arr은 길이 1이상, 15이하인 배열입니다.
  • arr의 원소는 100 이하인 자연수입니다.

입출력 예

arr result
[2,6,8,14] 168
[1,2,3] 6

나의 코드

import java.util.Arrays;
 
class Solution {
  public  int solution(int[] arr) {
	Arrays.sort(arr);
	int lcm = arr[0] * arr[1] / gcd(arr[0], arr[1]);
		
	for (int i = 2; i < arr.length; i++) {
		lcm = lcm * arr[i] / gcd(lcm, arr[i]);
	}
		
	return lcm;
  }
	
  public static int gcd(int small, int big) {
	while (small != 0) {
		int nmg = big % small;
		big = small;
		small = nmg;
	}
	return big;
  }
}

 

다른사람 코드

// 문제가 개편 되었습니다. 이로 인해 함수 구성이 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
class NLCM {
    public long nlcm(int[] num) {
        long answer = num[0],g;
    for(int i=1;i<num.length;i++){
      g=gcd(answer,num[i]);
            answer=g*(answer/g)*(num[i]/g);
    }
        return answer;
    }
    public long gcd(long a,long b){
    if(a>b)
      return (a%b==0)? b:gcd(b,a%b);
    else 
      return (b%a==0)? a:gcd(a,b%a);
  }
    public static void main(String[] args) {
        NLCM c = new NLCM();
        int[] ex = { 2, 6, 8, 14 };
        // 아래는 테스트로 출력해 보기 위한 코드입니다.
        System.out.println(c.nlcm(ex));
    }
}
반응형

'Algorithm Study > Programmers' 카테고리의 다른 글

타일 장식 / python  (0) 2020.03.06
스킬트리/java  (0) 2019.08.28
피보나치 수 / java  (0) 2019.08.28
자연수 뒤집어 배열로 만들기/java  (0) 2019.08.28
약수의 합 / java  (0) 2019.08.28

+ Recent posts