문제 바로가기
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
나의 코드 및 설명
- 입력받은 두 문자열의 길이가 같을 때, 문자열이 서로 같다면 문자열이 무한으로 반복되어도 두 문자열은 서로 같을 것이다.
- 두 문자열의 길이가 다를 때에는 무한대로 반복한 문자열을 서로 비교해야 되는데, 문자열을 무한대로 반복한 값을 비교할 수는 없으므로 두 문자열 길이를 최소 공배수가 되도록 반복시키고, 길이가 같아진 두 문자열을 비교하는 방법으로 문제를 해결하였다.
예를 들어, 두 문자열이 "ababab", "abab" 일 때 문자열의 길이는 각각 6, 4이고 최소공배수는 12이다. 원래 문자열의 길이가 각각 12가 되도록 문자열을 반복시키고 비교해야 하나, 두 문자열 길이의 최소공배수를 구하는 코드를 추가해야 하는 게 오히려 깔끔하지 못하다 생각하여, 반대쪽 문자열의 길이만큼 곱해주었다. (6 * <4> 그리고 4 * <6>)
test = int(input())
for test_case in range(1, test+1):
s, t = map(str, input().split())
ans = ""
s_len = len(list(s)) #문자열 s의 길이
t_len = len(list(t)) #문자열 t의 길이
#문자열 s와 문자열 t의 길이가 서로 같을 때
if len(list(s)) == len(list(t)):
#문자열 s가 문자열 t와 같다면 ans에 yes 저장
if s == t:
ans = "yes"
#문자열 s가 문자열 t와 다르다면 ans에 no 저장
else:
ans = "no"
#입력받은 두 문자열의 길이가 같다면, 두 문자열 길이의 최소공배수가 될 때까지 문자열을 반복하고,
#반복한 문자열이 같으면 yes 다르면 no를 ans에 저장하는 코드 작성
else:
temp_s = s #변하지 않는 임시 값
temp_t = t
while len(list(s)) < t_len * s_len:
s = s + temp_s
while len(list(t)) < s_len * t_len:
t = t + temp_t
if s == t:
ans = "yes"
else:
ans = "no"
print("#{} {}".format(test_case, ans))
피드백
처음엔 문제를 잘 못 읽고 문자열의 길이가 50이 될 때까지만 반복시키고 두 문자열을 비교하는 식으로 코드를 작성했었는데, 80개의 input값 중 16개만 정상적으로 출력되었다고 해서, 급하게 풀이 방향을 선회하였다.
푸는 데에 한 시간 정도 걸린 것 같다. 시간을 재두고 더 타이트하게 풀어봐야겠다.
'SWEA (SW Expert Academy) > D3' 카테고리의 다른 글
[SWEA/D3] 13547 팔씨름 (0) | 2023.03.26 |
---|---|
[SWEA/D3] 13732 정사각형 판정 (2시간 풀고 Pass..) / BFS, 이중 for문 한줄로 작성하기 (0) | 2023.03.26 |
[SWEA/D3] 14361 숫자가 같은 배수 (2) | 2023.03.19 |
[SWEA/D3] 15612 체스판 위의 룩 위치 (0) | 2023.03.19 |
[SWEA/D3] 16002 합성수 방정식 (0) | 2023.03.17 |