반응형

JAVA에서 입력을 받을 때 사용하는 클래스가 Scanner이다.

java.util에 정의되어 있다.

 

입력 시 다음과 같이 쓸 수 있다.

Scanner scanner = new Scanner(System.in);
String st = scanner.nextLine();

 

일단 scanner 객체를 하나 생성하고 자바의 표준 입력 스트림인 System.in으로 받은 입력 값을 scanner에 저장한다.

그리고 scanner의 nextLine()함수를 통해 입력받은 값을 st에 저장해 주는 것이다.

 

이어서 입력하고 싶다면?

scanner를 새로 생성하지않고, 바로 scanner.nextLine()을 호출하면 된다.

그리고 다 입력한 후에는 scanner.close()를 통해 입력스트림을 종료한다.

 

 

반응형

'언어 > JAVA' 카테고리의 다른 글

[JAVA] 코테 준비를 위한 JAVA 기본 문법  (0) 2023.11.03
반응형

소프티어 lv2 "금고 털이" 문제 풀이 중 pair vector와 sort사용이 익숙치 않아 정리하는 글이다.

 

pair vector
vector<pair<int, int>> v;

vector에서는 한 요소에 두가지 값을 함께 넣으려면, 위와 같이 pair로 묶어서 정의해 주어야 한다.

"금고 털이" 문제에서 첫번째 int 요소에는 금속의 무게를 , 두번째 int 요소에는 금속의 가치를 저장해주었다.

각각의 값에 접근하려면, v.first, v.second로 접근할 수 있다.

 

sort

algorithm에서 정의한 정렬 함수 sort이다.

기본적으로 오름차순 정렬이고, pair vector의 경우 첫번째 값을 기준으로 오름차순 한다.

sort(v.begin(), v.end());

이렇게 하면 vector v를 첫번째 값인 금속 무게에 대해서 오름차순 정렬해준다.

 

그런데 나는 금속의 가치인 두번째 값에 대해서 내림차순 정렬하고 싶었다.

그래서 sort함수에, 따로 정의한 비교함수를 인자로 넣어, 이 기준으로 정렬해 주세요~라고 요청했다.

bool compare(const pair<int, int> &a, const pair<int, int> &b){
	return a.second>b.second;
}

 위와 같은 compare 함수를 정의해 주었다.

내가 헷갈렸던 점은, 부등호의 방향이다. 

처음에는 b쪽에 크다고 했는데, 이유는 정렬할 때 뒤에 있던게 컸었다..라고 생각한 것이다. 아무튼 나의 착각이고..

내림차순이 앞이 큰거니까, 먼저 위치한 a가 클 때 true로 정의해 주는 것이다.

반대로 오름차순이면? b쪽으로 부등호가 향해야 할 것이다.

 

이렇게 해서 기본 of 기본인 pair vector와 sort함수에 대해 정리해보았다.

다음에는 버벅거리지 않고 바로 구현하길~

반응형
반응형

https://softeer.ai/practice/6288

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

루팡은 배낭을 하나 메고 은행금고에 들어왔다. 금고 안에는 값비싼 금, 은, 백금 등의 귀금속 덩어리가 잔뜩 들어있다. 배낭은 W ㎏까지 담을 수 있다. 각 금속의 무게와 무게당 가격이 주어졌을

softeer.ai

 

💡 금고 털이
  • 무게가 W인 배낭, N개의 금속 종류가 있다.
  • 최대의 가치를 갖도록 금속을 담는데, 무게 W를 넘지 않아야 한다.
  • 금속은 1g당 가치를 갖는다.
  • 따라서 높은 가치를 갖는 순서대로 배낭에 담아야 한다.
  • 금속의 무게와 가치를 갖는 pair 벡터를 이용하였다.
  • pair 벡터에서 두번째 요소인 가치에 따라 내림차순 정렬 하기 위해, 비교함수인 compare를 정의해주었다.
  • 내림차순 정렬 후, 각 금속에 대해서, 무게가 현재의 W를 넘지 않으면, 그 무게만큼 넣고, 그렇지 않으면 W만큼 떼어다 넣기로 한다. 넣은 무게만큼 W에서 차감하는 방식이다.

 

전체 코드는 아래와 같다.

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

bool compare(const pair<int, int> &a, const pair<int, int> &b){
  return a.second>b.second;
}//두번째 요소를 기준으로 내림차순 하도록..

int main(int argc, char** argv)
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  
  int W,N;
  cin>>W>>N;

  vector<pair<int, int>> v(N);
  for(int i=0; i<N; i++){
    cin>>v[i].first>>v[i].second;
  }

  sort(v.begin(), v.end(), compare);//두번째 요소를 통해 compare 하도록 비교함수 정의
  
  int value=0;
  for(int i=0; i<N; i++){
    if(W==0) break;
    int used=(v[i].first<=W)?v[i].first:W;
    value+=used*v[i].second;
    W-=used;
  }
  
  cout<<value;
  
   return 0;
}

 

pair 벡터 정렬만 할 줄 알면 되므로, 아주 쉽다.

반응형
반응형

 

꽃은 저마다 피는 시기가 다 다르다.

개나리는 개나리대로, 동백은 동백대로

자기가 피어야 하는 계절이 따로 있다.

모두 자신의 때를 기다렸다가 피어난다.

 

늦지 않았다. 조급해하지 마라.

아직 당신의 때가 오지 않았을 뿐이다.

포기하지만 않으면 괜찮다.

 

현재의 노력은 성공의 거름이 되어

훗날 누구보다 예쁘게 피어날 것이다.

 

잊지 말라.

다소 늦더라도 그대는 반드시

예쁜 꽃을 피울 사람이다.

 

 

<한 번뿐인 인생은 어떻게 살아야 하는가 中>

반응형
반응형

유튜브 '삼평동 연구소'의 영상을 보고 인터페이스의 개념을 조금이나마 이해할 수 있었다.

https://youtu.be/a6F7rIKaxzo 

 


인터페이스가 뭔지는 아는데, 설명해보라고 하면 애매한 개념..
그래서 정리해봤다!!

 

인터페이스??

 

인터페이스는 하나의 약속이다.

무슨 약속이냐?

A라는 것을 하면 B라는 결과가 나온다는 약속을 정의한 것이다.

즉, "A→(약속=인터페이스)→B" 와 같은 중간다리 역할을 한다.

이것만으로는 감이 잘 오지 않을 수 있어, 예를 준비했다.

 

실생활에는 생각보다 인터페이스가 많다.

예를 들면, 리모컨 전원 버튼이 있다.

TV를 켜고 싶다. 그러면? 우리는 리모컨을 개발한 사람이 만든 "리모컨 전원 버튼"을 눌러서 TV를 켠다.

따라서 "리모컨 전원 버튼"은 인터페이스가 된다.

또 다른 예를 들어보자.

화장실에서 볼일을 보고, 물을 내리고 싶다. 그러면? 우리는 변기의 "레버"를 눌러서 물을 내리게 된다.

따라서 "변기 레버"는 인터페이스가 된다.

 

프로그래밍으로도 예시를 들어보자.

LampOn()이라는 함수가 있다고 하자.

램프를 켜기위해서 LampOn()함수를 호출했더니, 램프가 켜진다.

따라서 "LampOn()"함수는 인터페이스가 된다.

함수도 일종의 인터페이스라고 할 수 있다.

 

이처럼 개발자가 만들어 놓은 환경에서 어떠한 입력을 했을 때, 어떠한 출력이 나오도록 중간에서 구현한 것을 인터페이스라고 한다.

 

동영상에서는 "고기집 인터페이스"를 통해 개념을 더욱 쉽게 설명하고 있다.

설명이 아주 맘에 들어서 정리해보겠다.

 

 

고기집 인터페이스

 

고기집이 있다.

고기집에 들어가서 "저기요~" 하고 부르니, 네~하고 종업원이 와서 주문을 받는다.

그런데 요즘은 "호출벨"을 누르면,  종업원이 화면에 뜬 테이블 번호를 확인하고, 해당 테이블에 와서 주문을 받는다.

 

여기서 "저기요~"랑 "호출벨"은 인터페이스가 된다. 

앞에서 설명한 것처럼, "저기요~" 하거나, "호출벨"을 누르면, 종업원이 온다는 결과가 있기 때문이다.

 

호출벨이 개발되기 전에는 직접 사람이 "저기요~"하고 불렀는데, 가게가 바쁘면, 어디서 누가 부르는지 모를 수 있고, 시끄러워서 못듣는 문제가 발생할 수 있다.

이러한 구버전 방식, 즉 구버전 인터페이스의 문제점을 보완한 신버전 인터페이스인 "호출벨"이 개발된 것이다.

 

"호출벨"을 누르면 내부 신호를 통해 화면에 해당 테이블의 번호가 찍히고, 띵동~하는 소리도 울린다. 그럼 종업원은 화면 속 테이블 번호를 확인하여 주문을 받을 수 있으므로, 누가 부르는지 모르는 등의 문제를 보완할 수 있다.

 

정리하자면,

고기집에서 손님이 주문을 하기위해 "저기요~" 하고 부르는 구버전 인터페이스 또는, "호출벨"을 눌러서 부르는 신버전 인터페이스를 통해 종업원이 온다.

 

이제 인터페이스의 개념은 확실히 잡혔을 것이다.

 

 

그렇다면, 백엔드 개발에서 많이 언급되는 API는?

 

API??

 

API(Application Programming Interface)는 어플리케이션 층에서의 인터페이스라고 할 수 있다.

즉 일종의 거대한 인터페이스이다.

 

API를 잘 만들기 위해서는 아래 4가지를 따라야 한다.

 

1. 직관적인 입출력

인터페이스의 입력과 출력이 굉장히 직관적이어야 한다.

무슨 의미냐하면..

고기집을 예시로 들겠다.

"호출벨"을 한번 누르면(입력), 종업원이 온다(출력). 이렇게 인터페이스가 설계되어 있다면, 베스트 케이스이다.

정말 심플하고 명확한 입력에, 명확한 출력이기 때문이다.

 그런데, "호출벨"을 세번 연달아 눌러야, 종업원이 온다. 라고 인터페이스를 설계했다던지, "호출벨"을 모스부호 처럼 눌러야, 종업원이 온다. 라고 인터페이스를 설계했다면, 사용자 입장에서 굉장히 모호하고, 입력이 애매하다.

따라서 Simple is Best이다. 인터페이스의 입출력은 정말 직관적이고 심플하게 구현되어야 한다.

현재 나의 인터페이스 혹은 함수도 직관적으로 설계되어 있는지 들여다 볼 필요가 있다.!!

 

2. 성능 요구사항

성능 요구사항은, 출력에 대한 명확성이 있어야 한다.

그러니까 어떤 입력이 들어오더라도, 결과는 어떠한 형태로든 출력이 되어서 사용자에게 정보를 잘 전달해주어야 한다.

어떤 입력이나, 내부 시스템으로 인해 문제가 발생했다고 하자. 그럼 발생한 문제에 대한 에러 메시지를 출력한다던지, 잘 동작했으면 올바른 결과값을 출력한다던지, 반응이 꼭 있어야 한다는 것이다.

그 반응은, 메시지, 문서, 효과음 어떤 것이든 상관없다.

 

3. 하위호환지원

하위호환지원은, 신버전 인터페이스가 있음에도, 구버전 인터페이스 또한 지원하는 것이다.

또 고기집으로 예를 들어보겠다.

"호출벨"이 설치된 고기집이 있다. 이 고기집에 가서 주문을 하기 위해 "저기요~"라고 불렀다. 그런데 아무리 불러도 종업원이 반응이 없다. "호출벨"의 기능을 안써보거나 모르는 손님은, 신버전 인터페이스인 호출벨만으로 주문을 받는 식당에게 화만 나고, 더이상 이 식당을 이용하지 않을 것이다.

이런 융통성 없는 식당 같은 상황이 실제로 개발에서도 이루어진다.

따라서 손님이 "저기요~"라고 불러도 종업원이 와야하고, "호출벨"을 눌러도 종업원이 올 수 있도록 두가지 모두 지원하는 것이 하위호환지원이다.

But!!

실제로는 하위호환지원이 쉽지 않다. 유지 관리가 어렵기 때문에, 개발자들 입장에서 두가지 버전을 다 지원하는 것이 쉬운 일은 아니다. 왜냐하면, 구버전의 문제점이나 성능을 보완하기 위해 신버전을 개발하였는데, 동시에 두 버전을 모두 유지하기위해서는 신버전의 기술을 미처 사용할 수 없는 상황이 오는 등 걸림돌이 될 수도 있다.

 

따라서 현실적으로 신버전 인터페이스만 제공하게 되는 경우가 대부분이라고 한다.

(마이크로소프트사가 window의 여러버전을 하위호환하는 데에는 최고라고 한다.)

 

4. 쉬운 접근성과 대중성

인터페이스는 누구나 알수 있게 만들어야 한다.

만약 인터페이스를 개발했는데, 사용자입장에서 사용하기 너무 어렵고, 뭘 하는 건지 이해하지 못한다면, 안쓰게 된다.

안쓴다는 것은 개발을 안한 것이나 다름없다.

따라서 인터페이스를 개발했다면, 사용자에게 적극적으로 알려야 한다.

고기집을 예로 들면..

"호출벨"이 나오기 전까지, 고기집에서는 "저기요~"라고 부르기만 하면 됐다.

그런데, 아무런 통지나 알림도 없이, 고기집에서 "호출벨"을 테이블에 붙혀 놓았다.

사람들은 처음 보는 "호출벨"이 뭔지도 모르고, 심지어는 눈에 안띌수도 있다.

따라서 있어도 모르니까 "호출벨"을 안쓰게 된다.

"저기요~"하고 부르면, 종업원은 와서 주문을 받고 "다음부터는 "호출벨"을 눌러주세요~"라고 손님들에게 지속적으로 알려주어야 한다. 그래야 손님들은 기억을 하고 학습하여 "호출벨"을 누를 수 있게 된다.

이렇게 인터페이스를 알려주어야 하며, 사용하기 쉽게 해주어야 한다.

 


인터페이스에 대한 개념은 이쯤에서 정리하고, 추가적인 내용들이 생기면 다음 편에 이어서 쓰도록 하겠다.

개인적으로 고기집 인터페이스 설명으로 아주 쉽게 이해할 수 있어 좋은 것 같다. 

반응형
반응형

https://www.acmicpc.net/problem/2559

 

2559번: 수열

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기

www.acmicpc.net

 

💡 수열

 

  • 이 문제는 무지성으로 풀이하면 [시간초과]가 당연히 발생하는 문제이다.
  • 입력 크기가 최대 10^6이므로 O(n^2)으로 풀 시 시간초과가 발생한다.
  • 결론적으로 이 문제는 "누적합"="부분합"을 이용하여 풀이할 수 있다.
  • 누적합을 저장할 크기가 N+1인 벡터를 생성하고, 0으로 초기화한다.
  • N+1개를 생성한이유는 0번 인덱스를 0으로써 활용하기 위함이다.
  • 누적합 배열을 v라고 할 때, 만약 K=2이면 v[2]-v[0]은 두번째 값까지 더한 값에서 0번째 값까지 더한 값을 빼준 것이고, 이 값은 첫번째값과 두번째값을 더한 것이므로, 단순히 빼기를 통해 구간의 합을 구할 수 있고, 이로써 중복적인 더하기 연산을 피할 수 있으므로 시간을 단축할 수 있다.
  • 예시

예시

  • 주어진 예시에서 5개만을 가져와 보았다.
  • 주어진 5개의 숫자값들이 위의 배열과 같을 때, 아래 v배열은 각 값들의 누적합을 차례로 1번 인덱스부터 채워넣는다.
  • 하나씩 살펴보면, v[1]에는 첫번째 값인 3을, v[2]에는 두번째값까지 더한 값(3+(-2))인 1을, v[3]에는 세번째값까지 더한...
  • 이제 K가 2이므로, 연속한 두 값씩 더한 값을 구해보자. 이는 이미 구해둔 v[K]-v[0] 연산만을 통해 구할 수 있다.
  • 첫번째 연속합을 max로 지정해주고, for문을 통해 K+1부터 N까지 진행하면 된다.
  • 이 방법은, cin으로 숫자값들을 받을 때, 동시에 배열에도 누적합을 더해 놨기 때문에, 이 값을 이용해 차 연산만 해주고, 그 연산 결과가 가장 큰 값을 반환하면 되므로, 시간효율이 아주 좋다! 
  • 아래는 전체 코드이다.
#include<iostream>
#include<vector>

using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int N,K;
    cin>>N>>K;
    
    vector<int> v(N+1,0);
    
    for(int i=1; i<N+1; i++){
        int temp;
        cin>>temp;
        v[i]=v[i-1]+temp;
    }
    
    int max=v[K];
    for(int i=K+1; i<N+1; i++){
        max=(max<v[i]-v[i-K])?v[i]-v[i-K]:max;
    }
    
    cout<<max;
    
    return 0;
}

 

이전에 유사한 누적합 문제를 풀어봐서 문제를 보자마자 바로 "누적합!!!"하며 풀 수 있었다.

코딩테스트를 준비하면서 여러 문제를 풀다보니, 점점 문제의 유형이 눈에 보이기 시작한 것 같다.

그래도 아직 갈길이 멀다...!!!

반응형

+ Recent posts