실력진단
2주차 점수: 347 → 435
지난주에 실력진단에 비해 거의 100점이라는 점수가 올랐다.
하지만 실력진단이 매번 다른 문제가 나온다는 점에서 이번에는 문제 운이 좋았던 것 같다. ㅎㅎ......
그럼에도 이전에 내가 어렵게 생각했던 유형을 좀 더 도전해보고, 발전된다는 것은 느껴진다.
그리고 실력진단에서 더 높은 점수를 얻고자 점차 욕심이 생긴다.
저번주에는 생각보다 공부를 적게했는데, 이번주는 저번주보다 1라도 더 공부해보는 것이 목표이다.
부족했던 점
이번에는 2차원 배열이 부족하다는 평가를 받았다.
2차원 배열 문제 중 하나를 못 풀었는데 시간이 주어진다면 풀 수 있을 것 같았다.(시간안에 못 풀었으면서 해보는 주저리)
시간안에 못 풀었다는 것은 내가 해당 문제를 잘 이해하지 못 하였거나, 접근 방식이 잘못되었을 것이다.
(문제는 작성했으나, 코드 실행결과가 틀렸다😂)
결국은 자기 보호 발언이고 결론적으로는 부족한 것이 맞다.
그렇다면? 공부해야지!
학습 내용
출력결과 11
문제유형: 객관식
본 문제는 주어진 배열을 회전하여 출력하는 것이다.
arr[i][j]
위와 같이 코드를 작성하면 배열이 순서대로 출력된다.
문제에서 주어진 출력결과처럼 되려면 아래와 같이 입력해야한다.
arr[2-j][i]
출력결과 38
문제유형: 객관식
본 문제는 3중첩 반복문을 사용하여 배열 값(0 또는 1)을 비교한 뒤 최종적으로 1이 몇 개인지 출력하는 프로그램이다.
k값을 기준으로 총 3회 나눠 1의 개수를 확인해보면 다음과 같다.
k = 0 | k = 1 | k = 1 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
⚠ 이때 중요한 것은 and는 두 값이 모두 1이여야 True(1)이다.
(필자의 경우 and를 ==과 혼동했다.)
💭 예상 소요 시간 5분이라는데 푸는데 상당한 시간이 걸렸던 문제다. 해당문제는 3중첩인 만큼 규칙성을 찾으면 비교적 쉽게 문제를 해결할 수 있다.
비교의 경우 가로 1번줄, 세로1번줄, 가로2번줄 세로 2번 줄, 가로 3번줄 세로 3번을 대상으로한다.
하나씩 대입해보다가 중간쯤에 배열이 모드 1이 되겠구나 싶었고, 결론적으로 9라는 답에 도달했다.
본 문제를 해결하기 위해 손으로 메모하면서 이해하고, 더 궁금할 경우 코드를 실행하며 확인해볼 것을 추천한다.
코드를 바로 실행하는 것보다 손이나 머리로 코드가 실행되는 원리는 이해하는 것이 중요하기 때문이다.
특정 원소들의 합
n = 4
arr=[]
for _ in range(4):
arr.append(list(map(int, input().split())))
i=0
sum=0
while i<4:
for j in range(i+1):
sum+=arr[i][j]
i+=1
print(sum)
색칠된 칸을 보면 1 → 2 → 3 → 4로 1씩 증가한다.
이를 위해 i값을 1부터 반복분이 1회 끝날 때까지 1씩 증가시킨다.
👉 코드상에서는 배열 인덱스 계산을 위해 0~3으로 증가하도록 코딩했다.
8번째 줄 for j in range(i+1):
의 경우 range(i)로하면 i=0일때 반복문이 실행되지 않음으로 i+1한다.
숫자 직사각형
n, m = map(int, input().split())
arr=[
[0 for _ in range(m)]
for _ in range(n)
]
num=1
for i in range(n):
for j in range(m):
print(arr[i][j]+num, end=' ')
num+=1
print()
⚠이 문제는 n과 m만 입력 받는 문제이다. 처음에 n과 m 그리고 리스트 내 숫자까지 입력 받게 코딩하여 틀렸다. 처음에 왜 틀린거지 고민했었다.. 이번에도 문제를 잘 보자고 다짐한다.
두 배열의 곱
arr1=[
list(map(int, input().split()))
for _ in range(3)
]
input()
arr2=[
list(map(int, input().split()))
for _ in range(3)
]
for i in range(3):
for j in range(3):
print(arr1[i][j]*arr2[i][j], end=' ')
print()
⚠ 두 배열을 입력 받으면서 배열사이에 한 번의 줄바꿈을 입력받아야한다. 다른문제들의 경우 2개 배열을 구분없이 이어서 입력 받는 경우로 있는데, 이번꺼는 줄바꿈을 통해 구분했다. 줄바꿈을 위해서 input()을 한 번 사용했다. 처음에는 이 방법이 맞나싶었는데, 채점후 해설을 보니 동일한 방법을 사용한 것을 확인할 수 있었다.
두 개의 격자 비교하기
n, m = map(int, input().split())
check_arr=[
[1 for _ in range(m)]
for _ in range(n)
]
arr1=[
list(map(int, input().split()))
for _ in range(n)
]
arr2=[
list(map(int, input().split()))
for _ in range(n)
]
for i in range(n):
for j in range(m):
if arr1[i][j] == arr2[i][j]:
check_arr[i][j] = 0
print(check_arr[i][j], end=' ')
print()
n은 행의 개수, m은 열의 개수이다.
확인용 배열을 미리 1로 채워 만들어 둔다.
이후 배열1과 배열2의 값을 비교해 값이 같다면 확인용 배열의 값을 0으로 바꾼다.
💭 본 문제는 코드 실행시 맞았는데 제출 및 채점은 틀렸었다. 반대로 코드 실행은 에러가 나오는데 제출 및 채점은 맞았었다. 이후 다시 접속해 둘 다 다시해보니 문제없이 실행되었다. 초반에는 프로그램의 오류였던 것 같다.