실력진단
3주차: 435 → 506
💭 진단 히스토리에서 체크할 부분은 지난주 이전의 그래프 모양과, 이번주 9.20~ 부터의 그래프이다.
지난주의 경우 이전과 점수 및 그래프가 바뀌어 있어서 문의를 드렸더니 실력진단 점수 기준이 새롭게 바뀌어서 변경된 사항이라고 하셨다. (오히려 점수가 높아져서 기분은 좋았다 😄)
👇 실력진단하면서 문의한 이야기
이번주 그래프의 경우 시작이 무려 0점이다. 그리고 실력진단을 4번이나 했다.
0점의 경우 나도 당황스러웠다. 실력진단의 처음문제는 대부분 단순한 출력을 하는 문제인데 제출전 코드 실행에서 정답이라고 체크되었고, 스스로 봐도 다른 테스트케이스를 넣어 볼 필요가 없는 문제였다. 그런데 제출했더니 오답이라고 뜨고 0점으로 채점되었다..(이후 다시 실력진단할 때 동일한 문제가 나와 다시 풀어 제출할 땐 문제가 없었다.)
3주차 처음 실력진단부터 이러니 당황스러웠지만 그러려니하고 다시 실력진단을 봤다.
이후에도 비슷한 문제를 겪었다. 코드실행시에는 정답이라고 하여 제출했는데 오답처리되었다.
→ (이런 경우 다른 테스트 케이스를 넣어 실행해보면 답이 아닌 프로그램인 경우도 있다. 이런 경우는 사용자의 코드가 잘못된 것이 맞다.)
나의 경우에도 하나의 테스트 케이스만 맞고 다른 테스트 케이스로 실행하면 오답인 경우였을 것이다. 그래서 채점결과에는 불만이 없다.
하지만 날 당황하게 한 것은 이전과 달라진 제출 방식이었다. 2주차까지는 제출시에도 오답인 경우 다음문제로 바로 넘어가는 것이 아닌, 오답인 문제를 시간내에 다시 풀어볼 기회가 주어졌다. 그러나 이번주부터는 바로 오답으로 채점되어 다음문제로 넘어가거나 진단이 끝나버렸다. 방식이 바뀌었다면 이에 적응하면 되는 것인데 어떠한 안내를 받지 못하고 바뀌어 버리니 당황스러웠을 뿐이다.
그래서 위의 3가지 문제들을 코드트리에 문의드린 상황이다.
처음에 바뀐 점수또한 점수기준이 변경되었다는 답변을 받은 것이다. 이외에 실력진단에 대한 2가지 문의 내용은 확인되면 답변주신다고 연락을 받았다. (답변을 받으면 위의 의문점들에 대해 추가로 글을 작성할 예정이다.)
위의 내용들은 혹여 나 처럼 바뀐 점수나 실력진단 환경을 겪어 궁금한 분들이 있을까 남기게 되었다.
(문의 과정중에 한 가지 감동받은 점이 있었다. 문의를 남긴 시간은 평일 저녁으로 코드트리의 운영시간이 아니었다. 문의하는 곳에도 평일 9:00부터 운영하며 운영시간에 답변을 드린다고 안내가 되어있다. 그래서 저녁에 문의를 남기고 다음날 답변을 받아야지라는 생각을 했다. 그런데 답변해주시는 분께서 당일 답장을 보내주셨다. 퇴근 후 개인 시간이실텐데 시간을 내주셔서 너무 놀랐다. 또한 너무 친절한 말투에 감동이었다... 어떤 분인지는 말씀드릴 수 없지만 다시 한 번 감사하다는 인사를 드리고싶다.😊 저녁시간 답변은 특이케이스이기 때문에 원래는 당연히 문의 운영시간에만 답변이 오는 것이 맞다..!)
일단 위의 일들로 부터 2일뒤 다시 실력진단을 봤고 이때는 문제가 없었다.
부족한 점
시뮬레이션 학습이 부족하다는 진단을 받았다. 이전에도 같은 피드백을 받은 적있다(1주차). 그래서 당시 공부를 한 기억으로 문제 작성까지는 했으나 결과는 오답이었다. 아직은 어떤 부분이 잘못되었는지 모르지만 이번주 공부를 해나가면서 알아갔으면한다!
학습 내용
1이 3개 이상 있는 위치
n = int(input())
arr=[
list(map(int, input().split()))
for _ in range(n)
]
dxs, dys = [0, 1, 0, -1], [1, 0, -1, 0]
# 격자 안에 있는지 확인하는 함수
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
cnt = 0
all_cnt=0
for i in range(n):
for j in range(n):
for dx, dy in zip(dxs, dys):
nx, ny = i + dx, j + dy
if in_range(nx, ny) and arr[nx][ny]:
cnt +=1
if cnt >= 3:
all_cnt+=1
cnt=0
print(all_cnt)
n * n 칸의 격자 상태를 0으로 만든다.
격자를 한 칸씩 체크한다. 체크하는 격자마다 상, 하, 좌, 우에 1이 3개 이상 있는 경우를 체크한다.
즉, 주변에 1이 3개 이상인 격자의 개수를 체크한다.
격자를 확인하면서 위의 경우가 맞는 경우 변수 cnt를 1 증가시킨다.
작은 구슬의 이동
n, t = map(int, input().split())
r, c, d = input().split()
r=int(r)
c=int(c)
mapper={
'R': 0,
'D': 1,
'U': 2,
'L': 3
}
dxs, dys=[1, 0, 0, -1], [0, 1, -1, 0]
dir_num=mapper[d]
def in_range(x, y):
return 0<x and x<=n and 0<y and y<=n
for i in range(t):
nx, ny = c + dxs[dir_num], r + dys[dir_num]
if not in_range(nx, ny):
dir_num = 3 - dir_num
else:
r, c = r + dys[dir_num], c + dxs[dir_num]
print(r, c)
U | D | R | L |
위 | 아래 | 오른쪽 | 왼쪽 |
이 문제는 좌↔우 또는 상↔하 둘 중 하나로만 움직인다.
따라서 다른 이동문제처럼 이동 배열을 우, 하, 좌, 상(시계방향)으로 배치하지 않는다.
편한 계산을 위해 dxs, dys 배열을 0, 4 그리고 1, 3으로 배치한다.
위 처럼 배치하면 방향을 계산할 때 편리하다. dir_num이 방향으라고 할 때, 3 - dir_num을 하면 좌,우 또는 상, 하로 계산된다.
- 벽에 부딪힌 경우 → 방향만 바꾼다.
- 벽에 부딪히지 않은 경우 → 이동한다.
빙빙 돌며 숫자 사각형 채우기
n, m = map(int, input().split())
arr=[
[0] * m
for _ in range(n)
]
def in_range(x, y):
return 0<=x and x < n and 0 <= y and y < m
dxs, dys=[0, 1, 0, -1], [1, 0, -1, 0]
x, y = 0, 0
dir_num=0
arr[x][y]=1
for i in range(2, n * m + 1):
nx, ny = x+dxs[dir_num], y+dys[dir_num]
if not in_range(nx, ny) or arr[nx][ny] != 0:
dir_num = (dir_num + 1) % 4
x, y = x + dxs[dir_num], y + dys[dir_num]
arr[x][y]=i
for i in range(n):
for j in range(m):
print(arr[i][j], end=' ')
print()
시계방향으로 외곽에서 안쪽으로 숫자를 채운다.
기본적으로 배열은 0으로 초기화하고 지나간 자리는 지나간 순서대로 숫자가 채워진다.
즉, 0만 이전에 안 간 배열의 좌표이다.
예비 좌표인 nx, ny를 먼저 이동시킨다. 이동시킨 예비 좌표가 벽에 부딪히거나 이미 간 격자인지 확인한다.
부딪히거나 이미간 격자라면 방향을 시계방향으로 바꾼 뒤, 진짜 좌표인 x, y를 이동 시킨다.
만약 부딪히지 않고, 안 가본 격자라면 방향을 바꾸지 않고, 진짜 좌표 x,y를 현재 방향으로 1칸 이동하며 숫자를 채운다.
위 과정을 배열의 크기인 n * m만큼 한다. 이때 처음 [0][0]위치는 반복문 전에 1로 채우고 반복문은 2부터 시작한다.
(2 ~ n*m + 1)
되돌아오기
n = int(input())
x, y = 0, 0
dxs, dys = [1, 0, -1, 0], [0, 1, 0, -1]
arr = []
dir_check={'E':0, 'S':1, 'W':2, 'N':3}
for _ in range(n):
arr.append(input().split())
move_sum = 0
finish=False
for dir_str, move_num in arr:
dir_num = dir_check[dir_str]
move = int(move_num)
for i in range(move):
y, x = y+dys[dir_num], x+dxs[dir_num]
move_sum+=1
if y == 0 and x == 0:
finish=True
break
if finish == True:
break
if finish==True:
print(move_sum)
else:
print(-1)
문자열 방향을 나타내는 숫자를 미리 정의한다.
n번 움직인 후 원래 자리인 (0, 0)으로 돌아오는지 finish변수로 나타낸다.
n번 움직이는 동안 x와 y를 이동시킨 후, x, y가 둘 다 0이면 n번의 이동을 그만한다.
반복문이 끝난 뒤 finish가 True이면 총 몇번 이동을 했는지 출력한다.
False이면 -1을 출력한다.
dx, dy를 공부할 때는 x, y가 격자에서 수학과 다르다는 것이다. 수학은 위가 +1인데 배열에서는 위가 -1이다.
방향이 달라서 매번 헷갈리지 않고 푸는 것이 필요하다. 문제를 풀 수록 정의할 때는 x, y라고 적고, 문제 풀 때는 y, x로 적게되는 것 같다. y가 '행'이고 x를 '열'이기 때문이다. 익숙해지는 연습이 필요할 것 같다.