본문 바로가기

기타/백준

4. 1차원 배열 (2)

https://www.acmicpc.net/step/6

 

1차원 배열 단계

배열을 활용하여 서로 다른 값의 개수를 찾는 문제

www.acmicpc.net

나머지 7문제 (한문제 힘들어서 못하겠음)


백준 / 10818번

문제

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

 

입력

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

 

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

 

풀이

-Python3

N = int(input())
N_list = list(map(int, input().split()))
print(min(N_list),max(N_list))

파이썬에서 최솟값을 나타내는 min(), 최댓값을 나타내는 max()함수의 사용으로 리스트 안에서 가장 큰 값과 작은 값을 구할 수 있다.

count() 함수는 list.count() 형식으로 리스트 함수 자식 함수로 존재하는 반면에 max와 min은 인자로 리스트를 넣는다는 점을 주의해야 할듯


백준 / 2562번

문제

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

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

 

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

 

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

 

풀이

-Python3

N_list = [] #배열 N_list를 초기화
for i in range(9): #for문으로 9번의 입력을 받는다
    N_list.append(int(input())) #입력을 배열에 새 인덱스로 추가한다
print(max(N_list))
print(N_list.index(max(N_list))+1) #인덱스는 0번이니까 +1

파이썬에서 배열의 뒤에 값을 추가할 때는 append 함수를 사용한다.

9번의 입력이 있으니까 for문 range를 9로 걸어주고 9번의 입력을 append하면 된다.

주의할 점은 인덱스가 0번째부터 시작하니까 최대값 인덱스를 구할 때 +1을 해줄 것!!

 

list.함수() 형태와 함수(list) 형태를 항상 헷갈리는 것 같다. 나중에 정리 한 번 해야할 듯

  • list.count()
  • list.index()
  • list.append()
  • max(list)
  • min(list)

백준 / 10810번 (★)

문제

도현이는 바구니를 총 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을 출력한다.

 

풀이

-Python3

N, M = map(int, input().split())
N_list = [0]*N
for x in range(M):
    i, j, k = map(int, input().split())
    for y in range(i,j+1,1):
        N_list[y-1] = k
for z in range(N):
    print(N_list[z], end=' ')

문제가 어지럽다....

이런 문제 읽고 바로 이해할 수 있는 것도 코테를 위해 필요한 능력인듯

  • 바구니의 개수 N 
  • 행동할 횟수 M
  • i j k : i번부터 j번 바구니에 k라는 숫자 공을 넣음
  • 이미 있는 바구니에 입력이 들어오면 후에 들어온 값으로 교체
  • 아무런 공이 없으면 0을 출력

결국 인덱스 개수가 N인 배열에서, M번의 반복문을 사용해 i j 인덱스 사이를 돌아다니면서 k라는 값을 설정하라는 뜻.

공이 없으면 0을 출력하므로 처음 배열을 선언할 때 전부 0으로 초기화가 필요.

문제는 복잡한데 행위는 어렵지 않다.

 

POINT
  • N개의 요소를 가진 리스트를 초기화할 때 [0]*N 등 곱하기를 사용할 수 있다.
  • i번째를 바구니에 넣을 때, 인덱스 상으로는 0부터 시작하므로 i-1로 접근해야 한다.

백준 / 10813번

문제

도현이는 바구니를 총 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번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.

 

풀이

-Python3

도현이가 공을 좀 가만히 두면 좋겠다

N, M = map(int, input().split())
temp = 0 #중간값을 저장할 temp 변수 설정
N_list=[] #리스트 정의
for x in range(0,N):
    N_list.append(x+1) #각각 바구니 번호로 초기화
for x in range(M):
    i, j = map(int, input().split())
    temp = N_list[i-1]
    N_list[i-1] = N_list[j-1]
    N_list[j-1] = temp #공 교환
for x in range(N):
    print(N_list[x],end=' ') #공백으로 구분하여 출력

문제 자체는 위에 것보다 쉽다.

i와 j 인덱스의 값을 서로 바꿔주기만 하면 된다.

다만 리스트 초기화 할 때 한 번 틀렸다!!!!

리스트를 정의할 때 null 배열로 만들어 놓으면 그 상태로는 인덱스가 부여되지 않은 상태이기 때문에, 직접적으로 인덱스에 접근하려고 굴 경우 런타임 에러가 난다는 것을 유의해야 할 것 같다. 자꾸 까먹음...

  1. 배열은 미리 다른 값으로 초기화해두거나
  2. 나중에 추가로 인덱스를 넣고 싶으면 append() 함수를 사용

백준 / 5597번 (★)

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

 

입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

 

출력

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

 

풀이

-Python3

student = [i for i in range(1,31)] #1부터 30까지 배열 생성
for _ in range(28):
    input_num = int(input())
    student.remove(input_num) #들어온 입력은 제거

print(min(student))
print(max(student))

1부터 30까지 들어있는 배열을 생성하고, 입력이 들어온 값은 제거한다. 

2개의 숫자가 남으므로 작은 수부터 출력하려면 min과 max를 사용할 수 있다.

 

POINT
  • 1부터 30까지 들어있는 배열을 생성할 때 : [i for i in range(1,31)]
  • 리스트 안에서 특장 값을 지우고 싶을 때 : 리스트.remove(값)

백준 / 3052번

문제

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

 

출력

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

 

풀이

-Python3

10개의 input을 받으면서 이를 42로 나눈 값을 배열에 저장하면 되는데, 서로 다른 값이 몇 개 있는지를 확인하는 게 관건이라고 생각했다.

탐색 알고리즘을 돌리기에는 겨우 이 정도의 작업에 cost가 너무 많이 나가지 않나? 

N_list = []
for _ in range(10):
    N = int(input())
    N_list.append(N%42)
print(len(set(N_list)))

그래서 파이썬에는 중복을 제거하는 set()이라는 함수가 있다고 함.

set 함수로 리스트의 중복을 제거하고, 리스트의 길이를 출력하면 겹치지 않는 것들의 개수를 출력할 수 있다.


백준 / 10811번

문제

도현이는 바구니를 총 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)

도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

 

출력

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

 

풀이

-Python3

1부터 N으로 리스트를 채우고, M번의 입력에 대해서 for문을 돌며 역순 처리를 해주면 됨.

N,M = map(int, input().split())
N_list = [i for i in range(1,N+1)]
for i in range(M):
    i, j = map(int, input().split())
    temp = N_list[i-1:j]
    temp.reverse()
    N_list[i-1:j]=temp
for i in range(N):
    print(N_list[i],end=' ')

역순 처리하는 방법은 많이 있던데 나는 임시 변수 temp에 쪼갤 내용을 담아놓고 reverse() 함수로 역순시킨담에 그대로 넣어주는 방식을 취했다. 그 외에도 i와 j를 이용해서 범위를 세 개로 쪼갠 후(역순하는 부분 앞, 역순하는 부분, 역순하는 부분 뒤) 역순 블럭만 reverse 처리해서 세 개를 결합하는 풀이도 봤다.

 

'기타 > 백준' 카테고리의 다른 글

5. 문자열(2)  (0) 2023.07.11
5. 문자열(1)  (0) 2023.07.03
4. 1차원 배열 (1)  (0) 2023.05.19
3. 반복문 (2)  (0) 2023.05.19
3. 반복문 (1)  (0) 2023.05.16