본문 바로가기
TechStudy/CodingTest

백준 1차원 배열 10문제, 2차원 배열 단계 4문제 풀이

1차원 배열

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

 

1차원 배열 단계

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

www.acmicpc.net

 

 

10807 개수 세기

import sys; input = sys.stdin.readline

N = int(input())
lis = list(map(int, input().split()))
v = int(input())

print(lis.count(v))
#count = 0
#for num in lis:  for문과 count()비교하면 count()가 우수.
#  if num == v: 실패율문제는 for안에 count()들어가서 문제된 것!
#    count += 1
#print(count)

 

 

 

10871 X보다 작은 수

import sys; input = sys.stdin.readline
N, X = map(int, input().split())
A = list(map(int, input().split()))
print(' '.join(str(num) for num in A if num < X))
# 기본이 문자열인 input()과 str만 가능한 join개념을 기억하자.

 

 

 

10818 최소, 최대

import sys; input = sys.stdin.readline
N = int(input())
lis = list(map(int, input().split()))
print(min(lis), max(lis))
# 정렬해서 양끝을 출력할수도 있지만 여기선 max, min이 O(N)으로 더 효율적
# 정렬을 쓰는 순간 O(N log N)

 

 

 

2562 최댓값

import sys; input = sys.stdin.readline
lis = [int(input()) for _ in range(9)]
# 1개값 여러줄에 걸쳐 input 받는 법을 배운 문제
print(max(lis))
print(lis.index(max(lis)) + 1)

 

 

10810 공 넣기

import sys; input = sys.stdin.readline
N, M = map(int, input().split())
lis = [list(map(int, input().split())) for _ in range(M)]
# 내용을 2차원 배열로 받은다음

basket = [0] * (N+1) # 바구니 리스트 생성. 인덱스 0은 버리는 개념
for ball in lis: # lis의 한개의 list = ball
    for loc in range(ball[0], ball[1]+1):
        basket[loc] = ball[2] # i부터 j까지 인덱스 위치 값을 ball[2]로 갱신
print(' '.join(str(basket[b]) for b in range(1, len(basket))))
# 띄어쓰기 문자열 공백으로 출력

 

 

10813 공 바꾸기

import sys; input = sys.stdin.readline
N, M = map(int, input().split())
lis = [list(map(int, input().split())) for _ in range(M)]
basket = [a for a in range(0, N+1)]
# 인덱스 활용을 위해 0번부터 각 번호 삽입한 리스트 생성

for ball in lis: # 각 공을 서로 위치 바꾸기(파이썬 형태의 개념!)
    basket[ball[0]], basket[ball[1]] = basket[ball[1]], basket[ball[0]]
print(' '.join(str(basket[ball]) for ball in range(1, len(basket))))

 

 

5597 과제 안 내신 분..?

import sys; input = sys.stdin.readline
lis = [int(input()) for _ in range(28)]
total_lis = [num for num in range(1,31)]
for num in lis:
    total_lis.remove(num)
print(total_lis[0])
print(total_lis[1])
# N^2 시간복잡도이지만 길이 28고정이므로 O(N)

 

 

3052 나머지

import sys; input= sys.stdin.readline
lis = []
for num in range(10):
    lis.append(int(input()) % 42)
# input을 여기에 삽입해서 코드 효율성(?)을 증진한 케이스
print(len(set(lis))) # set으로 중복지우고 len 바로 측정

 

 

10811 바구니 뒤집기

import sys; input = sys.stdin.readline
N, M = map(int, input().split())
lis = [list(map(int, input().split())) for _ in range(M)]
basket = [a for a in range(0, N+1)]
# 인덱스 활용을 위해 0번부터 각 번호 삽입한 리스트 생성

for ball in lis: # reversed함수로 뒤집은 후, 해당 내용 반영
    # reversed함수에 대해 유념하자
    basket[ball[0] : ball[1] + 1] = reversed(basket[ball[0] : ball[1] + 1])
print(' '.join(map(str, basket[1:])))
# 0번 인덱스 제외하는 효율적인 join 출력

 

 

1546 평균

import sys; input = sys.stdin.readline
N = int(input())
lis = list(map(int, input().split()))
print(sum(lis) / max(lis) * 100/N)
# 왜 브론지 1인지 모르겠는 문제

 

 

 

 


2차원 배열

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

 

2차원 배열 단계

2차원 배열을 활용하여 색종이로 평면을 덮는 문제

www.acmicpc.net

 

 

 

2738 행렬 덧셈

import sys; input = sys.stdin.readline
N, M = map(int, input().split())
mtxA = [list(map(int, input().split())) for _ in range(N)]
mtxB = [list(map(int, input().split())) for _ in range(N)]
# 생성될 새로운 행렬
matrix = [[0]*M for _ in range(N)]

# 행렬 더하기
for i in range(N):
    for j in range(M):
        matrix[i][j] = mtxA[i][j] + mtxB[i][j]

# 여러 줄에 걸쳐서 출력하기
for k in matrix:
    print(' '.join(map(str, k)))

 

 

 

2566 최댓값

import sys; input = sys.stdin.readline
mtx = [list(map(int, input().split())) for _ in range(9)]
#비교 대상 리스트
compare = []
for i in range(9):
    for j in range(9):
        compare.append(mtx[i][j])
print(maximum:= max(compare))
#divmod(A, B) 의미: A / B의 (몫, 나머지) tuple로 출력
# 행, 열 반환을 원하면 divmod(max_index, num_cols) 사용
row, col = divmod(compare.index(maximum), 9)
#몫 = row, 나머지 = col  -> 인덱스 +1 반영
print(row+1, col+1)

 

 

 

10798 세로 읽기

import sys; input = sys.stdin.readline
# 비어있는 최대 문자열 통 5x15
mtx = [[] for _ in range(5)]
answer = ''

for i in range(5): # input값을 줄별로 list 정의(line)
    line = list(map(str, input().strip()))
    mtx[i] = line + [''] * (15 - len(line))
      #그리고 채워지지않은 나머지를 ''로 채움

for j in range(15): #이걸 밖에둬야 i가 먼저 순회된다.
    for i in range(5):
        if mtx[i][j] != '':
            answer += mtx[i][j]
        else:
            continue
print(answer)

 

 

2563 색종이

import sys; input= sys.stdin.readline
# 0 으로 이뤄진 100 사이즈의 전체 종이
paper = [[0]*100 for _ in range(100)]
# 입력부분
p_num = int(input())
black_paper = [list(map(int, input().split())) for _ in range(p_num)]


for i in range(10): # 행 (범위는 1, 11하거나 이렇게 10만 하거나)
    for j in range(10): # 열
        for k in range(p_num): # 검은종이 순회
            if paper[black_paper[k][0] + i][black_paper[k][1] + j] == 1:
                continue # 1이면 연산 패스
            else: # 나머지는 1 할당
                paper[black_paper[k][0] + i][black_paper[k][1] + j] = 1

print(sum(sum(row) for row in paper)) # 2차원 배열의 전체 합
# idea: 전체를 0의 배열로 보고 1을 집어넣는 방식으로 구현한 문제이다.
728x90
반응형

'TechStudy > CodingTest' 카테고리의 다른 글

chp8 해시(hash)  (1) 2023.12.13
chp6 스택(Stack), chp7 큐(Queue)  (4) 2023.12.07
chp5 배열(Array)  (1) 2023.11.28
코테 준비 및 시간 복잡도, 빈출 문법  (2) 2023.11.18
코딩테스트 공부 1  (0) 2023.10.19