본문 바로가기
백준 (코테)

4. [4단계] 제목: 1차원 배열

by 코린이의 세계 2024. 8. 10.

배열은 1차원도 있고 2차원도 있고 3차원도 있고 ~이런 식으로 N차원으로 커진다. 1차원은 그냥 "행"만 존재. 2차원은 "행" / "열"이 존재. 3차원은 "행 , 열 , 면" ~~ 이렇고 배열은 거의 3차까지만 쓰이는 듯하다.

https://velog.io/@soyoun9798/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-1.-%EB%B0%B0%EC%97%B4-Array

1단계.
총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.
첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어 있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.

첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.

답: n = int(input())
n_list = list(map(int, input().split()))
v = int(input())

print(n_list.count(v))

n_list라는 변수로 한 줄로 기입받은 수를 리스트화하여 저장함. 그리고 그 n_list의 v 변수를 count 하는 개수를 프린트하는 코드이다. 말이 복잡하지만, 정수를 리스트화해서 개수를 카운터 하는 코드라고 정리할 수 있다.

 


2단계.
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

답: N, X = map(int, input().split())
A = list(map(int, input().split()))
for i in range(N):
    if A[i] < X:
        print(A[i], end=" ")

밑에 for문을 해석하자면.. 0부터 N-1만큼 돌아가며, 인덱스 0부터 쭉 돌아가며 x보다 작으면 프린트하게 된다. (end으로 공백을 주면 된다.)


3단계.
N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

답: cnt = int(input())
numbers = list(map(int, input().split()))
print(min(numbers),max(numbers))

파이썬의 장점이 보이는 코드이다. 파이썬에 내장된 라이브러리 함수인 "min / max"으로 최솟값과 최댓값을 출력할 수 있다. 그리고 놀랍게도 cnt 즉 N개의 정수에 대한 코드는 한 줄로 끝나고 다시 쓰이지 않는다...(코드 장난질)


4단계.
9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

답: num_list = []
for i in range(9) :
    num_list.append(int(input()))   

print(max(num_list)) 
print(num_list.index(max(num_list))+1)

먼저, num_list이라는 배열 정의. 이후 append 함수를 이용해서 num_list에 기입한다. (0부터 8까지) 이후 max 함수를 이용해서 최댓값을 출력, 이 최댓값의 인덱스를 +1 한 숫자를 출력한다. (왜냐하면 인덱스는 0부터 시작해서.)


5단계.
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다.

도현이는 앞으로 M번 공을 넣으려고 한다. 도현이는 한 번 공을 넣을 때, 공을 넣을 바구니 범위를 정하고, 정한 바구니에 모두 같은 번호가 적혀있는 공을 넣는다. 만약, 바구니에 공이 이미 있는 경우에는 들어있는 공을 빼고, 새로 공을 넣는다. 공을 넣을 바구니는 연속되어 있어야 한다.
공을 어떻게 넣을지가 주어졌을 때, M번 공을 넣은 이후에 각 바구니에 어떤 공이 들어 있는지 구하는 프로그램을 작성하시오.

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐서 공을 넣는 방법이 주어진다. 각 방법은 세 정수 i j k로 이루어져 있으며, i번 바구니부터 j번 바구니까지에 k번 번호가 적혀 있는 공을 넣는다는 뜻이다. 예를 들어, 2 5 6은 2번 바구니부터 5번 바구니까지에 6번 공을 넣는다는 뜻이다. (1 ≤ i ≤ j ≤ N, 1 ≤ k ≤ N) 도현이는 입력으로 주어진 순서대로 공을 넣는다.

1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0을 출력한다.

답: n, m=map(int, input().split())
box = [0]*n

for a in range(m) :
    i,j,k = map(int, input().split())
    for idx in range(i, j+1):
        box[idx-1] = k
for i in range(n):
    print(box[i], end=' ')

일단 이해부터 하는 것이 어려운 문제였다. 일단 n, m=map(int, input().split()) 으로 숫자를 기입받는다. 이후 box라는 배열을 이용해서 바구니를 컨트롤 할 것이다. 먼저 box를 0으로 초기화하고 바구니는 n개가 있으니 n을 곱해준다.이제 0부터 m-1 번 i , j, k를 반복해서 기입 받는다. 이후 2중 for문이 돌아가는데 이 for문은 i부터 j까지 idx-1번 반복되는 배열을 뽑아준다. 이 배열에 k를 넣어준다. 이러면 배열에 기입되고, 이후 0번부터 n-1번까지 배열이 출력된다. (인덱스 주입해서 출력시킨다.) 공백을 주어야 하니 end를 이용해 준다.

굉장히 복잡했고, 구글링 하지 않고 생각하기에는 힘들다.


6단계.
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다.
도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다.

공을 어떻게 바꿀지가 주어졌을 때, M번 공을 바꾼 이후에 각 바구니에 어떤 공이 들어있는지 구하는 프로그램을 작성하시오.

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에 들어있는 공을 교환한다는 뜻이다. (1 ≤ i ≤ j ≤ N)
도현이는 입력으로 주어진 순서대로 공을 교환한다.

1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.

답: n, m=map(int, input().split())
box = [i for i in range(1,n+1)]

for a in range(m):
    i, j = map(int, input().split())
    temp = box[i-1]
    box[i-1]=box[j-1]
    box[j-1]=temp

for b in box:
  print(b, end=' ')

이번은 교환이다. box라는 배열에 1부터 n까지의 정수를 넣어준다. 이후 m번만큼 반복문이 돌아간다. 반복문은 temp이라는 임의의 변수를 하나 정해주고, 이 변수를 이용해서 교환을 진행해 줄 것이다. 교환은 temp에 box[i-1]을 넣어주고, box[i-1]에는 box[j-1]을 넣어준다. 마지막으로 box[j-1]에 temp을 넣어준다. 이 과정으로 교환이 일어나는 것이다. (서로가 서로를 가리키면서 돌아감. 이런 교환이 m번 반복되며 이 배열을 이후 출력해 주는 코드를 작동시킨다. (for b in box)


7단계.
X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.
교수님이 내준 특별과제를 28명이 제출했는데, 그중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.
입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그다음 출석번호를 출력한다.

답: students = [i for i in range(1,31)]

for i in range(28):
    applied = int(input())
    students.remove(applied) 

print(min(students))
print(max(students))

students라는 배열로 1부터 30까지의 정수를 넣어준다. 그리고 1부터 28번까지의 반복문을 돌린다. applied로 수를 기입하고 그 수를 students에서 remove 해준다. 그러면 딱 2개의 수만 남을 것이다. 이후 max / min 함수로 출력한다.


8단계.
두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

답: nums = []

for i in range(10):
  n = int(input())%42
  if (n not in nums):
    nums.append(n)

print(len(nums))

nums이라는 배열 정의. 이후 10번 반복문이 돌아간다. n을 기입하되 42로 나눈 나머지로 기입이 된다. 이후 n이 nums 배열에 없다면 nums배열에 추가. 이러면 42로 나눈 나머지 값을 중복 없이 nums배열에 추가할 수 있다. 이후 len 함수로 nums의 길이를 추출한다. (n이 nums 안에 없다면 < if문 해석)


9단계.
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀 있다. 바구니는 일렬로 놓여 있고, 가장 왼쪽 바구니를 1번째 바구니, 그다음 바구니를 2번째 바구니,..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다. 
도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.
바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.

첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N)
도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

답: n,m = map(int, input().split())
basket = [i for i in range(1,n+1)]
temp = 0
for x in range(m):
  i,j = map(int, input().split())
  temp = basket[i-1:j]
  temp.reverse()
  basket[i-1:j] = temp

for x in range(n):
  print(basket[x],end=" ")

이번에는 배열 뒤집기 문제이다. "일명 도현이 문제"인데, 처음 문제를 이해했다면 응용 버전이라고 생각하면 편하다. basket이라는 배열에 1부터 n까지 정수를 넣어준다. 이후 temp를 0으로 초기화. m번 for문을 돌아가는데 이때 temp에 basket[i-1:j]을 넣어준다. 이후 reverse 하면 된다. 다시 리버스 한 것을 basket[i-1:j]에 넣어준다. 이러면 배열이 거꾸로 바뀌게 된다. 이 바뀐 배열을 n번만큼 for문으로 돌리면 된다.


10단계.
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그러고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

답: subject = int(input())
scores = list(map(int, input().split()))
M = max(scores)

for i in range(subject):
    scores[i] = scores[i]/M*100

print(sum(scores)/subject)

이번엔 점수 조작이다. 최대값을 M이라고 치면 이건 모든 점수의 Max 함수로 정의가 가능하다. (파이썬 라이브러리 함수) 이후 첫 줄에 기입한 과목 개수만큼 for문이 돌아가며 "모든 점수를 점수/M*100"으로 고쳐야 하니 scores[]에 넣어야 한다.

이후 sum 함수를 써주면 된다. (이것도 파이썬 라이브러리 함수..) 평균이니깐 subject으로 나누어야 한다.

결론
도현이는 배열에 미친 사람이다.

 

'백준 (코테)' 카테고리의 다른 글

5. [5단계] 제목: 문자열  (0) 2024.08.13
1~4단계 백준 복습  (0) 2024.08.12
3. [3단계] 제목: 반복문  (1) 2024.08.09
2. [2단계] 제목: 조건문  (0) 2024.08.08
1. [1단계] 제목: 입출력과 사칙연산  (0) 2024.08.07