1954 달팽이 숫자
달팽이처럼 돌기 위해서는 오른쪽, 아래, 왼쪽, 위쪽 방향을 반복적으로 돌아가면서 이동해 들어가고, 그 빈도는 위 그림에서 볼 수 있듯이 각 n번에서 1번 순서대로, 처음을 제외하면 각각 2번씩 반복적이라는 규칙을 찾을 수 있다.
for tc in range(int(input())):
N = int(input())
snail = [[0]*N for _ in range(N)]
number = 1
jump_cnt = N
direction = 'right' # 'right','down','left','up'순으로 바뀔 것
row_idx,col_idx = 0,0
while number <= N**2:
# 제일 처음: 1~N까지 채우기
if number == 1:
for i in range(N):
snail[row_idx][col_idx] = number
col_idx += 1
number += 1
direction = 'down'
jump_cnt -= 1
# 2번씩
else:
for _ in range(2):
if direction == 'down':
col_idx -= 1
row_idx += 1
for i in range(jump_cnt):
snail[row_idx][col_idx] = number
number += 1
row_idx += 1
direction = 'left'
elif direction == 'left':
col_idx -= 1
row_idx -= 1
for i in range(jump_cnt):
snail[row_idx][col_idx] = number
number += 1
col_idx -= 1
direction = 'up'
elif direction == 'up':
col_idx += 1
row_idx -= 1
for i in range(jump_cnt):
snail[row_idx][col_idx] = number
number += 1
row_idx -= 1
direction = 'right'
else:
col_idx += 1
row_idx += 1
for i in range(jump_cnt):
snail[row_idx][col_idx] = number
number += 1
col_idx += 1
direction = 'down'
jump_cnt -= 1
print("#{}".format(tc+1))
for row in snail:
print(" ".join(map(str, row)))
1948 날짜 계산기
cal = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}
for tc in range(int(input())):
m1,d1,m2,d2 = map(int, input().split())
print("#{}".format(tc+1), end=" ")
if m1 == m2:
# 어차피 문제 조건에 첫번째 날보다 두번째 날이 항상 크다고 했으니, d1d2가 같을때는 고려하지 않아도 된
print(d2-d1+1)
else:
result = d2
for i in range(m1+1,m2):
result += cal[i]
print(result + cal[m1]-d1+1)
딕셔너리의 키,값 관계를 이용해 키에는 월(month), 값에는 날짜(days)를 담고 접근하는 방식.
당연히 리스트의 인덱스와 값 관계를 활용해서 풀 수도 있다.
for tc in range(int(input())):
m1,d1,m2,d2=map(int, input().split())
d = [0,31,28,31,30,31,30,31,31,30,31,30,31]
if m1 == m2:
print("#{} {}".format(tc+1, d2-d1+1))
else:
result = d[m1]-d1+1+d2
while (m1+1) != m2:
m1 += 1
result+= d[m1]
print("#{} {}".format(tc+1, result))
두 방법의 속도 차이를 보면,
딕셔너리로 풀었을때가 좀 더 빠르고 메모리도 덜 쓰는 것 같다
1946 간단한 압축 풀기
for tc in range(int(input())):
N = int(input())
result = ''
for i in range(N):
alphabet, cnt = input().split()
result += alphabet*(int(cnt))
print("#{}".format(tc+1))
if len(result) <= 10:
print(result, end="")
else:
for j in range(len(result)//10+1):
print(result[10*j:10*j+10])
1945 간단한 소인수분해
numbers = [2,3,5,7,11]
for tc in range(int(input())):
N = int(input())
cnt = [0]*5
for i in range(5):
while True:
if N%numbers[i]== 0:
cnt[i] += 1
N //= numbers[i]
else:
break
print("#{} {}".format(tc+1, " ".join(map(str, cnt))))
'Problem Solving > SWEA' 카테고리의 다른 글
[ SWEA ] D3 - 1217, 1230, 3431, 4406 - python 문제풀이 (0) | 2021.06.29 |
---|---|
[ SWEA ] D2 - 1940, 1928, 1288, 1284, 1204 - python 문제풀이 (0) | 2021.06.28 |
[ SWEA ] D2 - 1970, 1966, 1961, 1959 - python 문제풀이 (0) | 2021.06.26 |
[ SWEA ] D2 - 1983, 1979, 1976, 1974 - python 문제풀이 (0) | 2021.06.24 |
[ SWEA ] D2 - 2001, 1989, 1986, 1984 - python 문제풀이 (0) | 2021.06.24 |
댓글