첫 번째 분수의 분자와 분모를 뜻하는numer1,denom1, 두 번째 분수의 분자와 분모를 뜻하는numer2,denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항과 입출력 예
입출력 예 #1
- 1/2 + 3/4 = 5/4 입니다. 따라서 [5,4]를 return 합니다.
입출력 예 #2
- 9/2 + 1/3 = 29/6 입니다. 따라서 [29,6]을 return 합니다.
using System;
public class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] answer = new int[2];
var top = numer1 * denom2 + numer2 * denom1;
var bottom = denom1 * denom2;
var max = 0;
for(int i = 1; i <= top; i++)
{
// 분모 그리고 분자를 i로 나누어 0이 될때가 최대공약수이다.
if(top % i == 0 && bottom % i == 0)
{
max = i;
}
}
answer[0] = top / max;
answer[1] = bottom /max;
return answer;
}
}
현재 은다민의 상황 - 지금까지 대부분의 개발은 C#으로 함 (응용프로그램 / Web) - Spring 거의 기억 안남 - React 아예 모름 - 기본적인 html / css / js 사용 가능
1. 개발 환경 선택
1. os : Window 10 , Mac OS Monterey (M1) 2. ide : IntelliJ (spring) , vscode (react) 3. database : MySQL 4. api : Swagger
os는 window와 mac을 둘 다 사용하는지라 언제 어디서든 개발할 수 있도록 선택
사실 ide에서 고민을 많이했다. IntelliJ에서 React를 지원해주기 때문에 사실 한곳에서 모두 개발할 수 있지만, 이 경우 Spring Boot와 React 애플리케이션을 각각 실행해야 하기 때문에 개발 환경 설정이 복잡해진다는 단점과 Front-End의 관점에서 개발을 해보고 싶기 때문에 (추후 협업을 위한 경험) 굳이 개발 환경을 나누어 주었다.
아직 대량의 데이터 처리를 동시에 할 프로젝트를 생성할것이 아니라서 MongoDB와 MySQL중 MySQL 선택
Swagger와 PostMan중 어떤것을 사용해도 상관없지만, ASP 개발을 할때 사용했던 익숙한 Swaager를 선택
2. 개발 환경 통합
나는 Spring과 React 애플리케이션을 각각 개발하기 때문에 이 둘을 연동하는 통합 작업이 필요하다.
React에서 Rest API를 호출하여 Spring Boot에서 구현한 API를 통해 데이터를 주고 받을수 있도록 작업하려고 한다.
WebSocket을 활용하여 서버와 통신하는 방법도 있지만, 이는 양방향 실시간 통신을 지원하는 프로토콜
즉, 채팅이나 게임같이 연결을 유지하며 실시간으로 데이터를 주고 받는 방식이기 때문에
프로젝트 방향과 맞지 않을거라고 판단하여 API 호출 방식을 선택하였다.
REST API 방식 : HTTP 프로토콜 기반으로 클라이언트 - 서버 모델을 따르는 웹 서비스 아키텍쳐. 클라이언트와 서버 간에 비동기적 데이터 통신이 가능. HTTP Method (GET, POST, PUT, DELETE)를 사용하여 데이터를 조작가능. 간단하고 직관적이며 다양한 클라이언트와 서버에서 사용 가능. 단순한 데이터 전송이나 CRUD 작업을 수행하기 위해 선택하였음
WebSocket 방식 : 양방향 실시간 통신을 지원하는 프로토콜. 클라이언트와 서버가 한 번 연결하면 연결을 유지하며 실시간 데이터 통신이 가능. 채팅,게임,주식 시세 같은 어플리케이션을 만들때 사용. 이처럼 실시간으로 데이터를 주고받거나 푸시 알림등의 기능이 필요할때 사용하면 좋다.
'A' -> 우리는 이것을 '문자' 라고 표현한다 "ABCDEF" -> 우리는 이것을 '문자열' 이라고 표현한다 9 -> 우리는 이것을 정수 라고 표현한다 3.14 -> 우리는 이것을 소수 라고 표현한다
이렇게 어떠한 값의 형태를 우리는 Data Type이라고 부른다.
그렇다면 그냥 문자면 문자, 숫자면 숫자로 사용하면 되는걸 왜 이 사단을 부리는걸까?
데이터 타입을 깊게 파면 한도 끝도 없으니 간단하게 설명해보자
숫자 10과 문자열 "10"은 다르다. 누가봐도 둘다 10이지만
숫자 10은 프로그램 안에서 덧셈, 곱셈등 연산이 가능하다.
그렇다면 문자열 "10"은 어떨까?
이것은 숫자가 아닌 "10" 이라는 문자를 표현한 것이기 때문에 연산이 안된다.
Swift는 다른 언어에 비해 타입에 대해 엄격한 편이다.
꼭 타입을 열심히 공부해서 에러가 나지 않는 코드를 짜보자
데이터 타입의 종류
Bool (Boolean의 약자)
참과 거짓을 표현
var trueType : Bool = true // true 값을 가진 Bool Type
var falseType : Bool = false // false 값을 가진 Bool Type
Int (Integer의 약자)
64bit
정수를 표현
var someInt : Int = 100 // 100의 값을 가진 Int Type 양의 정수
var someInt2 : Int = -999 // -999의 값을 가진 Int Type 음의 정수
// 3.14 처럼 소수는 사용 x
UInt (UnSigned Integer의 약자)
부호가 없는 정수 (양의 정수만 표현)
var someUInt : UInt = 100 // 100의 값을 가진 UInt Type의 양의 정수
// -100 처럼 음수는 사용 x
Float
32bit
부동 소수
var someFloat : Float = 3.14
var someFloat2 : Float = 3 // 소수는 정수에 포함되어있기 때문에 사용 가능
Double
64bit
부동 소수
var someDouble : Double = 3.14
var someDouble : Double = 3 // 정수라도 가능
//하지만 Double = Float은 안된다.
Character
UNICODE를 표현한 '문자'
var someCharacter : Character = "A"
var someCharacter2 : Character = "가"
var someCharacter3 : Character = "1"
// "하하하" -> 한 문자가 아니기 때문에 안됨
String
문자가 이어진 "문자열"
var someString : String = "가" // 문자열은 문자를 포함하고 있기 때문에 가능
var someString2 : String = "하하하"
var someString3 : String = "웃으면 복이와요."
print(someString2 + someString3) // 문자열을 연산으로 합칠수 있다
// 하하하 웃으면 복이와요.
// String = Character 는 안됨
string originString = "ABCDE"; // 기준 문자열
int length = originString.Length; // 기준 문자열의 길이
StringBuilder sb = new StringBuilder();
//StringBuilder는 String의 재조합보다 참조 메모리를 덜 차지함
for(int i = length-1; i>=0 ; i--) //끝자리부터 도는 이유는 문자열을 역전시키기 위함
{
sb.Append(originString.Substring(i,1));
//Substring으로 문자열을 한개씩 StringBuilder에 추가해줌
}
string result = sb.Tostring(); //다시 string 타입으로 변환
Console.WriteLine(result);
result의 값은 "EDCBA" 가 됩니다 :)
사실 여기서 어려워 할 부분은 Substring() 메서드의 사용이라고 생각해요.
처음 Substring() 메서드를 접했을때 오버로드가 되어있는것을 보았고
startindex와 index를 조합하여 원하는 문자열을 골라 올 수 있는걸 알았고
전 그게 string.Substring(1,3); 일경우 1번째부터 3번째 인덱스의 문자열을 잘라오는줄로만 알고있었죠
자꾸 인덱스 오류가 나고, 쌩뚱맞은 문자열을 리턴 하길래 무슨 문제인가 디버깅 해보았습니다.
위의 예제를 활용해서 다시 살펴볼까요?
string originString = "ABCDE";
string index = originString.Length;
//1. startIndex가 0일경우
string result = originString.Substring(0); //result == "ABCDE"
//2. startIndex가 1일경우
string result = originString.Substring(1); // result == "BCDE";
//3. startIndex가 0, length 추가했을 경우
string result = originString.Substring(0,length); // result == "ABCDE"; (0부터 5까지 잘라왔기때문)
//4. startIndex가 1, length 추가했을 경우
string result = originString.Substring(1,length); // index오류!!!
//1부터 (B부터) 5번째 길이만큼 자르려면 originString의 length가 6이상이어야 함
//현재 originString의 전체 length는 5이므로 index 오류가 발생
//5. startIndex가 1, length가 1일경우
string result = originString.Substring(1,1); // result == "B";
//1번째 문자열 (B부터) 1번째 길이만큼 자르면 본인을 가져오게됨
//6. startIndex가 1, length가 2일경우
string result = originString.Substring(1,2); // result == "BC";
//1번째 문자열 (B부터) 2번째 길이만큼 자르면 B와 그 다음 문자열인 C를 가져오게됨