반응형
1. 이상한 나라의 덧셈게임
문제 해결
D4 | 수학?
1. 무언가 규칙이 있을 것만 같은 문제이다.
2. "서로 최선을 다해 게임을 한다고 할 때" 여기에서 많은 고민을 했을 것이다. 최적의 방법을 생각하기 위해
3. 하지만 그런거 없다. 숫자가 정해진 순간 어떻게 하던지 답은 정해져 있다.
4. 스택을 만들어 숫자를 하나하나 넣는다.
5. 숫자를 두개씩 꺼내어 더해준다.
6. 더해진 숫자가 두자리이면 쪼개서, 한자리이면 그대로 다시 스택에 넣어준다. 이 때 카운트를 하나씩 세어준다.
7. 스택에 남은 숫자가 1개가 될 때까지 반복한다.
8. 카운트가 짝수이면 B의 승리, 홀수이면 A의 승리
🌦 여러가지 경우의 수를 따져 본 결과 어떤 순서로 하던지 결과는 바뀌지 않는다.
소스 코드
for tc in range(1, 1 + int(input())):
numbers = list(input())
cnt = 0
while len(numbers) > 1:
a = int(numbers.pop())
b = int(numbers.pop())
c = a + b
d = str(c)
if len(d) > 1:
numbers.append(int(d[0]))
numbers.append(int(d[1]))
else:
numbers.append(c)
cnt += 1
answer = ""
if cnt % 2:
answer = 'A'
else:
answer = 'B'
print('#{} {}'.format(tc, answer))
출처: SW Expert Academy
앨리스와 토끼는 덧셈을 이용한 간단한 게임을 같이 하기로 했다. 먼저 어떤 양의 정수를 하나 정해 그 수로 게임을 시작한다. 둘은 서로의 차례에 인접한 두 자리를 선택하고, 이 두 자리를 선택된 두 숫자의 합으로 교체하여 상대에게 차례를 넘긴다. 예를 들어, “1234”의 십의 자리와 백의 자리를 선택하면 다음 차례에는 수가 “154”가 된다. “5678”의 십의 자리와 백의 자리를 선택하면 다음 차례에는 수가 “5138”이 된다. 이렇게 차례를 반복 하다가 자기 차례에 넘어온 수가 한 자리가 되면 그 사람이 패배하게 된다. 게임을 시작할 때의 정수가 주어진다. 앨리스가 먼저 차례를 가지고, 서로 최선을 다해 게임을 한다고 할 때 어떤 사람이 게임에서 승리하게 될 것인지 구하는 프로그램을 작성하라. [입력] 첫 번째 줄에 테스트 케이스의 수 T가 주어진다. 각 테스트 케이스의 첫 번째 줄에는 1000자리 이하의 양의 정수가 하나 주어진다. 제일 첫 번째 자리는 0이 아니다. [출력] 각 테스트 케이스마다 앨리스가 이기면 ‘A’를, 토끼가 이기면 ‘B’를 출력한다. |
1. 삼성시의 버스 노선
문제 해결
D3 | 배열 다루기?
1. 정류장은 1번부터 5000번까지 있다. 0으로 이루어진 배열을 5000까지 미리 만들어 둔다.
2. A부터 B까지의 범위로 for문을 돌려 아까 만들어둔 배열에 해당 인덱스의 값을 1씩 더해준다.
3. P개의 정류장에 대하여 각각 전에 만들어둔 배열의 인덱스에 접근하여 해당 값을 가져온다.
☔ 문제가 헷갈리게 나와있다. 구해야 하는 정류장은 전체 정류장이 아니다. 순서대로 나오는것도 아니다. 그냥 인풋값을 받아서 해당 정류장에 대한 값을 구하면 된다.
소스 코드
for tc in range(1, 1+int(input())):
N = int(input())
# 버스 정류장 배열
bus_stop = [0]*5001
# 각각의 정류장에 대하여 +1씩 더해준다.
for _ in range(N):
a, b = map(int, input().split())
for i in range(a, b+1):
bus_stop[i] += 1
P = int(input())
answer = []
# 구하고자 하는 정류장의 값을 답에 넣어준다.
for i in range(P):
p = int(input())
answer.append(bus_stop[p])
print('#{} {}'.format(tc, ' '.join(list(map(str, answer)))))
출처: SW Expert Academy
삼성시에 있는 5,000개의 버스 정류장은 관리의 편의를 위해 1에서 5,000까지 번호가 붙어 있다. 그리고 버스 노선은 N개가 있는데, i번째 버스 노선은 번호가 Ai이상이고, Bi이하인 모든 정류장만을 다니는 버스 노선이다. P개의 버스 정류장에 대해 각 정류장에 몇 개의 버스 노선이 다니는지 구하는 프로그램을 작성하라. [입력] 첫 번째 줄에 테스트 케이스의 수 T가 주어진다. 각 테스트 케이스의 첫 번째 줄에는 하나의 정수 N ( 1 ≤ N ≤ 500 )이 주어진다. 다음 N개의 줄의 i번째 줄에는 두 정수 Ai, Bi ( 1 ≤ Ai ≤ Bi ≤ 5,000 )가 공백 하나로 구분되어 주어진다. 다음 줄에는 하나의 정수 P ( 1 ≤ P ≤ 500 )가 주어진다. 다음 P개의 줄의 j번째 줄에는 하나의 정수 Cj ( 1 ≤ Cj ≤ 5,000 ) 가 주어진다. [출력] 각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고 한 칸을 띄운 후, 한 줄에 P개의 정수를 공백 하나로 구분하여 출력한다. j번째 정수는 Cj번 버스 정류장을 지나는 버스 노선의 개수여야 한다. |
반응형
'Algorithm Problem > Python' 카테고리의 다른 글
[python] SWEA - 5550. 나는 개구리로소이다 (0) | 2020.08.06 |
---|---|
[python] SWEA - 7465. 창용 마을 무리의 개수 / 10200. 구독자 전쟁 (0) | 2020.08.05 |
[python] SWEA - 7701. 염라대왕의 이름 정렬 (0) | 2020.08.03 |
[python] SWEA - 5432. 쇠막대기 자르기 (0) | 2020.07.31 |
[python] SWEA - 4613. 러시아 국기 같은 깃발 (0) | 2020.07.30 |