300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- PYTHON
- 네트워크
- 동적프로그래밍
- 백준
- 순열
- 동적 프로그래밍
- 킥스타트
- BFS
- CSS
- 운영체제
- 코딩테스트
- 프로그래밍
- DFS
- 코딩 테스트
- dp
- 딥러닝
- kick start
- OS
- 그래프
- 코딩
- linux
- 브루트포스
- 프로그래머스
- 알고리즘
- google coding competition
- 리눅스
- AI
- 파이썬
- 구글 킥스타트
- nlp
Archives
- Today
- Total
오뚝이개발자
[Google Kick Start] 2021 구글 킥스타트 Round D Arithmetic Square 풀이 본문
코딩 테스트/Google Kick Start
[Google Kick Start] 2021 구글 킥스타트 Round D Arithmetic Square 풀이
땅어 2021. 11. 14. 15:13728x90
300x250
문제
https://codingcompetitions.withgoogle.com/kickstart/round/00000000004361e3/000000000082b813
나의 풀이
Arithmetic sequence인지 아닌지 검사하는 방법은 쉬우니 중요한 가운데 원소의 선택에 대해서만 고민하면 된다. 가운데 원소(1행1열 원소)를 기준으로 가로, 세로, 대각선 2개 방향에 대해서 이들이 최대한 많이 arithmetic sequence가 되도록 하는 원소가 무엇일지 생각해봐야 한다.
만약 arithmetic sequence에서 a1, a3이 주어졌다면 a2는 a1과 a3의 평균이다. 따라서 1행 1열 원소를 기준으로 가로, 세로, 대각선 2개 방향에 대해 이 같은 양 끝 원소의 평균을 구하고 가장 빈번하게 등장하는 숫자를 가운데 원소로 하면 된다. 여기서 주의할 점은 만약 a1=10, a3=9라면 2로 나누었을 때 정수가 아닌 9.5가 된다. 이러한 경우는 배제하면 된다. 왜냐하면 애초에 문제 조건에서 interger로 이루어진 행렬이라 했으므로.
코드
T = int(input())
for t in range(T):
A = []
for i in range(3):
temp = list(map(int, input().split()))
if i==1:
temp = [temp[0]] + ['N'] + [temp[1]]
A.append(temp)
avg = []
if (A[0][0]+A[2][2])%2 == 0:
avg.append((A[0][0]+A[2][2])//2)
if (A[0][1]+A[2][1])%2==0:
avg.append((A[0][1]+A[2][1])//2)
if (A[0][2]+A[2][0])%2==0:
avg.append((A[0][2]+A[2][0])//2)
if (A[1][0]+A[1][2])%2==0:
avg.append((A[1][0]+A[1][2])//2)
avg_cnt = {}
for k in avg:
if k not in avg_cnt:
avg_cnt[k] = 1
else:
avg_cnt[k] += 1
# find max count
max_cnt = 0
for k in avg_cnt:
max_cnt = max(max_cnt, avg_cnt[k])
for k in avg_cnt:
if avg_cnt[k]==max_cnt:
max_cnt_num = k
A[1][1] = max_cnt_num
# 4 edge check
edge_cnt = 0
if A[0][1]-A[0][0] == A[0][2]-A[0][1]:
edge_cnt += 1
if A[1][2]-A[0][2] == A[2][2]-A[1][2]:
edge_cnt += 1
if A[2][1]-A[2][0] == A[2][2]-A[2][1]:
edge_cnt += 1
if A[1][0]-A[0][0] == A[2][0]-A[1][0]:
edge_cnt += 1
ans = max_cnt + edge_cnt
print(f"Case #{t+1}: " + str(ans))
728x90
300x250
'코딩 테스트 > Google Kick Start' 카테고리의 다른 글
[Google Kick Start] 2021 구글 킥스타트 Round H Transform the string 풀이 (0) | 2021.11.20 |
---|---|
[Google Kick Start] 2021 구글 킥스타트 Round G Dogs and Cats 풀이 (0) | 2021.11.18 |
[Google Kick Start] 2021 구글 킥스타트 Round E Suffled Anagrams 풀이 (0) | 2021.11.14 |
[Google Kick Start] 2021 구글 킥스타트 Round B Increasing Substring 풀이 (0) | 2021.11.06 |
[Google Kick Start] 2021 구글 킥스타트 Round F Trash Bins 풀이 (0) | 2021.10.08 |
Comments