알고리즘 문제를 풀어보라고 하는 팀원이 문제를 던져주었다.
33 = 9
44 = 16
9+16 = 25
제일 긴 변 5*5 =25 이니.. 오케이 대충 공식 이해 완
답이 잘 나오는걸 확인하고 그대로 복붙해서 검사했더니..
!!!!!!!!!!!!!!
ㅎㅎㅎㅎ 오늘 어차피 많이 틀렸어서 괜찮다...
알고리즘에 필요한 Tip 정리
위 링크를 들어가면 여러 입력받기의 대한 예시가 나온다.
while true (무한 반복 시작)
이 코드는 사용자가 입력을 계속해서 할 수 있도록 무한 루프를 만든다. true는 항상 참이니 끝나는 조건이 올 때까지 계속 실행된다.
let input = readLine()!.split(separator: " ").map { Int($0)! }
readLine()
은 사용자가 입력한 값을 문자열로 읽어온다. 예를 들어 사용자가 6 8 10
을 입력하면, readLine()
은 "6 8 10"
을 반환한다.
.split(separator: " ")
는 문자열을 공백을 기준으로 나눈다. 즉, "6 8 10"
을 ["6", "8", "10"]
이라는 문자열 배열로 변환한다.
.map { Int($0)! }
는 각 문자열을 정수로 변환한다. ["6", "8", "10"]
을 [6, 8, 10]
이라는 정수 배열로 바꾼다.
이 과정은 입력받은 문자열을 세 개의 정수로 변환하는 것이다.
if input == [0, 0, 0] { break }
input == [0, 0, 0]
는 사용자가 0 0 0
을 입력했는지 확인하는 조건이다.
만약 사용자가 0 0 0
을 입력하면, break
가 실행되어 while
루프가 종료된다.
이 부분은 "종료 조건"
이다. 0 0 0
이 들어오면 입력을 더 이상 받지 않고 프로그램이 끝난다.
let a = input[0], b = input[1], c = input[2]
이 코드는 입력받은 세 변을 각각 a, b, c라는 변수에 할당하는 부분이다.
예를 들어 inpu
이 [6, 8, 10]
이라면, a = 6, b = 8, c = 10
이 된다.
if (a a == b b + c c) || (b b == a a + c c) || (c c == a a + b * b)
이 조건은 피타고라스의 정리를 이용해 주어진 세 변이 직각삼각형인지 확인하는 부분이다.
피타고라스의 정리는 직각삼각형에서, 두 변의 제곱의 합이 나머지 변의 제곱과 같다는 것을 말한다. 그러니까 a² + b² = c²
가 성립하면 직각삼각형인 것이다.
이 조건에서는 세 가지 경우를 모두 확인했는데,
a * a == b * b + c * c
-> 첫 번째 변이 가장 긴 변이 될 때
b * b == a * a + c * c
-> 두 번째 변이 가장 긴 변이 될 때
c * c == a * a + b * b
-> 세 번째 변이 가장 긴 변이 될 때
이 세 가지 조건 중 하나라도 참이면 직각삼각형이 맞다는 것.!
print("right") else { print("wrong") }
만약 위의 조건이 참이라면 print("right")
를 실행하여 직각삼각형임을 출력한다.
그렇지 않으면 print("wrong")
를 실행하여 직각삼각형이 아님을 출력한다.
주어진 세 변의 길이를 이용해서 해당 삼각형이 직각삼각형인지 아닌지를 판별하는 문제이니까.. 문제를 풀면서 피타고라스의 정리를 이용해 해결할 수 있다는 점을 떠올렸고 이걸 코드로 어떻게 표현할지 고민했다.
주어진 세 변이 직각삼각형을 이루는지 확인하기 위해서는 피타고라스의 정리인 a^2 + b^2 = c^2
를 사용해야 한다는걸 생각하면서 여러 개의 테스트 케이스를 주고 마지막에 0 0 0이 입력되면 종료되는 형식으로 했다.
먼저, readLine()을 사용하여 입력을 받아왔다. 이 부분이 제일 어려웠다. 입력을 받으라는게 무슨 말이지? 부터 시작해서 이해하기까지 시간이 좀 걸렸다.
아무튼 입력받은 값은 공백을 기준으로 나눠 정수 배열로 변환 해주고 각각의 변을 변수 a, b, c에 할당했다.
피타고라스의 정리를 적용해서 세 변이 직각삼각형을 만들 수 있는지 확인하고
이걸 반복문을 사용하여 여러 개의 테스트를 할 수 있게끔 처리했다. 종료 조건은 0 0 0이 입력되는 것으로 했다.
이 문제에서 입력받은 세 변이 순서와 상관없이 적용될 수 있으니 세 변이 어떤 것이 더 큰지 정렬해서 가장 큰 변이 항상 빗변이 되게 하는 것이 중요하다 생각되었다.
그리고 종료 조건 처리와 반복문 사용에 대해 알게 되었는데, 조건문과 반복문을 잘 조합하면 유사한 문제를 효율적으로 처리할 수 있을 것 같다.
오늘 알고리즘 문제를 풀면서 수학적인 부분을 코드로 구현하는 과정과 그걸 입력받게 해주는 코드들에 대해서도 알게 되었는데 많이 애먹은 듯 하다. 앞으로도 좀 더 다양한 수학적 문제를 풀어보고 분석하면서 코드를 작성하는 능력을 키워 나가야겠다는 생각이 들었다.
코드 깔끔하네여!! 같이 실버를 향해 고고