• Home
  • About
    • Yerim Oh photo

      Yerim Oh

      Happy and worthwhile day by day :)

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Github
    • Youtube
  • Posts
    • All Posts
    • All Tags
  • Projects

[1012] (파이썬) CODE TREE_Lv.2 Intermediate Low: 1차원 젠가

19 Jan 2020

Reading time ~2 minutes

Table of Contents
  • 문제
    • 입력 형식
    • 출력 형식
    • 입출력 예제
  • 풀이과정
    • 1) 입력값 받기
    • 2) 지우는 매서드 생성
    • 3) 이 과정을 두 번 반복
    • 4) 출력
  • 구현
  • 결과

문제

[1차원 젠가]
풀러 가기

n개의 층으로 이루어진 1차원 젠가의 상태가 주어집니다.
각 층마다 1개의 블럭이 놓여져 있고, 각 블럭에는 1에서 100 사이의 숫자가 하나씩 적혀있습니다.

image

이 때 2번에 걸쳐 특정 구간의 블럭들을 빼는 작업을 진행하려 합니다.

처음에 위에서부터 2번째 블럭에서 4번째 블럭까지 블럭을 빼게 된다면, 남은 블럭은 중력에 의해 떨어지게 되어 다음과 같이 블럭이 남게 됩니다. image

그 다음에는 2번째 블럭만 빼게 된다면, 다음과 같이 블럭이 남게 됩니다. image

특정 구간의 블럭을 두 번 빼는 과정을 거친 이후의 결과를 출력하는 프로그램을 작성해보세요.

입력 형식

첫 번째 줄에는 처음 놓여있는 블럭의 수를 의미하는 n이 주어집니다.

두 번째 줄부터는 n개의 줄에 걸쳐 맨 위에서부터 맨 아래까지 순서대로 각 층에 놓여있는 블럭에 적혀있는 숫자가 주어집니다.

그 다음 줄에는 첫 번째로 제거할 블럭의 정보를 나타내는 (s1, e1) 값이 공백을 사이에 두고 주어집니다. (s1 ≤ e1) 이는 위에서부터 s1번째 부터 e1번째까지의 블럭을 뺀다는 것을 의미합니다.

마지막 줄에는 두 번째로 제거할 블럭의 정보를 나타내는 (s2, e2) 값이 공백을 사이에 두고 주어집니다. (s2 ≤ e2) 이는 위에서부터 s2번째 부터 e2번째까지의 블럭을 뺀다는 것을 의미합니다.

해당 구간에 놓인 블럭을 빼는 것이 불가능한 입력은 주어지지 않는다고 가정해도 좋습니다.

  • 2 ≤ n ≤ 100

출력 형식

두 번의 블록 빼기 작업을 진행한 이후의 결과를 출력합니다.

첫 번째 줄에는 남은 블록의 개수를 출력합니다.

그 다음 번째 줄 부터는 한 줄에 하나씩 위에서부터 남은 블록에 적힌 숫자들을 순서대로 출력합니다

Constraints:
시간 제한: 1000ms
메모리 제한: 80MB

입출력 예제

입력:
6
1
2
3
1
1
5
2 4
2 2

출력: 
2
1
5
입력:
6
1
2
3
1
1
5
2 4
1 3

출력: 
0

풀이과정

1) 입력값 받기

  • 위의 배열을 눕혀줘서 생각한다
end_of_array = int(input())
numbers = [
    int(input())
    for _ in range(n)
]

2) 지우는 매서드 생성

  • 지우고자하는 부분만큼을 없앰
def cut_array(start_idx, end_idx):
    global end_of_array
    
    cut_len = end_idx - start_idx + 1;
    for i in range(end_idx + 1, end_of_array):
        numbers[i - cut_len] = numbers[i]
    
    end_of_array -= cut_len

3) 이 과정을 두 번 반복

# 두 번에 걸쳐 지우는 과정을 반복합니다.
for _ in range(2):
    s, e = tuple(map(int, input().split()))
    # [s, e] 구간을 삭제합니다.
    cut_array(s - 1, e - 1)

4) 출력

print(end_of_array)
for i in range(end_of_array):
    print(numbers[i])

구현

# 변수 선언 및 입력
n = int(input())
numbers = [
    int(input())
    for _ in range(n)
]
end_of_array = n


# 입력 배열에서 지우고자 하는 부분 수열을 삭제합니다.
def cut_array(start_idx, end_idx):
    global end_of_array
    
    cut_len = end_idx - start_idx + 1;
    for i in range(end_idx + 1, end_of_array):
        numbers[i - cut_len] = numbers[i]
    
    end_of_array -= cut_len


# 두 번에 걸쳐 지우는 과정을 반복합니다.
for _ in range(2):
    s, e = tuple(map(int, input().split()))
    # [s, e] 구간을 삭제합니다.
    cut_array(s - 1, e - 1)

# 출력:
print(end_of_array)
for i in range(end_of_array):
    print(numbers[i])

결과

image 쨔쨘



Coding test Share Tweet +1