본문 바로가기
Problem Solving/SWEA

[ SWEA ] D3 - 3456, 1209, 9700, 5549 - python 문제풀이

by IM조이 2021. 7. 6.

3456 직사각형 길이찾기
접근법 : 딕셔너리 활용 - 특히 defaultdict를 활용하면 매번 값이 있는지 확인할 필요가 없어서 편함

from collections import defaultdict
for tc in range(int(input())):
    nums = list(map(int, input().split()))
    d = defaultdict(int)
    for num in nums:
        d[num] +=1
    for k,v in d.items():
        if v==1 or v==3:
            result = k
            break
    print("#{} {}".format(tc+1,result))

또 다른 방법으로는 어차피 값을 3개만 들어온다는 것을 활용해서
- 3개가 모두 같을 때 vs 두 개만 같을 때의 경우를 활용해 구현

results = []
T = int(input())
for t in range(1, T+1):
    a, b, c = input().split()
    if a == b:
        r = c
    else:
        if a == c:
            r = b
        else:
            r = a
    results.append('#{} {}'.format(t, r))
print('\n'.join(results))

 

1209 Sum
접근법 : 가로, 세로 확인 후 대각선 값은 인덱스로 알 수 있는 규칙을 활용해 확인

for tc in range(10):
    N = int(input())
    nums = [list(map(int, input().split())) for _ in range(100)]
    nums += [[nums[i][j] for i in range(100)] for j in range(100)]
    max_v = 0
    for k in range(200):
        tmp = sum(nums[k])
        if tmp > max_v:
            max_v = tmp
    l_cross = sum(list(nums[i][i] for i in range(100)))
    r_cross = sum(list(nums[i][100-i-1] for i in range(100)))
    print("#{} {}".format(N,max(max_v,l_cross,r_cross)))

 

9700 USB 꽂기의 미스터리
문제의 워딩을 잘 이해하면 쉽게 풀리는 문제. 뒤집었다의 의미는 이전에 실패했음을 의미하고(실패하기 위해서는 방향이 맞지 않았거나 제대로 꽂히지 않았을 경우), 성공했다는 의미는 방향도 맞고 제대로 꽂혔을 확률도 적중했음을 의미함

이해하기 쉽게 위 경우만 확인하면 됨

for tc in range(int(input())):
    p,q = map(float, input().split())
    print("#{} {}".format(tc+1, "YES" if (1-p) < p*(1-q) else "NO"))

 

5549 홀수일까 짝수일까
접근법 : 굳이 숫자 변환할 필요 없이 짝수의 특징(1의 자릿수에 0,2,4,6,8 중 하나다)을 이용해서 풀이

result = []
ends = ['0','2','4','6','8']
for tc in range(int(input())):
    num = input()
    result.append("#{} {}".format(tc+1, "Odd" if num[-1] not in ends else "Even"))
print("\n".join(result))

 

요즘 SWEA에서 나름 유행 타고 있는 출력 법이 있는데,
기존에 개별 테스트 케이스마다 print문으로 답을 출력했던 방식을 사용하지 않고,
결과를 문자열로 바꿔 리스트에 추가한 다음
마지막에 join으로 결과를 한 번만 프린트하는 방법을 사용해봤다.
테스트 케이스가 아주 적은 경우 빼고는 대부분 새로운 방식이 훨씬 빠름.
다만, 출력 방식에 따라서 속도를 줄이는 게 알고리즘 실력 향상에 도움이 되는지는 모르겠지만.. 빨라서 기분은 좋음 :)

(첫번째)print 한 번   (두번째) 매번 프린트  (세번째) 문자열X 숫자로 풀었을때

댓글