-
[Baekjoon] 단계별 문제 - 2차원 배열알고리즘/코딩테스트 문제 정리 2025. 2. 25. 12:00
운 좋게도 정해진 시간 안에 단계별 문제 전부를 풀 수 있었다. 문제 난도도 낮고, 개수도 많지 않아서 그런 것 같다. 이 중에서 특히 몇 부분은 실수한 것도 있고 나중에 참고하면 좋을 내용도 있어서 정리해본다.
해당 문제: https://www.acmicpc.net/step/2
🌈 파이썬 코드
📦 2738 1번 문제
# 행렬의 덧셈을 구하는 문제 def solution(): row, col = map(int, input().split()) result = [] for i in range(row * 2): if len(result) >= row: newRow = list(map(int, input().split())) for j in range(col): result[i % row][j] += newRow[j] else: result.append(list(map(int, input().split()))) for i in result: print(*i) solution()
- 행렬의 덧셈을 구하면서 자꾸 구해지는 row * 2 이상으로 input이 입력되는 경우가 생겼어서 코드를 살펴보니 esle를 기입하지 않았던 자잘한 실수가 었었던 문제
- list(map())을 통해서 map()에서는 사용할 수 없는 indexing을 list()를 통해서 사용할 수 있었다.
📦 2566 2번 문제
# 최댓값 구하기 import sys # 개선 전 def solution(): lines = sys.stdin.readlines() lines = [list(map(int, line.strip().split())) for line in lines] # 최댓값 찾기 math.max() 같은 걸 이용하자 maxVaule = 0 row = 0 for i in range(len(lines)): if maxVaule >= max(lines[i]): continue else: maxVaule = max(lines[i]) row = i print(maxVaule) print(row + 1, lines[row].index(maxVaule) + 1) solution() # 개선 후 def solution(): lines = sys.stdin.read().strip().split("\n") lines = [list(map(int, line.strip().split())) for line in lines] # 최댓값 찾기 math.max() 같은 걸 이용하자 sortedLines = [sorted(list) for list in lines] maxList = [list[-1] for list in sortedLines] maxValue = max(maxList) row = maxList.index(maxValue) col = lines[row].index(maxValue) print(maxValue) print(row + 1,col + 1) solution()
- RunTimeError가 발생한 문제인데 import sys이걸 같이 입력을 안해줘서 일어났던 문제 사실 로직에는 큰 문제가 없었음
- 입력문인 sys.stdin.readlines() 이걸 사용하면 개행문자가 붙는 불편함과 마지막에 crtl + D도 눌러줘야하는 불편함이 있어서 개선 후 코드가 테스트에 더 나은 것 같다. 실제로 성능은 차이가 없더라
- sort를 하는데 걸리는 비용이 더 클까 걱정을 했지만 차이가 별로 없는 것을 확인
📦 10798 2번 문제
입력을 받을 때 입력 받을 값들의 len을 구해서 최대치만큼 " "으로 다 통일한 다음 더할 때 " "일 시에는 pass하는 식으로 문제를 해결하자
문제를 해결하기 전에는 위와 같은 생각으로 코드를 구현하였지만 후에 코드를 개선하고 나서는 최종적으로 아래와 같은 코드가 나옴
# 세로 읽기 import sys def solution(): result = "" lines = [] for _ in range(5): lines.append(list(sys.stdin.readline().rstrip())) maxLen = max([len(line) for line in lines]) for i in range(maxLen): for j in range(5): if (len(lines[j]) < i + 1): continue result += lines[j][i] return result print(solution())
- 입력문을 받을 때 여러줄을 받는 경우에는 위와 같은 형태로 받는 것도 좋을 것 같다. 실제로 input()과 readlines()보다 간편하다 생각되었음
📦 2563 2번 문제
고민을 많이하다가 결국에는 실마리를 못 잡아서 답지를 찾아본 케이스로 실제로 겹쳐진 넓이를 구하는 문제에서 사용되면 좋을 것 같다. 간단하게 블록은 가장 작은 단위로 쪼개고 그 블록의 개수를 센다는 느낌이였다.
def solution(): N = int(input()) result = 0 array = [[0]* 100 for _ in range(100)] for _ in range(N): x, y = map(int, input().split()) for _x in range(x, x + 10): for _y in range(y, y + 10): array[_x][_y] = 1 for k in range(100): result += array[k].count(1) return result print(solution())
- 나중에 GPT로 확인해보니깐 시간복잡도가 O(N) + O(X^2)이라는 결과가 나왔다 그렇기에 문제 조건을 잘 확인하면서 풀어야할 것 같다.
고민 흔적..
가로 세로 위치에 대한 값이 주어졌는데 3개가 겹친다면 2배수로 빼고 2개가 겹친다면 1배수로 빼면된다.그렇기에 겹치는 크기를 구하면되는데 주어지는 3개의 값은 시작점이다.
그렇기에 시작점에서부터 10까지가 현재 붙여진 값이고겹쳐진 넓이를 구하려면 먼저꺼 2개 구하고 다음꺼 계산하는 재귀함수형태가 되어야하나? 아니다 주어진 값 다 구한 다음에 겹쳐지는 정도를 파악하는 것이 낫다겹쳐진 크기 * (겹쳐진 색종이 -1) 이런식으로 값을 구하면되지않을까?정확한 해결방법이 떠오르진 않는데...
답지 본 후
이건 답이 근데 가로 세로 크기가 적당하게 주어져야 가능한 문제 같음 내가 봤을 때 넓이가 10000 이상되면 좀 문제 있을 듯작게 나누어서 가로 세로 각각을 블록이라고 생각하고 해당 블록을 차지하고있으면 1로 바꾸고 아니면 0으로 한 뒤 해당 블록이 1인 개수를 구하면최종적으로 넓이가 된다는 말임범위의 넓이를 구할 때에는 이걸 떠올려보면 좋을 것 같다 생각보다 활용 가능성 높을 듯? 전체 넓이가 합리적으로 나와있기만한다면...'알고리즘 > 코딩테스트 문제 정리' 카테고리의 다른 글
[Baekjoon] 약수와 소수와 배수 (0) 2025.02.27 [백준] 이분탐색 실버 (0) 2025.02.11 [99클럽] 왜지...? (1) 2025.02.04 [99클럽] stack 구현 (0) 2025.02.03 [99클럽] 이분탐색 활용 (0) 2025.01.22