해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://www.acmicpc.net/problem/1913
https://www.acmicpc.net/problem/12933
이 두문제를 같이 묶은 이유는.. 어렵기도 했고 효율적인 로직 자체를 생각해내지 못해서 손을 못댔던 문제여서 같이 묶어서 회고하기로 했다.
"""
백준 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)
- 외각의 크기를 3 -> 5 -> 9 이런식으로 정해줘야 수월하다는 걸 알아야 해결하기 더 쉬움.
- while문 조건을 생각해내지 못함.
- 상하좌우 이동횟수를 저장해야 한다는 것도 생각 못함..
- 그냥 깡 구현으로 하려다가 피보게된 문제..
"""
백준 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)
- 오리 울음소리를 변수에 저장해야 하고, 방문처리를 확인할 수 있는 변수도 선언해야함..
- 문제를 꼼꼼히 읽자. 문제를 이해 못한것도 한 몫 하는 것 같다.
- quack 변수를 통해 비교를 해야 한다.
- k를 만나면 quack이 처음 완성된건지 아닌건지로 나눠서 오리 수를 추가하는지 판단해야 한다.