벌써 6주차가 끝나다니
아쉽다.
이전에 풀었던 유형의 문제를
오랜만에 다시 푸니
쉽지가 않다.
이래서 꾸준히하는 것이
중요한 것 같다.
앞으로도 화이팅 ~
학습내용
악수와 전염병의 상관관계 2
문제 정리
1. N명의 개발자 존재
2. 처음 전염병에 걸려 있는 개발자의 번호 P
3. T번에 걸쳐, t초에 x개발자가 y개발자와 악수
3.1) 테스트케이스가 시간순으로 입력되는 것이 아닌
랜덤된 시간순으로 입력된다는 것을 유의
4. K번의 악수 동안만 전염
4.1)K번 이후에는 악수해도 전염되지 않음
4.2) 점연된 사람끼리 악수해도 점연된 걸로 간주
▷ (전염 + 전염 = 전염)
5. 출력내용
- 최종적으로 누가 전염병에 걸리게 되었는지 출력
👉 출력방식: 0(전염x) or 1(전염o) 로 전체 개발자 표현
n, k, p, cnt = map(int, input().split())
people = [0 for _ in range(n)] # 개발자
people[p-1] = 1 # 제시된 전염인
times_left = [k for _ in range(n)] # 남은 감염 횟수
arr_hand = [list(map(int, input().split())) for _ in range(cnt)] # 악수 정보
arr_hand.sort(key = lambda x:x[0]) # 시간순 정렬
for i in range(cnt):
x_person = arr_hand[i][1] - 1
y_person = arr_hand[i][2] - 1
if (people[x_person] == 1 and people[y_person] == 1) and (times_left[x_person]>0 or times_left[y_person]>0):
times_left[x_person] -= 1
times_left[y_person] -= 1
elif people[x_person] == 1 and times_left[x_person]>0:
people[y_person] = 1
times_left[x_person] -= 1
elif people[y_person] == 1 and times_left[y_person]>0:
people[x_person] = 1
times_left[y_person] -= 1
for person in people:
print(person, end ='')
문제의 연산을 하기 전
주어진 조건 정리만 잘 한다면
어렵지 않게 해결 할 수 있는 문제이다.
people = [0 for _ in range(n)]
👉 초반 모든 개발자 비전염상태로 n명 초기화
people[p-1] = 1
👉 제시된 전염인 위치 1로 변경,
이때 p는 1부터 제시됨, 배열은 0부터 시작임으로
인덱스 위치를 p-1을 한다.
times_left = [k for _ in range(n)]
👉 모든 사람은 k번의 감염을 할 수 있다고 가정
따라서 n명은 각각 k번의 감염 가능횟수를 가짐
arr_hand = [list(map(int, input().split())) for _ in range(cnt)]
👉 몇초 (t)에
개발자(x)와 개발자(y)가
악수하는 정보 입력 T번 입력 받음
arr_hand.sort(key = lambda x:x[0])
👉 '문제정리 3.1'에 유의해
악수 정보를 시간순으로 정렬
x[0] = 시간
x[1] = 개발자 x
x[2] = 개발자 y
연산
악수시 전염 여부를 판단하는 법은 다음과 같다.
1. 전염자 + 전염자 이면서
전염자중 1명 이상의 전염 횟수가 1번 이상 남은 경우
- 전염여부는 변경 x
- x, y 개발자의 전염횟수 -1씩 감소
2. 전염자(x) + 비전염자(y) 면서 x의 전염 횟수가 1번 이상 남은 경우
- y를 전염자로 변경 (0 → 1)
- x의 전염횟수 -1 감소
3. 전염자(y) + 비전염자(x) 면서 y의 전염 횟수가 1번 이상 남은 경우
- x를 전염자로 변경 (0 → 1)
- y의 전염횟수 -1 감소
4. 그외의 경우는 일반적인 악수로 칭한다.
틀렸던 점
예시 테스트케이스에 가능횟수가 2회라는 예시를 보고
전염 가능 횟수를 k가 아닌 2로 두고 풀어서 틀림 😂
작은 구슬의 이동
테스트 케이스 예시
n(격자 사이즈) | 3 |
t(소요 시간) | 3 |
r(행) | 1 |
c(열) | 2 |
d(방향) | R |
테스트 케이스가 위의 표와 같을 때
진행 공의 진행 과정은 다음 이미지와 같다.
t = 2일때 벽에 부딪힌다.
이때, 방향을 바꾸는데
1초를 사용하게 된다.
이 같은 과정을 다음과 같은 코드로 나타낼 수 있다.
# 1초마다 한 칸, 상<->하,좌<->우
# 맨 처음이 1행 1열 => [n-1][n-1]형태로 저장해야함
# r행, c열
# 벽에 부딪히면 방향 변경 (1s 소요)
# t초 이후 구슬 위치
n, t = map(int, input().split())
dxs, dys = [0, 1, -1, 0],[1, 0, 0, -1] # 방향 = 3 - 방향
mapper = {'R': 0, 'D':1, 'U':2, 'L':3}
r, c, d = input().split()
r = int(r) - 1
c = int(c) - 1
dir_num = mapper[d]
def in_range(x, y):
return 0<= x and x < n and 0<=y and y<n
for _ in range(t):
nx = r + dxs[dir_num]
ny = c + dys[dir_num]
if not in_range(nx, ny):
dir_num = 3 - dir_num
else:
r, c = nx, ny
# 첫 칸이 1열 1행이라고 문제에 제시되어 있기에 +1
print(r+1, c+1)
시계방향으로 방향을 변경하던
일반적인 dx, dy를 사용하는 것보다
문제에 맞게 변경을 해주는 것이 좋다.
3 - 현재 방향 번호 = 바뀐 방향
이 되도록
dx, dy를 설정한다.
연산은 1초당 둘 중 하나의 동작을 한다.
① 벽에 부딪힘 ▷ 방향만 변경
② 격자 내의 공간 이동 가능▷ 이동
'CODING TEST > Code Tree' 카테고리의 다른 글
[코드트리] L, R 그리고 B 문제 코드 풀이 (0) | 2024.08.28 |
---|---|
[코드트리 조별과제] 5주차 정리(흰검 칠하기 / 신기한 타일 뒤집기) (0) | 2024.08.18 |
[코드트리 조별과제] 4주차 (정렬된 숫자 위치 알아내기 / DateTime to DateTime) (0) | 2024.08.11 |
[코드트리 조별과제] 3주차 정리(출력결과 18 / 출력결과 29 / 재귀함수를 이용한 최소공배수) (0) | 2024.08.04 |
[코드트리 조별과제] 2주차 정리 (그 계절, 그 날 / 함수를 이용한 369 게임) (0) | 2024.07.28 |