728x90
💡 오늘의 학습 키워드
- View
- Flatten
- Sum
🥉 View
문제 링크 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV134DPqAA8CFAYh
문제 설명
더보기
강변에 빌딩들이 옆으로 빽빽하게 밀집한 지역이 있다.
이곳에서는 빌딩들이 너무 좌우로 밀집하여, 강에 대한 조망은 모든 세대에서 좋지만
왼쪽 또는 오른쪽 창문을 열었을 때 바로 앞에 옆 건물이 보이는 경우가 허다하였다.
그래서 이 지역에서는 왼쪽과 오른쪽으로 창문을 열었을 때, 양쪽 모두 거리 2 이상의 공간이 확보될 때
조망권이 확보된다고 말한다.
빌딩들에 대한 정보가 주어질 때, 조망권이 확보된 세대의 수를 반환하는 프로그램을 작성하시오.
아래와 같이 강변에 8채의 빌딩이 있을 때, 연두색으로 색칠된 여섯 세대에서는
좌우로 2칸 이상의 공백이 존재하므로 조망권이 확보된다. 따라서 답은 6이 된다.
A와 B로 표시된 세대의 경우는 왼쪽 조망은 2칸 이상 확보가 되었지만
오른쪽 조망은 한 칸 밖에 확보가 되지 않으므로 조망권을 확보하지 못하였다.
C의 경우는 반대로 오른쪽 조망은 2칸이 확보가 되었지만 왼쪽 조망이 한 칸 밖에 확보되지 않았다.
제한 사항
1. 가로 길이는 항상 1000이하로 주어진다.
2. 맨 왼쪽 두 칸과 맨 오른쪽 두 칸에는 건물이 지어지지 않는다. (예시에서 빨간색 땅 부분)
3. 각 빌딩의 높이는 최대 255이다.
문제 회고
💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지
반복문에서 값을 비교하여 정답을 도출하는 단순 구현 문제였습니다. 문제 해결 과정은 다음과 같습니다.
- 저장된 빌딩 높이 값들을 순회합니다.
- 2칸 이내의 높은 건물이 있는 경우를 비교합니다.
- 2칸 이내 건물 중 가장 높은 건물을 찾습니다.
- 가장 높은 건물과 해당 건물 간의 차이의 세대 수를 저장합니다.
값을 비교하고 최대 값을 도출해낼 수 있다면 쉽게 풀 수 있는 문제였습니다.
💡 내가 해결한 방식은?
b_num = int(input())
b_list = list(map(int, input().split()))
answer = 0
for i in range(2, b_num-2):
# 2칸 이내에 높은 건물이 있을 경우
if b_list[i] > b_list[i-1] and b_list[i] > b_list[i-2] and b_list[i] > b_list[i+1] and b_list[i] > b_list[i+2]:
# 2칸 이내 건물 중 가장 높은 건물 찾기
max_building = max(b_list[i-1], b_list[i-2], b_list[i+1], b_list[i+2])
# 가장 높은 건물과 차이만큼 조망권 확보
answer += b_list[i] - max_building
print(answer)
🥉 Flatten
문제 링크 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV139KOaABgCFAYh
문제 설명
더보기
한 쪽 벽면에 다음과 같이 노란색 상자들이 쌓여 있다.
높은 곳의 상자를 낮은 곳에 옮기는 방식으로 최고점과 최저점의 간격을 줄이는 작업을 평탄화라고 한다.
평탄화를 모두 수행하고 나면, 가장 높은 곳과 가장 낮은 곳의 차이가 최대 1 이내가 된다.
평탄화 작업을 위해서 상자를 옮기는 작업 횟수에 제한이 걸려있을 때,
제한된 횟수만큼 옮기는 작업을 한 후 최고점과 최저점의 차이를 반환하는 프로그램을 작성하시오.
가장 높은 곳에 있는 상자를 가장 낮은 곳으로 옮기는 작업을 덤프라고 정의한다.
위의 예시에서 제1회 덤프를 수행한 이후 화면은 다음과 같다.
A부분의 상자를 가장 낮은 B부분에 덤프하였으며, A대신 A’부분의 상자를 사용해도 무방하다.
다음은 제2회 덤프를 수행한 이후의 화면이다.
A’부분의 상자를 옮겨서, C부분에 덤프하였다. 이때 C 대신 C’부분에 덤프해도 무방하다.
2회의 덤프 후, 최고점과 최저점의 차이는 8 – 2 = 6 이 되었다 (최초덤프 이전에는 9 – 1 = 8 이었다).
덤프 횟수가 2회로 제한된다면, 이 예시 문제의 정답은 6이 된다.
제한 사항
1. 가로 길이는 항상 100으로 주어진다.
2. 모든 위치에서 상자의 높이는 1이상 100이하로 주어진다.
3. 덤프 횟수는 1이상 1000이하로 주어진다.
4. 주어진 덤프 횟수 이내에 평탄화가 완료되면 더 이상 덤프를 수행할 수 없으므로
그 때의 최고점과 최저점의 높이 차를 반환한다 (주어진 data에 따라 0 또는 1이 된다).
문제 회고
💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지
이 문제 또한 반복문에서 값을 비교하고 정답을 도출하는 단순 구현 문제입니다. 문제 해결 과정은 다음과 같습니다.
- 덤프 횟수만큼 반복문을 순회합니다.
- 가장 높은 상자와 가장 낮은 상자의 높이 값을 저장합니다.
- 저장된 상자 리스트에서 가장 높은 상자와 가장 낮은 상자의 인덱스 값을 찾습니다.
- 해당 인덱스 값에 위치한 상자들에 평탄화 작업을 수행합니다.
- 덤프 횟수가 끝나면 최종 상자 높이 결과를 리턴합니다.
이 문제 또한 값을 비교하고 최대, 최소 값을 이용하여 쉽게 해결할 수 있었습니다.
💡 내가 해결한 방식은?
dump_num = int(input())
box_height_list = list(map(int, input().split()))
while dump_num:
# 가장 높은 박스와 가장 낮은 박스 찾기
max_num = max(box_height_list)
min_num = min(box_height_list)
# 평탄화 작업 수행
box_height_list[box_height_list.index(max_num)] -= 1
box_height_list[box_height_list.index(min_num)] += 1
dump_num -= 1
print("max_num - min_num: ", max(box_height_list) - min(box_height_list))
🥉 Sum
문제 링크 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV13_BWKACUCFAYh
문제 설명
더보기
다음 100X100의 2차원 배열이 주어질 때, 각 행의 합, 각 열의 합, 각 대각선의 합 중 최댓값을 구하는 프로그램을 작성하여라.다음과 같은 5X5 배열에서 최댓값은 29이다.
제한 사항
1. 총 10개의 테스트 케이스가 주어진다.
2. 배열의 크기는 100X100으로 동일하다.
3. 각 행의 합은 integer 범위를 넘어가지 않는다.
4. 동일한 최댓값이 있을 경우, 하나의 값만 출력한다.
문제 회고
💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지
2차원 배열의 행과 열, 대각선의 합을 반복문을 통해 차례대로 구한 후 최댓 값을 구하는 구현 문제입니다.
2차원 배열에서 값을 조정하고 원하는 값을 구할 수 있다면 간단히 해결할 수 있었습니다.
💡 내가 해결한 방식은?
arr = [list(map(int, input().split())) for _ in range(100)]
max_num = float('-inf')
# 각 행의 합 구하기
for i in range(100):
row_sum = 0
for j in range(100):
row_sum += arr[i][j]
if row_sum > max_num:
max_num = row_sum
# 각 열의 합 구하기
for i in range(100):
col_sum = 0
for j in range(100):
col_sum += arr[j][i]
if col_sum > max_num:
max_num = col_sum
# 대각선의 합 구하기
left_sum, right_sum = 0, 0
for i in range(100):
left_sum += arr[i][i]
right_sum += arr[i][99-i]
if left_sum > max_num:
max_num = left_sum
elif right_sum > max_num:
max_num = right_sum
print(max_num)
✍️ TIL
간단한 구현문제들이었다. 특별한 로직을 사용하기보다 빠르게 풀어내는게 포인트