https://www.acmicpc.net/problem/8896
8896번: 가위 바위 보
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 참여하는 로봇의 수 N이 주어진다. 다음 N개 줄에는 각 로봇에 저장되어 있는 문자열이 주어진다. 모든 로봇의 문
www.acmicpc.net
코드
Try 1.
틀렸습니다가 뜬 코드입니다. - 코드길이 : 1280B
robot_li에는 로봇에 대한 모든 입력을, robot_n에는 남은 로봇의 번호를 넣었습니다.
rock_li, scissor_li, paper_li에는 어떤 로봇이 바위, 가위, 보를 냈는지 입력받습니다.
rsp에는 바위, 가위, 보 각각이 해당 사이클에 있는지 세어줍니다.
rsp 인덱스 0~2를 모두 더해서 1또는 3이 나온다면 무승부, 2가 나온다면 승부가 나도록
바위, 가위, 보가 나왔는지를 각각의 인덱스에 저장해놓았습니다.
쓸데없이 많은 리스트를 쓰고 변수를 써서 틀리지 않았나 생각하고 있습니다.
import sys
T = int(sys.stdin.readline().rstrip())
for _ in range(T):
N = int(sys.stdin.readline().rstrip())
robot_li = []
robot_n = [i for i in range(N)]
for i in range(N):
robot_li.append(sys.stdin.readline().rstrip())
k = len(robot_li[0])
for i in range(k):
rsp = [0, 0, 0]
rock_li = []
scissor_li = []
paper_li = []
for j in robot_n:
if robot_li[j][i] == 'R':
rock_li.append(j)
rsp[0] = 1
elif robot_li[j][i] == 'S':
scissor_li.append(j)
rsp[1] = 1
else:
paper_li.append(j)
rsp[2] = 1
check = rsp[0]+rsp[1]+rsp[2] #3 or 1 일 경우에 무승부
if check == 2:
if rsp[0] == rsp[1]: # 바위 + 가위
for k in scissor_li:
robot_n.remove(k)
elif rsp[1] == rsp[2]: #가위 + 보
for k in paper_li:
robot_n.remove(k)
elif rsp[2] == rsp[0]: # 보 + 바위
for k in paper_li:
robot_n.remove(k)
if len(robot_n) == 1:
print(robot_n[0] + 1)
break
if len(robot_n) != 1:
print(0)
Try 2.
성공입니다 - 메모리 30616KB , 시간 40ms , 코드길이 1264B
는 무슨 보+바위 케이스에 잘못썼습니다.
34번째 줄에서 paper_li에 든 로봇을 지우는게 아니라 rock_li에 있는 로봇을 지워야죠 ㅋㅋㅋ
import sys
T = int(sys.stdin.readline().rstrip())
for _ in range(T):
N = int(sys.stdin.readline().rstrip())
robot_li = []
robot_n = [i for i in range(N)]
for i in range(N):
robot_li.append(sys.stdin.readline().rstrip())
k = len(robot_li[0])
for i in range(k):
rsp = [0, 0, 0]
rock_li = []
scissor_li = []
paper_li = []
for j in robot_n:
if robot_li[j][i] == 'R':
rock_li.append(j)
rsp[0] = 1
elif robot_li[j][i] == 'S':
scissor_li.append(j)
rsp[1] = 1
else:
paper_li.append(j)
rsp[2] = 1
check = rsp[0]+rsp[1]+rsp[2] #3 or 1 일 경우에 무승부
if check == 2:
if rsp[2] == 0: # 바위 + 가위
for k in scissor_li:
robot_n.remove(k)
elif rsp[0] == 0: #가위 + 보
for k in paper_li:
robot_n.remove(k)
elif rsp[1] == 0: # 보 + 바위
for k in rock_li:
robot_n.remove(k)
if len(robot_n) == 1:
print(robot_n[0] + 1)
break
if len(robot_n) != 1:
print(0)
후기
Search 🔍
- del과 remove를 제대로 쓴게 맞나 해서 찾아봤습니다.
del은 인덱스를 이용해서 지울때에 사용하고, remove는 요소를 이용해서 지웁니다.
del로 인덱스를 이용해서 지울 때에 주의해야 할 점이 있습니다.
인덱스를 지운다는 것은 해당 숫자가 사라진다는 것입니다.
이 문제에 대입한다면 저는 로봇의 번호에 해당하는 인덱스를 지우려 했습니다.
하지만 지우는 순간 로봇의 인덱스가 사라지는 동시에 로봇의 번호도 사라지게 되는 것입니다.
나중에 로봇의 번호를 알기 위해서는 del을 없애는 것은 옳지 않은 방법입니다.
저같은 경우에는 그냥 쉽게 알아볼 수 있도록 robot_n 리스트를 따로 만들어서 remove했습니다.
대신 반복문을 for j in robot_n 으로 써서 시간을 조금이나마 줄이려 노력은 했습니다. ㅎㅎ
- rsp 리스트는 다른 분의 코드를 참조했습니다.
나중에 중복제거 할 때 이용할 수 있지 않을까 생각이 들었습니다.
궁금한 점 ❓
- rsp = [] 로만 선언할 때 오류
rsp = [0, 0, 0] 으로 선언해야지만 오류가 안 납니다.
'코딩테스트' 카테고리의 다른 글
[백준] 2870 수학숙제 - python (1) | 2023.01.27 |
---|---|
[백준] 1244 스위치 켜고 끄기 - python (1) | 2023.01.27 |
[백준] 2223 금화 - python (2) | 2023.01.26 |
[Python] 백준 1018번 - '체스판 다시 칠하기' 풀이 (1) | 2023.01.25 |
[Python, Java] 백준 3212번 - '피자' 풀이 (1) | 2023.01.23 |