생각보다 시간이 소요되었던
문제였다.
명령어 하나 실수로
완전 다른 기능인
코드가 될 수 있다.
실수하지 말고 꼼꼼하게 살피자
학습내용
흰검 칠하기
문제가 길어서 형광펜으로 칠해봤다.
(더 복잡해진 것 같기도..😅)
문제 정리
1. 무한이 나열된 타일
1) 문제의 입력 최대 범위을 확인한다.
- 1 ≤ n ≤ 1,000
- 1 ≤ x ≤ 100
1.1) 최대 1,000번 x값으로100을 받는 경우가 있다.
→ 1,000 x 100 = 100,000
1.2) 방향은 L인 -(마이너스), R인 +(플러스)가 있다.
배열은 마이너스가 존재하지 않기 때문에,
100,000을 더하여 마이너스를 없애 보정한다.
👉 최종 타일의 범위 0 ~ 200,000
2. 아무 타일에서 시작
L 방향으로 최대 -100,000
R방향으로 최대 +100,000이 가능함으로
200,000의 중간인
👉 100,000을 시작위치로 한다.
3. 방향에 따른 색상
L → 흰색 ⬜
R → 검은색 ⬛
흰색(2번 이상) & 검은색(2번 이상) → 회색 🔲
(※ 흰색 또는 검은색이
1개만 2번 이상일 경우엔 회색 아님)
4. 칠하는 범위와 위치 ⭐
"현재위치" 포함한 x칸 칠한 후
마지막으로 칠한 위치에서 종료
5. 출력내용
각 3가지 색상에 대한 타일 수
코드
ARR_LEN = 200000
arr_num = [[0,0] for _ in range(ARR_LEN)] #[white, black]
arr_color = ['N' for _ in range(ARR_LEN)]
now = ARR_LEN // 2
n = int(input())
for i in range(n):
color = 'N'
color_num = -1
go, dic = input().split()
go = int(go)
if dic == 'R':
start = now
end = now + go
color, color_num = 'B', 1
now = end - 1
else:
start = now - go + 1
end = now + 1
color, color_num = 'W', 0
now = start
for i in range(start, end):
if arr_color[i] == 'G':
continue
arr_num[i][color_num] += 1
arr_color[i] = color
if arr_num[i][0] >= 2 and arr_num[i][1] >=2:
arr_color[i] = 'G'
print(arr_color.count('W'), arr_color.count('B'), arr_color.count('G'))
배열로 방향을 이동하며 칠할 때,
왼쪽은
현재로 부터 얼마나 앞에서 부터 칠할거냐 (-),
오른쪽은
현재로부터 얼마나 뒤에까지 칠할거냐로 생각한다(+).
색을 칠하는건 오른쪽 방향이지만
방향에 따라 시작지점과 끝지점을 설정한다고 생각한다.
R명령어에서 주의할 점은
연산 후 위치이다.
시작지점이 0 이라고 할때,
0+3 = 3으로, 현재 위치를 포함으로
0~2를 칠하게 된다.
"마지막으로 칠한 위치에서 종료"라는 조건에 맞게
연산 후 위치는
0+3-1
= 시작위치 + x - 1
= 종료위치 -1
L명령어에서 주의할 점은
시작과 종료지점이다.
처음위치가 0 이라고 할때,
시작지점은
0 - 3 + 1 = 2
= 처음위치 - x + 1
종료지점은
처음위치를 포함해야하기 때문에,
0 + 1 = 1
= 처음위치 + 1
한칸만 칠해지는 경우를 보면
위의 사진과 같은 과정으로 진행된다.
추가로 틀렸던 부분에 대해 기록한다.
#===[올바른 코드]============
for i in range(start, end):
if arr_color[i] == 'G':
continue
#===[틀린 코드]============
for i in range(start, end):
if arr_color[i] == 'G':
break
continue를 써줘야하는데
break를 사용해서 계속 오답이 되었다.
과정을 살펴보며 실수하지 말자.
신기한 타일 뒤집기
ARR_LEN = 200000
arr_color = ['N' for _ in range(ARR_LEN)]
now = ARR_LEN // 2
n = int(input())
for i in range(n):
color = 'N'
color_num = -1
go, dic = input().split()
go = int(go)
if dic == 'R':
start = now
end = now + go
color, color_num = 'B', 1
now = end - 1
else:
start = now - go + 1
end = now + 1
color, color_num = 'W', 0
now = start
for i in range(start, end):
arr_color[i] = color
print(arr_color.count('W'), arr_color.count('B'))
흰검 칠하기에서 회색 타일만 없는 문제다.
색상을 제외한 내용이 유사하여
이전 문제 풀이로 대체한다.
위의 문제가 어렵다면
'신기한 타일 뒤집기'문제 부터 풀어보는 걸 추천한다.
'CODING TEST > Code Tree' 카테고리의 다른 글
[코드트리] L, R 그리고 B 문제 코드 풀이 (0) | 2024.08.28 |
---|---|
[코드트리 조별과제] 6주차 정리 (악수와 전염병의 상관관계 2 / 작은 구슬의 이동) (0) | 2024.08.25 |
[코드트리 조별과제] 4주차 (정렬된 숫자 위치 알아내기 / DateTime to DateTime) (0) | 2024.08.11 |
[코드트리 조별과제] 3주차 정리(출력결과 18 / 출력결과 29 / 재귀함수를 이용한 최소공배수) (0) | 2024.08.04 |
[코드트리 조별과제] 2주차 정리 (그 계절, 그 날 / 함수를 이용한 369 게임) (0) | 2024.07.28 |