- 내가 쓴 코드 -
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
# NxN 지도를 만들 것인가? N, 그냥 좌표로 움직여도 될 듯.
# 무시되는 제한 조건을 구현해야 한다.
# LRUD를 구현해야 한다.
N = size = int(input())
commands = list(input().split())
class traveler:
def __init__(self):
global size
self.position = [1, 1] #y, x좌표다
self.size = size
def L(self):
if self.position[1] == 1:
return self.position[1]
self.position[1] -= 1
return self.position[1]
def R(self):
if self.position[1] == self.size:
return self.position[1]
self.position[1] += 1
return self.position[1]
def U(self):
if self.position[0] == 1:
return self.position[0]
self.position[0] -= 1
return self.position[0]
def D(self):
if self.position[0] == self.size:
return self.position[0]
self.position[0] += 1
return self.position[0]
def coordination(self):
return self.position
A = traveler()
for cmd in commands:
if cmd == 'L':
A.L()
elif cmd == 'R':
A.R()
elif cmd == 'U':
A.U()
elif cmd == 'D':
A.D()
for xy in A.coordination():
print(xy, end = ' ')
|
cs |
클래스로 구현해봤다.
- 해설 -
L, R ,U ,D에 따른 dx, dy를 정해주고,
plans에 입력한 각 plan에 따라
move_types 중에 일치하는게 있다면,
그 일치하는 것의 dx, dy를 시행해준다.
만약 move_types를 시행하고 있는데, 조건에 제한된다면 continue로 넘긴다.
x, y는 완성된 nx, ny다.
음.. 나는 클래스로 구현하는게 더 편한 것 같다.
- 내 코드 -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#3, 13, 23, 30~39, 43, 53 = 15개
#분에 3이 걸렸으면 그 분당 60개가 있다. - 15 * 60 = 900
#3이 안 쓰여있는 분당 15개가 있다 - 45 * 15 = 450 + 225 = 675
#즉 한 시간에는 1575개가 있다.
#3이 쓰여있는 시에는 3600개가 있다.
hours = list(range(0, int(input())+1))
#5시까지라면 0시, 1시 .... 5시이므로 6시간의 값을 가져야한다.
count = 0
for i in hours:
if '3' in str(i):
count += 3600-1575
count += 1575
print(count)
|
cs |
- 해설-
연산 횟수를 생각해 봤는가?
-> 연산이 크거나 시간복잡도가 높지 않다면 다 굴려보는 것도 방법이다.
다음 해설로 넘어가기 전에 브루트 포스로 다시 짜보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#24, 60, 60이 차근차근 올라가는 리스트를 짠다.
#아무래도 문자열로 해야겠지?
N = int(input())
times = []
count = 0
for hour in range(0, N+1): #0~23시
for minute in range(0, 60):
for second in range(0, 60):
times.append(str(hour)+str(minute)+str(second))
# 00:05:13 => '0513' 꼴로 저장됨
for time in times:
if '3' in time:
count += 1
print('입력한 N :', N, '\n답 :',count)
|
cs |
입력한 N : 5 답 : 11475
잘 나온다.
시,분,초를 모두 문자열로 만들어서 세는 것 보다,
각 변수에 3이 있는지 체크하는게 훨씬 나을 것이다.
- 해설 봐버림 -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#알파벳을 숫자로 치환한다.
alp_lst = ['a','b','c','d','e','f','g','h']
alp_dic = {}
for i in range(8):
alp_dic[alp_lst[i]] = i+1
steps = [(-2, -1), (-2, 1), (2, -1), (2, 1), (-1, 2), (-1, -2), (1, 2), (1, -2)]
coord = input() #c2
coord = [int(alp_dic[coord[0]]), int(coord[1])] #3, 2
row = coord[1]
column = coord[0]
movable = 0
for step in steps:
next_row = row+step[0]
next_column = column+step[1]
if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
movable += 1
print(coord, movable)
|
cs |
계속 한방에 뭉쳐서 해결하려는 버릇이 있다.
각 경우에 해당하는 부등식에 따라 count를 더하는 방식으로 쓰고 있었는데,
갈피가 안 잡혔다.
행 / 열로 나누어서 경우의 수(8가지)가 제한에 걸리지 않으면 체크하는 방식을 쓰는게 더 나아보인다.
-내 코드-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
S = input()
string = []
integer = []
for str in S:
try:
integer.append(int(str))
except:
string.append(str)
string = sorted(string)
int_sum = sum(integer)
string.append(int_sum)
for i in string:
print(i, end='')
|
cs |
예외처리를 통해서 문자열과 정수형을 구분했다.
진짜 같은 방식이어도 다르게 표현하는게 코딩이구나 싶다.
뭔가 퀴즈 푸는 것 같은 문제가 많아서 재밌었다.
'CS > 자료구조-알고리즘' 카테고리의 다른 글
(파이썬)이분 탐색 - 숫자 카드 2 (3) | 2022.08.05 |
---|---|
(다시)DFS & BFS 찍먹 (2) | 2022.06.23 |
그리디 알고리즘 (0) | 2022.06.21 |
(파이썬) 후위 표기식(postfix) 계산기 - 스택 (0) | 2022.06.21 |
(자료구조)순차적 자료구조/스택과 큐 - postfix 계산기와 첫 증발 (0) | 2022.06.20 |