2024. 12. 5. 12:50ㆍAlgorithms/백준알고리즘 연습
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를 만들어놓아야 함
row 와 col값에 i와 j 지정하기
i 와 j는 0부터 시작하기때문에 1을 더해주어야 함
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)
어떤 로직을 가져와야하는지 글로 한번 써보기
8393번
세로읽기
1 초 | 256 MB | 91264 | 43605 | 37139 | 48.151% |
문제
아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다.
이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다.
A A B C D D
a f z z
0 9 1 2 1
a 8 E W g 6
P 5 h 3 k x
<그림 1>
한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다.
심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다.
그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:
Aa0aPAf985Bz1EhCz2W3D1gkD6x
칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.
입력
총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.
출력
영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.
예제 입력 1 복사
ABCDE
abcde
01234
FGHIJ
fghij
예제 출력 1 복사
Aa0FfBb1GgCc2HhDd3IiEe4Jj
예제 입력 2 복사
AABCDD
afzz
09121
a8EWg6
P5h3kx
예제 출력 2 복사
Aa0aPAf985Bz1EhCz2W3D1gkD6x
출처
초기 시도
a= []
for _ in range (5):
a.append(list(input()))
for j in range (5):
for i in range (5):
print(a[i][j])
인풋을 다섯줄씩 쌓고 세로 한줄에 가로 한개씩 읽으려고 시도함
그러나 index오류가 남
답안( 챗 gpt 답변)
a = []
for _ in range(5):
a.append(list(input()))
result = ""
for j in range(max(len(row) for row in a)): # Iterate through columns
for i in range(5): # Iterate through rows
if j < len(a[i]): # Check if the current column exists in the current row
result += a[i][j] # Add the character to the result string
print(result)
input 더 간단하게 받기(list comprehension)
words = [input() for i in range(5)]
다른 분 답변 (출처 : https://velog.io/@notnavi/%EB%B0%B1%EC%A4%80-10798-%EC%84%B8%EB%A1%9C%EC%9D%BD%EA%B8%B0
words = [input() for i in range(5)]
for j in range(15): #단어의최대길이는15이기때문에
for i in range(5):
if j < len(words[i]):
print(words[i][j], end='')
챗 gpt 답은 맞았어도 주어질 수 있는 단어의 최대길이를 고려하지 않았기 때문에 결국 틀린 것임
i in range 5 는 index 0번부터 4까지 추출
첫번째 column에 row를 반복하여 돌아가도록 만들기
'Algorithms > 백준알고리즘 연습' 카테고리의 다른 글
백준 시간복잡도 (0) | 2024.12.07 |
---|---|
백준 기하 (0) | 2024.12.07 |
백준 알고리즘 연습 : 약수, 배수와 소수 (0) | 2024.12.04 |
백준 일반 수학 1 (0) | 2024.12.04 |
백준 2차원 배열 (0) | 2024.12.02 |