swift 알고리즘) 직각삼각형

sonny·2024년 10월 10일
2

TIL

목록 보기
14/48

알고리즘 문제를 풀어보라고 하는 팀원이 문제를 던져주었다.
33 = 9
4
4 = 16
9+16 = 25

제일 긴 변 5*5 =25 이니.. 오케이 대충 공식 이해 완

답이 잘 나오는걸 확인하고 그대로 복붙해서 검사했더니..


!!!!!!!!!!!!!!


ㅎㅎㅎㅎ 오늘 어차피 많이 틀렸어서 괜찮다...


수정 필요 부분

  • 코드는 맞는데 test에 들어간 예제 숫자는 코드내에 적으면 안된다고 함.
  • 그리고 값이 0일 경우 종료되는 코드도 추가로 해야 함.
  • 입력 받는 코드 누락해서 작성 필요.

알고리즘에 필요한 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] 이라는 정수 배열로 바꾼다.
    이 과정은 입력받은 문자열을 세 개의 정수로 변환하는 것이다.

  1. if input == [0, 0, 0] { break }
    input == [0, 0, 0] 는 사용자가 0 0 0 을 입력했는지 확인하는 조건이다.
    만약 사용자가 0 0 0 을 입력하면, break 가 실행되어 while 루프가 종료된다.
    이 부분은 "종료 조건" 이다. 0 0 0 이 들어오면 입력을 더 이상 받지 않고 프로그램이 끝난다.

  2. let a = input[0], b = input[1], c = input[2]
    이 코드는 입력받은 세 변을 각각 a, b, c라는 변수에 할당하는 부분이다.
    예를 들어 inpu[6, 8, 10] 이라면, a = 6, b = 8, c = 10 이 된다.

  3. 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 -> 세 번째 변이 가장 긴 변이 될 때
    이 세 가지 조건 중 하나라도 참이면 직각삼각형이 맞다는 것.!

  4. 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이 입력되는 것으로 했다.

이 문제에서 입력받은 세 변이 순서와 상관없이 적용될 수 있으니 세 변이 어떤 것이 더 큰지 정렬해서 가장 큰 변이 항상 빗변이 되게 하는 것이 중요하다 생각되었다.

그리고 종료 조건 처리와 반복문 사용에 대해 알게 되었는데, 조건문과 반복문을 잘 조합하면 유사한 문제를 효율적으로 처리할 수 있을 것 같다.

오늘 알고리즘 문제를 풀면서 수학적인 부분을 코드로 구현하는 과정과 그걸 입력받게 해주는 코드들에 대해서도 알게 되었는데 많이 애먹은 듯 하다. 앞으로도 좀 더 다양한 수학적 문제를 풀어보고 분석하면서 코드를 작성하는 능력을 키워 나가야겠다는 생각이 들었다.

profile
iOS 좋아. swift 좋아.

1개의 댓글

comment-user-thumbnail
2024년 10월 14일

코드 깔끔하네여!! 같이 실버를 향해 고고

답글 달기