두 리스트 합치기

Hyeseong·2023년 6월 17일
0

algorithm

목록 보기
1/2

문제

코드1

  • itertools.chain과 sorted 함수를 사용
from itertools import chain

N = int(input())
list1 = list(map(int, input().split()))
M = int(input())
list2 = list(map(int, input().soplit()))

chained = chain(list1, list2)
_sorted = sorted(chained)
_maped = map(str, _sorted)
result = ' '.join(_mapped)
print(result)

코드2

def input_list():
    # 사용자로부터 정수를 입력받아 리스트의 크기를 결정합니다.
    n = int(input())
    # 사용자로부터 정수들을 입력받아 리스트의 원소로 만듭니다.
    return list(map(int, input().split()))

def merge(list1, list2, result, i, j):
    # 두 개의 정렬된 리스트를 받아서 더 작은 원소부터 차례대로 결과 리스트에 추가합니다.
    # i와 j는 각각 list1과 list2에서 현재 확인 중인 원소의 인덱스를 나타냅니다.
    while i < len(list1) and j < len(list2):
        if list1[i] < list2[j]:
            result.append(list1[i])
            i += 1
        else:
            result.append(list2[j])
            j += 1
    return result, i, j

def append_remaining(list, result, index):
    # 주어진 리스트에 남아있는 원소들을 결과 리스트에 추가합니다.
    # index는 현재 확인 중인 원소의 위치를 나타냅니다.
    while index < len(list):
        result.append(list[index])
        index += 1
    return result

def merge_sorted_lists(list1, list2):
    # 두 개의 정렬된 리스트를 받아서 병합한 결과를 반환합니다.
    result = []
    i = j = 0

    # 두 리스트의 원소들을 병합합니다.
    result, i, j = merge(list1, list2, result, i, j)

    # 각 리스트의 남은 원소들을 결과 리스트에 추가합니다.
    result = append_remaining(list1, result, i)
    result = append_remaining(list2, result, j)

    return result

def print_list(lst):
    # 리스트의 원소들을 공백으로 구분하여 출력합니다.
    for x in lst:
        print(x, end=' ')

# 사용자로부터 두 개의 리스트를 입력받습니다.
list1 = input_list()
list2 = input_list()

# 두 개의 리스트를 병합한 결과를 계산하고 출력합니다.
merged_list = merge_sorted_lists(list1, list2)
print_list(merged_list)

설명

def input_list():

함수 input_list의 정의를 시작합니다. 이 함수는 사용자로부터 리스트의 크기와 원소들을 입력받아 리스트를 반환합니다.

n = int(input())

사용자로부터 입력받은 값을 정수로 변환하여 변수 n에 저장합니다. 이 값은 리스트의 크기를 나타냅니다.

return list(map(int, input().split()))

사용자로부터 입력받은 문자열을 공백으로 분리하고, 각 부분을 정수로 변환하여 리스트로 만든 후 반환합니다. 이 값들은 리스트의 원소들입니다.

def merge(list1, list2, result, i, j):

함수 merge의 정의를 시작합니다. 이 함수는 두 개의 정렬된 리스트와 결과 리스트, 그리고 두 개의 인덱스를 인수로 받아 결과 리스트에 원소들을 병합합니다.

5-9. while i < len(list1) and j < len(list2): ...

두 인덱스가 각 리스트의 크기를 넘지 않는 동안 반복합니다. 두 리스트의 현재 원소를 비교하여 더 작은 원소를 결과 리스트에 추가하고 해당 리스트의 인덱스를 증가시킵니다.

return result, i, j

병합한 결과 리스트와 갱신된 두 인덱스를 반환합니다.

def append_remaining(list, result, index):

함수 append_remaining의 정의를 시작합니다. 이 함수는 리스트와 결과 리스트, 그리고 인덱스를 인수로 받아 남은 원소들을 결과 리스트에 추가합니다.

12-15. while index < len(list): ...

인덱스가 리스트의 크기를 넘지 않는 동안 반복합니다. 현재 인덱스의 원소를 결과 리스트에 추가하고 인덱스를 증가시킵니다.

return result

원소들이 추가된 결과 리스트를 반환합니다.

def merge_sorted_lists(list1, list2):

함수 merge_sorted_lists의 정의를 시작합니다. 이 함수는 두 개의 정렬된 리스트를 인수로 받아 이를 병합한 결과를 반환합니다.

result = []

두 리스트를 병합한 결과를 저장할 빈 리스트를 초기화합니다.

i = j = 0

두 리스트의 초기 인덱스를 0으로 설정합니다.

result, i, j = merge(list1, list2, result, i, j)

함수 merge를 호출하여 두 리스트의 원소들을 병합하고, 갱신된 인덱스를 받습니다.

result = append_remaining(list1, result, i)

함수 append_remaining를 호출하여 첫 번째 리스트의 남은 원소들을 결과 리스트에 추가합니다.

result = append_remaining(list2, result, j)

함수 append_remaining를 호출하여 두 번째 리스트의 남은 원소들을 결과 리스트에 추가합니다.

return result

병합한 결과 리스트를 반환합니다.

def print_list(lst):

함수 print_list의 정의를 시작합니다. 이 함수는 리스트의 원소들을 출력합니다.

25-28.

for x in lst: ...

리스트의 각 원소에 대해 반복하며, 원소를 출력합니다. 출력된 원소들 사이에는 공백이 들어갑니다.

list1 = input_list()

함수 input_list를 호출하여 사용자로부터 첫 번째 리스트를 입력받습니다.

list2 = input_list()

함수 input_list를 호출하여 사용자로부터 두 번째 리스트를 입력받습니다.

merged_list = merge_sorted_lists(list1, list2)

함수 merge_sorted_lists를 호출하여 두 리스트를 병합한 결과를 계산합니다.

print_list(merged_list)

함수 print_list를 호출하여 병합한 결과 리스트를 출력합니다

php 코드

<?php

// 주어진 문자열을 공백 기준으로 분리하여 리스트로 변환하는 함수
function input_list(string $list): array {
    return explode(' ', $list);
}

// 두 개의 리스트를 합치는 함수
// list1과 list2의 원소들을 순서대로 비교하여, 더 작은 값을 result 리스트에 추가
function merge(array $list1, array $list2, array $result, int $i, int $j): array {
    while ($i < count($list1) && $j < count($list2)) {
        if ($list1[$i] < $list2[$j]) {
            array_push($result, $list1[$i]);
            $i++;
        } else {
            array_push($result, $list2[$j]);
            $j++;
        }
    }
    return array($result, $i, $j);
}

// 리스트의 나머지 원소들을 result에 추가하는 함수
function append_remaining(array $list, array $result, int $index): array {
    while ($index < count($list)) {
        array_push($result, $list[$index]);
        $index++;
    }
    return $result;
}

// 두 개의 정렬된 리스트를 병합하는 함수
// 두 개의 리스트를 병합하여 새로운 정렬된 리스트를 반환
function merge_sorted_lists(array $list1, array $list2): array {
    $result = array();
    $i = $j = 0;
    list($result, $i, $j) = merge($list1, $list2, $result, $i, $j);
    $result = append_remaining($list1, $result, $i);
    $result = append_remaining($list2, $result, $j);
    return $result;
}

// 리스트의 원소들을 출력하는 함수
function print_list(array $lst): void {
    foreach ($lst as $x) {
        echo $x . " ";
    }
}

// 예제 실행
$list1 = input_list("1 3 5");
$list2 = input_list("2 3 6 7 9");
$merged_list = merge_sorted_lists($list1, $list2);
print_list($merged_list);

?>

설명

$N = intval(trim(fgets(STDIN)));

fgets(STDIN): PHP에서는 fgets(STDIN) 함수를 통해 사용자로부터 표준 입력을 받을 수 있습니다. STDIN표준 입력 스트림을 나타내는 상수입니다.

사용자로부터 입력?

사용자로부터 입력을 받는다는 것은 여러 다양한 상황에서 사용될 수 있습니다.

  1. 프로그램 설정값 입력: 예를 들어 PHP 스크립트가 실행되면서 어떤 작업을 수행해야 하는데, 그 작업의 세부적인 설정값이 사용자에 따라 달라질 수 있습니다. 이런 경우에는 사용자로부터 직접 설정값을 입력받아서 프로그램이 동작하게 할 수 있습니다.

예: "검색할 키워드를 입력하세요: " (사용자가 '피자'라고 입력)

  1. 사용자의 선택 입력: 프로그램이 사용자에게 여러 가지 옵션 중에서 하나를 선택하도록 요청할 수 있습니다. 이 경우에도 사용자로부터의 입력을 받습니다.

예: "어떤 파일을 열겠습니까? 1. 사진 2. 문서 3. 동영상" (사용자가 '2'라고 입력)

  1. 게임에서의 사용자 입력: 예를 들어 간단한 텍스트 기반 게임을 만든다면, 사용자로부터 게임 진행에 필요한 입력을 받을 수 있습니다.

예: "어느 방향으로 이동하시겠습니까? (w: 위, a: 왼쪽, s: 아래, d: 오른쪽)" (사용자가 'd'라고 입력)

이런 식으로, 프로그램이 어떤 데이터를 필요로 하고, 그 데이터가 실행 시점에 결정되는 경우에는 사용자로부터 직접 입력을 받아서 그 값을 사용합니다.

fget 함수

  • fgets() 함수는 파일에서 한 줄을 읽어오는 함수
  • fgets()는 파일 포인터에서 한 줄을 가져와 문자열로 반환
  • 이때 "한 줄"이라는 것은 줄바꿈 문자("\n"), 반환문자("\r"), 또는 파일의 끝 EOF를 만날 때까지를 의미
  • 첫 번째 매개변수로 파일 핸들을 받습니다. 이 파일 핸들은 fopen() 등의 함수를 통해 열린 파일에 대한 참조입니다.

  • 두 번째 매개변수로는 읽어올 최대 길이를 지정할 수 있습니다

  • fgets()는 이 길이보다 긴 줄을 만나더라도 이 길이만큼의 문자만 읽어옵니다.
  • 두 번째 매개변수를 지정하지 않으면 줄의 끝까지 전체를 읽어옵니다.
  • 파일의 끝(EOF)에 도달하거나 오류가 발생하면 fgets() 함수는 FALSE를 반환합니다. 이를 통해 파일 읽기가 정상적으로 이루어졌는지를 확인할 수 있습니다.
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글