[BOJ-S3] 1913: 달팽이 & 12933: 오리 문제풀이 회고

아이엠강욱·2023년 5월 16일
0

코딩테스트

목록 보기
10/23

해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://www.acmicpc.net/problem/1913
https://www.acmicpc.net/problem/12933


이 두문제를 같이 묶은 이유는.. 어렵기도 했고 효율적인 로직 자체를 생각해내지 못해서 손을 못댔던 문제여서 같이 묶어서 회고하기로 했다.

1. 달팽이

"""
백준 1913 (S3): 달팽이
https://www.acmicpc.net/problem/1913
"""

n = int(input())
find = int(input())
find_x, find_y = -1, -1  # 찾으려는 값 좌표
matrix = [[0] * n for _ in range(n)]

sx, sy = n // 2, n // 2  # 시작지점 x와 y좌표
matrix[sx][sy] = 1  # 중앙은 1로 설정
num = 2  # 시작 번호
size = 3  # 시작 외각 크기

# 상하좌우 이동
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

while (sx != 0 or sy != 0):
  while num <= size * size:  # 번호가 현재 외각의 크기만큼 할당될때까지
    if sx == sy == (n // 2):  # 현재 외각의 시작좌표
      up, right, down, left = size, size - 2, size - 1, size - 1  # 상하좌우 이동횟수 저장
      sx += dx[0]
      sy += dy[0]
      up -= 1  # 위 횟수 감소
    else:
      if right > 0:  # 오른쪽으로 이동하는 횟수 남은 경우
        sx += dx[3]
        sy += dy[3]
        right -= 1  # 오른쪽 횟수 감소
      elif down > 0:  # 아래로 이동하는 횟수 남은 경우
        sx += dx[1]
        sy += dy[1]
        down -= 1  # 아래로 이동하는 횟수 감소
      elif left > 0:  # 왼쪽으로 이동하는 횟수 남은 경우
        sx += dx[2]
        sy += dy[2]
        left -= 1  # 왼쪽 횟수 감소
      else:  # 위로 이동하는 횟수 남은 경우
        sx += dx[0]
        sy += dy[0]
        up -= 1  # 위 횟수 감소

    matrix[sx][sy] = num  # 숫자 할당
    num += 1  # 숫자 증가

  # 해당 외각에 대한 작업이 끝남
  size += 2  # 외각 사이즈 늘려줌
  n -= 2  # 시작 좌표 변경으로 인해 박스 크기 줄여줌


# 그래프 출력
for i in range(len(matrix)):
  for j in range(len(matrix)):
    print(matrix[i][j], end=" ")
    if matrix[i][j] == find:
      find_x, find_y = i, j
  print()

print(find_x+1, find_y+1)
  1. 외각의 크기를 3 -> 5 -> 9 이런식으로 정해줘야 수월하다는 걸 알아야 해결하기 더 쉬움.
  2. while문 조건을 생각해내지 못함.
  3. 상하좌우 이동횟수를 저장해야 한다는 것도 생각 못함..
  4. 그냥 깡 구현으로 하려다가 피보게된 문제..

2. 오리

"""
백준 12933 (S3): 오리
https://www.acmicpc.net/problem/12933

많이 어려웠다...
"""

duck = input()
visited = [False] * len(duck)  # 각 문자를 방문했는지 확인하는 변수
count = 0  # 오리 수
quack = 'quack'  # 오리의 울음소리 저장


def quackCheck(idx):
  global count  # count 전역변수 설정
  qIdx = 0  # quack 변수를 순회할 index
  check = True  # quack을 처음 완성한건지 아닌지

  for i in range(idx, len(duck)):
    if quack[qIdx] == duck[i] and visited[i] == False:
      visited[i] = True  # 방문처리
      if duck[i] == 'k':  # k를 만났다는건 quack 1개가 완성되었다는 뜻
        if check == True:  # 처음 quack을 완성한 경우
          count += 1  # 오리 수 추가
          check = False
        qIdx = 0  # quack 순회 index 초기화
        continue  # 반복문 다시 진행
      qIdx += 1  # k가 아니면 quack index 변경


# 여기가 제일 중요한듯... 오리울음 문자열이 5의 배수가 아니면 로직 자체가 수행이 안됨
if len(duck) % 5 != 0:
  print(-1)
  exit()
else:
  for i in range(len(duck)):
    if duck[i] == 'q' and visited[i] == False:  # 해당 문자가 q이고 방문한적이 없음
      quackCheck(i)  # 찾기 시작

if not all(visited) or count == 0:
  print(-1)
else:
  print(count)
  1. 오리 울음소리를 변수에 저장해야 하고, 방문처리를 확인할 수 있는 변수도 선언해야함..
  2. 문제를 꼼꼼히 읽자. 문제를 이해 못한것도 한 몫 하는 것 같다.
  3. quack 변수를 통해 비교를 해야 한다.
  4. k를 만나면 quack이 처음 완성된건지 아닌건지로 나눠서 오리 수를 추가하는지 판단해야 한다.
profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글