Algorithms/백준알고리즘 연습

백준 2차원 배열

이무수무 2024. 12. 2. 23:00

2738번

행렬 덧셈

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 104942 55118 47561 53.029%

문제

N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.

입력

첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

출력

첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.

예제 입력 1 복사

3 3
1 1 1
2 2 2
0 1 0
3 3 3
4 4 4
5 5 100

 

어떻게 푸는지 몰랐음

일단 리스트로 저 값들을 3*3으로 받아야한다는 사실만 인지하였음

정답

n, m = map(int, input().split()) 
a = []
b = [] 
for i in range(n):
    a.append(list(map(int, input().split())))
for i in range(n): 
    b.append(list(map(int, input().split())))
for i in range(n):
    c = []
    for j in range(m):
        c.append(a[i][j]+b[i][j])
    print(*c)

 

3번만큼 a행렬로 받고, 3번만큼 b행렬로 받아서 차례대로 a행렬과 b행렬 완성

3번만큼 c행렬에 a b행렬의 각각의 값을 더한 값을 저장

출력 

 

2566번

최댓값 스페셜 저지

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 110954 44684 38882 41.248%

문제

<그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

예를 들어, 다음과 같이 81개의 수가 주어지면

 1열2열3열4열5열6열7열8열9열1행2행3행4행5행6행7행8행9행
3 23 85 34 17 74 25 52 65
10 7 39 42 88 52 14 72 63
87 42 18 78 53 45 18 84 53
34 28 64 85 12 16 75 36 55
21 77 45 35 28 75 90 76 1
25 87 65 15 28 11 37 28 74
65 27 75 41 7 89 78 64 39
47 47 70 45 23 65 3 41 44
87 13 82 38 31 12 29 29 80

이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

예제 입력 1 복사

3 23 85 34 17 74 25 52 65
10 7 39 42 88 52 14 72 63
87 42 18 78 53 45 18 84 53
34 28 64 85 12 16 75 36 55
21 77 45 35 28 75 90 76 1
25 87 65 15 28 11 37 28 74
65 27 75 41 7 89 78 64 39
47 47 70 45 23 65 3 41 44
87 13 82 38 31 12 29 29 80

예제 출력 1 복사

90
5 7

 

초기 코드

n=9
a = []
for i in range (n):
    a.append(list(map(int,input().split)))
    print(max(n))
    print(a.index(max(n)))

x,y value를 저장할 수 있는 값을 가져와야 함 

 

 

how to bring index of row and column value? 

field = []

for _ in range(9):
    field.append(list(map(int, input().split())))

max_value = 0
row = 0
col = 0

for i in range(9):
    for j in range(9):
        if field[i][j] >= max_value:
            max_value = field[i][j]
            row = i+1
            col = j+1

print(max_value)
print(row, col)

 

엑스와 와이값을 가져오려면, 그걸 indicate 하는 i와 j를 만들어놓아야 함 

field[i][j] >= max_value: 인 이유

9 x 9 격자판에는 자연수와 0이 들어간다.

나의 코드는 격자판을 탐색하다가 0을 만나는 경우엔 0의 위치를 저장하지 못한다. 

만약 모든 격자판의 값이 0이라면, 정확한 결과를 도출하지 못한다.

--> 입력이 어떤 값들이 들어가는지 잘 확인해야 함 

1316번

그룹 단어 체커

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 177042 94651 77683 53.783%

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

첫째 줄에 그룹 단어의 개수를 출력한다.

예제 입력 1 복사

3
happy
new
year

예제 출력 1 복사

3

 

초기 답안 

a = int(input())
ans = 0
for i in range (a):
    b = input()
    for j in b : 
    	
    ans = 
    p += ans
print(count(p))

a번만큼 인풋을 받아와서 작성해야한다는 것은 아는데, 떨어진 자리에 복수의 알파벳이 또 나타나는 경우를 카운트 할때 그것을 어떻게 코드로 써야할지 모르겠음

받은 단어에서 하나씩 알파벳을 체크해야 함 

 

정답 코드 

a = int(input())
count = a
for i in range (a):
    b = input()
    for j in range(len(b)-1) :
        if b[j] == b[j+1] :  #다음에나오는글자와도같으면
            continue         #패스
        elif b[j] in b[j+1:] :  #그이후에글자부터같은단어가나옴
            count -= 1          #받은단어갯수에서-1을 한다
            break
print(count)

 

어떤 로직을 가져와야하는지 글로 한번 써보기 

 

 

2563번 

색종이

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 79740 51284 43288 64.411%

문제

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

예제 입력 1 복사

3
3 7
15 7
5 2

예제 출력 1 복사

260

 

1. 3번을 돌아야 함 

2. 넓이 공식은 가로 * 세로 

3. 정사각형이니까 10*10이어서 이를 3번곱하면 되고, 중복된 영역만 빼면 됨 

4. 중복된 영역을 구하려면 좌표값을 설정 

5. 가로는 주어진값 첫번째부터,  +10+첫번째값 

6. 세로는 주어진 두번째값부터  +10+두번째 값

7. 중복된 영역은 어떻게 구하지? 리스트안에 각 좌표안의 해당하는 x 값, y값을 넣고 겹치는 값의 갯수 를 구해야하나?

 

초기 코드 

n = int(input())
area = 0
for i in range (n):
	x_end, y_end = map(int,input().split())
    x = [x_end, x_end+10]
    y = [y_end, y_end-10]

area += 
    
print(100*n - area)

 

답안 :힌트 =  좌표안에 해당하는 값들을 0으로 표기하고, 그 0 의 값을 세는 것 

n = int(input())
map_array = [[0]*100 for _ in range(100)] # 100x100 도화지 만들기

for _ in range(n):
    x, y = map(int, input().split())
    # x : x ~ x+10
    # y : y ~ y+10
    for i in range(y, y+10):
        idx_y = i
        # i,j에 해당하는 좌표에 점을 찍음
        for j in range(x, x+10):
            idx_x = j
            if map_array[idx_y][idx_x] == 0:
                map_array[idx_y][idx_x] = 1
            else:
                pass
            
sum_array = 0
for i in range(100):
    sum_array += sum(map_array[i])
print(sum_array)
출처: https://datalabbit.tistory.com/141 [간토끼 DataMining Lab:티스토리]

 

y range(혹은 x range) 루프 돌아갈 동안 해당하는 x(or y)좌표에  0이 찍혀있다면, 그것을 1로 변환 (중복되는 것을 또 색칠하는 것을 막을 수 있음)

마지막 부분 : 1을 카운트하기 (넓이) 

 

애초에 가로 세로 100인 정사각형 모양의 흰색 도화지 라는 것에서 힌트를 얻을 수 있지 않았을까?