본문 바로가기
알고리즘 문제/자료구조&알고리즘

구현 기출

by 태윤2 2020. 10. 24.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 럭키 스트레이트
 
= 123402
data = str(s)
= int(len(data) // 2)
 
sum_left = 0
sum_right = 0
for i in range(0,m):
  sum_left+= int(data[i])
for i in range(m,len(data)):
  sum_right += int(data[i])
print(sum_left)
print(sum_right)
if sum_left == sum_right :
  print('LUCKY')
else:
  print('READY')
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 문자열 재정렬
st = 'K1KA5CB7'
 
= []
num = 0
 
for x in st:
  if x.isalpha():
    s.append(x)
  else:
    num += int(x)
 
s.sort()
 
if num != 0:
  s.append(str(num))
 
print("".join(s))
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 문자열 압축
def solution(s):
    answer = len(s)
    # 1개 단위(step)부터 압축 단위를 늘려가며 확인
    for step in range(1,len(s)//2 +1):
      compressed =""
      prev = s[0:step] # 앞에서부터 step만큼의 문자열 추출
      count = 1
      # 단위(step) 크기만큼 증가시키며 이전 문자열과 비교
      for j in range(step, len(s), step):
        # 이전 상태와 동일하다면 압축 횟수(count) 증가
        if prev == s[j:j +step]:
          count +=1
        # 다른 문자열이 나왔다면(더 이상 압축하지 못하는 경우라면)
        else:
          compressed +=str(count)+prev if count >= 2 else prev
          prev = s[j:j + step] # 다시 상태 초기화
          count = 1
      # 남아 있는 문자열에 대해서 처리
      compressed += str(count) + prev if count >= 2 else prev
      # 만들어지는 압축 문자열이 가장 짧은 것이 정답
      answer = min(answer, len(compressed))
 
    return answer
cs

 

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
def solution(key, lock):
    answer = True
    n = len(lock)
    m = len(key)
    # 자물쇠의 크기를 기존의 3배로 변환
    new_lock = [[0* (n*3for _ in range(n * 3)]
    # 새로운 자물쇠의 중앙 부분에 기존의 자물쇠 넣기
    for i in range(n):
      for j in range(n):
        new_lock[i+n][j+n] = lock[i][j]
    
    # 4가지 방향에서 대해서 확인
    for rotation in range(4):
      key = rotate_a_matrix_by_90degree(key) # 열쇠 회전
      for x in range(n * 2) :
        for y in range(n * 2) :
          # 자물쇠에 열쇠를 끼워 넣기
          for i in range(m):
            for j in range(m):
              new_lock[x + i][y +j] += key[i][j]
          # 새로운 자물쇠에ㅐ 열쇠가 정확히 들어 맞는지 검사
          if check(new_lock) == True:
            answer = true
          # 자물쇠에 열쇠를 다시 빼기
          for i in range(m):
            for j in range(m):
              new_lock[x+1][y+j]-= key[i][j]
 
    return answer
# 2차원 리스트 90도 회전
def rotate_a_matrix_by_90degree(a):
  n = len(a) # 행 길이 계산
  m = len(a[0]) # 열 길이 계산
  result = [[0* n for _ in range(m)] # 결과 리스트
  for i in range(n):
    for j in range(m):
      result[j][n-i-1= a[i][j]
  return result
 
# 자물쇠의 중간 부분이 모두 1인지 확인
def check(new_lock):
  lock_length = len(new_lock) // 3
  for i in range(lock_length, lock_length * 2):
    for j in range(lock_length, lock_length * 2):
      if new_lock[i][j] != 1:
        return False
  return True
cs

 

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
62
63
# 뱀
= int(input())
= int(input())
data = [[0* (n + 1for _ in range(n + 1)] # 맵 정보
info = [] # 방향 회전 정보
 
# 맵 정보(사과 있는 곳은 1로 표시)
for _ in range(k):
    a, b = map(int, input().split())
    data[a][b] = 1
 
# 방향 회전 정보 입력
= int(input())
for _ in range(l):
    x, c = input().split()
    info.append((int(x), c))
 
# 처음에는 오른쪽을 보고 있으므로(동, 남, 서, 북)
dx = [010-1]
dy = [10-10]
 
def turn(direction, c):
    if c == "L":
        direction = (direction - 1) % 4
    else:
        direction = (direction + 1) % 4
    return direction
 
def simulate():
    x, y = 11 # 뱀의 머리 위치
    data[x][y] = 2 # 뱀이 존재하는 위치는 2로 표시
    direction = 0 # 처음에는 동쪽을 보고 있음
    time = 0 # 시작한 뒤에 지난 '초' 시간
    index = 0 # 다음에 회전할 정보
    q = [(x, y)] # 뱀이 차지하고 있는 위치 정보(꼬리가 앞쪽)
 
    while True:
        nx = x + dx[direction]
        ny = y + dy[direction]
        # 맵 범위 안에 있고, 뱀의 몸통이 없는 위치라면
        if 1 <= nx and nx <= n and 1 <= ny and ny <= n and data[nx][ny] != 2:
            # 사과가 없다면 이동 후에 꼬리 제거
            if data[nx][ny] == 0:
                data[nx][ny] = 2
                q.append((nx, ny))
                px, py = q.pop(0)
                data[px][py] = 0
            # 사과가 있다면 이동 후에 꼬리 그대로 두기
            if data[nx][ny] == 1:
                data[nx][ny] = 2
                q.append((nx, ny))
        # 벽이나 뱀의 몸통과 부딪혔다면
        else:
            time += 1
            break
        x, y = nx, ny # 다음 위치로 머리를 이동
        time += 1
        if index < l and time == info[index][0]: # 회전할 시간인 경우 회전
            direction = turn(direction, info[index][1])
            index += 1
    return time
 
print(simulate())
cs

 

 

'알고리즘 문제 > 자료구조&알고리즘' 카테고리의 다른 글

DFS/BFS 문제  (0) 2020.10.25
그리디 기출  (0) 2020.10.24
기타알고리즘(리스트)  (0) 2020.10.24
기타 알고리즘(소수)  (0) 2020.10.24
그래프 이론  (0) 2020.10.24