실력진단
4주차: 507 → 487
이번주는 지난주보다 점수가 감소했다. 그러나 큰 실망은 없었다. 문제를 풀면서 예전보다 성장했음을 느꼈기 때문이다. 예전에 못 풀었던 문제들을 다시 마주쳤다. 지난번에는 거의 못 풀었다면 이번엔 80 ~ 90%정도는 해결한 것 같다.(아쉽게도 다 풀지는 못 했다.) 점수는 상승하지 못했으나 스스로 성장함을 느꼈기에 나쁘지 않았다.
4주차는 연휴 및 개인적인 스케줄로 평소보다 적은 공부를 했다. 그래도 매주 꾸준히 공부하려고 노력해야겠다.
지난주에 문의했던 내용이 답변은 오지 않았다. 하지만 문의했던 실력진단 시스템이 원래대로 돌아온 것 같다. 당시의 일시적인 오류인지, 다시 바뀐지는 모르겠으나 일단은 원래대로 돌아왔다.
부족한 점
3주차에 이어서 시뮬에이션이 부족하다는 진단을 받았다. 그래서 4주차도 dx, dy에 대한 공부를 했다.
학습내용
되돌아오기2
command = input()
look=3
x, y = 0, 0
dxs, dys = [1, 0, -1, 0], [0, 1, 0, -1]
time=0
arrive=False
for cmd in command:
time+=1
if cmd=='F':
x, y = x+dxs[look], y+dys[look]
if x==0 and y==0:
arrive=True
break
elif cmd=='L':
look = (look+1)%4
elif cmd=='R':
look = (look-1)%4
if arrive==True:
print(time)
else:
print(-1)
F, R, L로 이루어진 문자열을 한 줄 입력 받는다.
F는 전진, R, L은 각각 오른쪽, 왼쪽으로 방향전환이다.
시작점은 (0, 0) 북쪽을 바라보는 방향이다.
방향전환은 R인 경우 +1한뒤 4로 나눈 나머지를 구하고
L인 경우 -1을 한 뒤 4로 나눈 나머지를 구한다.
입력 받은 문자열대로 이동을 수행하여 그 안에 시작점(0, 0)으로 돌아오면 이동 횟수 출력,
못 돌아오면 -1을 출력한다.
시작점으로 돌아오는 지는 F인 경우 전진할 때마다 검사한다. arrive가 True면 돌아온 것이고, False면 돌아오지 못한 것이다.
💭 처음에 입력을 배열로 받으려고 했다. 하지만 입력예제는 띄어쓰기 없어 문자열로 입력받아야했다.
어떻게 한 글자씩 뽑아낼까 고민했는데 결론적으로는 그냥 for문에 문자열을 사용하면 된다.
for 변수명 in 문자열
격자 위의 편안한 상태
n, m = map(int, input().split())
arr=[
[0]*n
for _ in range(n)
]
dxs, dys = [1, 0, -1, 0],[0, 1, 0, -1]
def in_range(x, y):
return 0<= x and x < n and 0 <= y and y < n
for i in range(m):
check=0
r, c = map(int, input().split())
r -= 1
c -= 1
arr[r][c] = 1
for dx, dy in zip(dxs, dys):
y, x = r + dy, c + dx
if in_range(x, y) and arr[y][x] == 1:
check+=1
if check==3:
print(1)
else:
print(0)
n * n 크기의 배열을 0으로 초기화 한다.
m번 만큼 r행, c열을 입력 받는다.
(입력은 최소 1의 크기부터 입력 받는다. 따라서 배열의 최소 크기인 0을 맞추기 위해 r, c를 각각 -1 한다.)
입력 받은 위치의 배열 값을 1로 바꾼다.
입력 받은 위치를 기준으로 상, 하, 좌, 우에 1이 3개 있는지 검사한다.
만약 3개면 1을 출력하고 3미만 또는 3초과인 경우 0을 출력한다.
💭문제 자체는 어렵지 않았는데 r, c인 행, 열이 코드 작성때 헷갈려서 시간을 소모했다. dx, dy는 수학과 x, y계산이 달라서 익숙해지는게 중요한 것 같다.
이번주는 지난 날들에 비해 풀은 문제수가 적지만 쉬어가는 주라고 생각하며 다음주를 기약한다.