4문제 정도 풀었고 풀었을 때 계속 추가할 예정입니다!!
1. Spell check
이 문제의 경우 처음 읽었을 때 이해가 안갔는데(영어라 이해를 잘못해서 그런가..) 몇번 읽다보니 뭔소린지 이해가 갔다 ㅎㅎ,,
문제 요구사항은 자신의 이름을 여러가지 순열을 허용해서(예시처럼 Trumi, ruTmi 등..) 입력으로 받은 값이 자신의 이름 값으로 유효한지 체크하는 문제이다. 처음엔 이름 구성도 5글자니까 길이는 5로 정해놓고 저 list안에만 포함되면 되겠구나 생각했는데 정답처리가 안되는 케이스가 있었다. 그래서 곰곰히 생각해보니 5글자가 아니여도 즉, 공백 같은게 들어가도 이름인걸 허용하는 케이스도 있다고 생각했고 길이가 5보다 작은 것들만 처리하니까 정답처리가 됐다.
import sys
input = sys.stdin.readline
t = int(input())
for _ in range(t):
n = int(input())
name = input()
check = False
lists = ['T', 'r', 'u', 'm', 'i']
for i in range(n):
if name[i] not in lists:
check = True
else:
lists.remove(name[i])
if check or n < 5:
print("NO")
else:
print("YES")
이 문제도 되게 간단했다. R이 들어간 경우만 체크해주면 되는 문제였다.
import sys
input = sys.stdin.readline
t = int(input())
for _ in range(t):
n = int(input())
ary=[]
for __ in range(2):
ary.append(input())
check=False
for i in range(n):
if ary[0][i] != ary[1][i]:
if ary[0][i]=='R' or ary[1][i]=='R':
check = True
if check:
print("NO")
else:
print("YES")
3. Word Game
이 문제도 되게 쉬운 문제였던 것 같았다 (푼지 한참돼서 기억이..)ㅎㅎ..
dictionary 형태로 처음 입력받을 때 단어가 몇번 쓰였는지 횟수를 저장하였고
이후 다시 세명의 인원의 n개의 단어에 대한 점수를 계산하는 코드를 짰다.
처음에 두개의 반복문을 합쳐서 조금 반복횟수를 줄이고 싶었는데 다른 방법이 생각나지 않아서 결국 따로 나눠서 문제를 풀었다.
import sys
input = sys.stdin.readline
t = int(input())
for _ in range(t):
n = int(input())
dict = {}
item = []
for i in range(3):
item.append(input().split())
for i in range(3):
for j in range(n):
if item[i][j] in dict:
dict[item[i][j]] += 1
else:
dict[item[i][j]] = 1
result = []
for i in range(3):
sum = 0
for j in range(n):
val = dict[item[i][j]]
if val == 1:
sum += 3
elif val == 2:
sum += 1
result.append(sum)
print(" ".join(map(str, result)))
6. L-shapes
처음엔 제출이 정답처리돼서 그냥 납뒀는데 대회 끝나고 보니까 케이스 추가로 인해 오답처리 되어있었다ㅠ(contest가 열리는 시간이 새벽이다 보니ㅠ)
방식을 첨엔 bfs로 풀다가 dfs로 그냥 바꿔서 풀고 cnt가 3을 넘을때 즉 도형이 4개가 연속으로 이어졌을때 예외처리를 해주었더니 다시 제출했을 때 정답처리가 됐다.
문제 풀이 방식은 일단 위,아래,왼쪽,오른쪽으로 탐색을 시작하고 만약 3개의 도형만 이어졌을 경우 이게 일자로 이루어진건지 먼저 검증을 하고 그 다음 이 도형을 이루는 칸중 대각선에 *칸이 있는지 또 찾아가는 작업을 했다(복잡해지긴 하는데 다른 방법은 마땅히 생각이 안났다.)
만약 위의 조건을 만족하지 않는 칸이 발견되면 false 처리를 해 바로 반복문을 탈출하도록 하였고 방문했던 칸을 다시 방문하지 않기 위해 visited(인덱스)로 방문 노드를 관리해주었다.
import sys
input = sys.stdin.readline
t = int(input())
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def dfs(i, j, visited, n, m, ary):
stack = [[i,j]]
cnt = 0
temp = []
while stack:
x, y = stack.pop()
temp.append([x, y])
visited[x][y] = 1
cnt += 1
if cnt > 3:
return False
for idx in range(4):
X = dx[idx] + x
Y = dy[idx] + y
if 0 <= X < n and 0 <= Y < m and not visited[X][Y]:
if ary[X][Y] == "*" and [X, Y] not in stack:
stack.append([X, Y])
if cnt!=3:
return False
# 일직선으로 된거 거르는 부분
if temp[0][0] == temp[1][0] and temp[1][0] == temp[2][0]:
return False
elif temp[0][1] == temp[1][1] and temp[1][1] == temp[2][1]:
return False
# 세개로 ㄴ ㄱ 테트리스가 완성된 후 대각선에 *존재하는지 확인하는 부분
DX = [-1, -1, 1, 1]
DY = [-1, 1, -1, 1]
for item in temp:
x, y = item
for idx in range(4):
X = DX[idx] + x
Y = DY[idx] + y
if 0 <= X < n and 0 <= Y < m and [X, Y] not in temp:
if ary[X][Y] == "*":
return False
return True
for _ in range(t):
n, m = map(int, input().split())
ary = []
for i in range(n):
ary.append(list(input()))
visited = [[0 for _ in range(m)] for __ in range(n)]
check = False
for i in range(n):
if check:
break
for j in range(m):
if ary[i][j] == '*' and not visited[i][j]:
if not dfs(i, j, visited, n, m, ary):
check = True
break
if check:
print("NO")
else:
print("YES")