1. AWS Site to Stie VPN 구성요소

  • Customer Gateway : Customer측 VPN연결 집신기

  • Virtual Private Gateway : AWS측 VPN연결 집신기

 

 

2. 목표 아키텍처

온프레미스와 AWS간 2중터널을 이용한 site to site VPN을 구성한다.

 

 

3. Hands on LAB

3.1. VPC 및 서브넷 구성

  • test-2SVPN-VPC-A

    • CIDR : 10.0.0.0/16

    • Public Subnet

      • 이름 : test-2SVPN-VPC-A-Public-2a-subnet

      • 가용영역 : ap-northeast-2a

    • IGW 생성 및 VPC에 attaching

  • test-2SVPN-VPC-B (Customer 역할)

    • CIDR : 20.0.0.0/16

    • Public Subnet

      • 이름 : test-2SVPN-VPC-B-Public-2a-subnet

      • 가용영역 : ap-northeast-2a

    • Private Subnet

      • 이름 : test-2SVPN-VPC-B-Public-2a-subnet

      • 가용영역 : ap-northeast-2a

    • IGW 생성 및 VPC에 attaching

    • NAT 생성 및 public subnet(test-2SVPN-VPC-B-Public-2a-1)에 attach

 

 

 

 

3.2. Instance 구성

3.2.1. VPC-A Instance

  • Instance Name : test-2SVPN-VPC-A-Public-2a-1

  • Instance Type : Amazon Linux2, t2.micro

  • Subnet : test-2SVPN-VPC-A-Public-2a-subnet

  • Security Group Name : test-2SVPN-VPC-A-Public-sg

  • Open Port : SSH, tcp 50, tcp 51, udp 500, udp 4500, tcp 4500, icmp를 test-2SVPN-VPC-B-Public-sg의 보안그룹에 대해 모두 열어준다. (SSH의 경우, 내 현재 ip도 추가한다.)

3.2.2. VPC-B Instance

  • Public Instance

    • Instance Name : test-2SVPN-VPC-B-Public-2a-1

    • Instance Type : Amazon Linux, t2.micro

    • Subnet : test-2SVPN-VPC-B-Public-2a-subnet

    • Security Group Name : test-2SVPN-VPC-B-Public-sg

    • Open Port : SSH, tcp 50, tcp 51, udp 500, udp 4500, tcp 4500, ICMP를 “test-2SVPN-VPC-A-Public-2a-1”인스턴스의 private ip“test-2SVPN-VPC-B-Private-2a-1“인스턴스의 private ip에 대해 열어둔다. (SSH의 경우, 내 현재 ip도 추가한다.)

  • Private Instance

    • Instance Name : test-2SVPN-VPC-B-Private-2a-1

    • Instance Type : Amazon Linux2, t2.micro

    • Subnet : test-2SVPN-VPC-B-Private-2a-1

    • Security Group Name : test-2SVPN-VPC-B-Private-sg

    • Open Port : SSH, tcp 50, tcp 51, udp 500, udp 4500, tcp 4500, ICMP를 “test-2SVPN-VPC-A-Public-2a-1“인스턴스의 private ip에 대해 열어둔다, “test-2SVPN-VPC-B-Public-sg”에 대해 SSH를 열어둔다.

 

 

 

3.3. VPN 설정

3.3.1. Customer Gateway 생성

다음과 같이 Public Instance IP와 NAT Gateway IP에 대해 Customer Gateway를 생성한다.

  • 이름 : test-2SVPN-VPC-B-CGW-Public, test-2SVPN-VPC-B-CGW-NAT

  • 라우팅 : 정적

  • IP 주소 : 각각 할당받은 public ip 또는 eip

  • Certificate ARN : Default

 

 

 

3.3.2. Virtual Private Gateway생성 및 라우팅 전파

다음과 같이 Virtual Private Gateway를 생성한다.

  • 이름 : test-2SVPN-VPC-A-vgw

  • ASN : Amazon 기본 ASN

다음과 같이 생성한 Virtual Private Gateway를 VPC-A에 Attach한다.

Attach 적용 후, Routing Table에 서브넷에 속한 인스턴스에 대해 Routing Propagation을 적용한다.

 

 

 

3.3.3. Site to Site VPN Connection 생성 및 VPN 설정 다운로드

 

VPN Connection이 완전히 생성될때까지 5분정도 소요됩니다.

사용가능한 상태가 되기 전까지 3.4를 수행하는 것을 권장합니다.

다음과 같이 2개의 Customer Gateway에 대해 VPN Connection을 생성한다.

  • 이름 : test-2SVPN-public-to-public, test-2SVPN-public-to-private

  • Target Gateway Type : Virtual Private Gateway

  • 가상 프라이빗 게이트웨이 : 생성한 게이트웨이 선택

  • 고객 게이트웨이 : 기존

  • Customer Gateway ID : test-2SVPN-CG, test-2SVPN-NAT

  • 라우팅 옵션 : 정적

  • 정적 IP 접두사 : Customer측 VPC CIDR(이 Hands on LAB을 따라 하였으면 20.0.0.0/16 입력)

 

 

 

3.4. VPC-B instance에 VPN설정 공유

3.4.1. VPN 구성 다운로드

다음과 같이 2개의 connection에 대해 VPN 구성 정보를 다운로드 한다.

  • 공급 업체 : Generic

  • 플랫폼 : Generic

  • 소프트웨어 : Vendoe Agnositc

 

 

 

3.4.2. Customer 측 인스턴스 sysctl.conf 수정

다음과 같이 /etc/sysctl.conf파일을 수정한다.

스크립트는 다음을 참조한다.

net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0

작성 후 , sudo service network restart를 이용하여 sysctl.conf를 적용시킨다.

 

 

 

3.4.3. OpenSwan 설치 및 환경 변수 세팅

 

환경 변수는 [3.4.1. 구성 다운로드 섹션]의 다운로드 받은 구성 정보가 필요합니다.

진행하기 전 필히 구성 정보를 다운로드 받아주세요.

다음과 같이 Openswan을 설치한다.

OpenSwan을 설치하고 난 후, 다음과 같이 /etc/ipsec.conf 파일과 /etc/ipsec.d 디렉토리가 생성되어 있을 것이다.

다운로드 받은 VPN 구성파일을 열어보면 2개의 터널에 대해 정보가 명시가 되어있다.

IPSec Tunnel #1
================================================================================
#1: Internet Key Exchange Configuration

Configure the IKE SA as follows:
Please note, these sample configurations are for the minimum requirement of AES128, SHA1, and DH Group 2.
Category "VPN" connections in the GovCloud region have a minimum requirement of AES128, SHA2, and DH Group 14.
You will need to modify these sample configuration files to take advantage of AES256, SHA256, or other DH groups like 2, 14-18, 22, 23, and 24.
Higher parameters are only available for VPNs of category "VPN," and not for "VPN-Classic".
The address of the external interface for your customer gateway must be a static address.
Your customer gateway may reside behind a device performing network address translation (NAT).
To ensure that NAT traversal (NAT-T) can function, you must adjust your firewall !rules to unblock UDP port 4500. If not behind NAT, we recommend disabling NAT-T.
  - IKE version              : IKEv1 
  - Authentication Method    : Pre-Shared Key 
  - Pre-Shared Key           : <YOUR PSK>
  - Authentication Algorithm : sha1
  - Encryption Algorithm     : aes-128-cbc
  - Lifetime                 : 28800 seconds
  - Phase 1 Negotiation Mode : main
  - Diffie-Hellman           : Group 2


  -- 중략 --


  The Customer Gateway inside IP address should be configured on your tunnel
interface. 

Outside IP Addresses:
  - Customer Gateway                 : 52.79.125.78 
  - Virtual Private Gateway            : 13.125.105.72

Inside IP Addresses
  - Customer Gateway                 : 169.254.49.50/30
  - Virtual Private Gateway             : 169.254.49.49/30


  -- 중략 --


  IPSec Tunnel #2
================================================================================
#1: Internet Key Exchange Configuration

Configure the IKE SA as follows:
Please note, these sample configurations are for the minimum requirement of AES128, SHA1, and DH Group 2.
Category "VPN" connections in the GovCloud region have a minimum requirement of AES128, SHA2, and DH Group 14.
You will need to modify these sample configuration files to take advantage of AES256, SHA256, or other DH groups like 2, 14-18, 22, 23, and 24.
Higher parameters are only available for VPNs of category "VPN," and not for "VPN-Classic".
The address of the external interface for your customer gateway must be a static address.
Your customer gateway may reside behind a device performing network address translation (NAT).
To ensure that NAT traversal (NAT-T) can function, you must adjust your firewall !rules to unblock UDP port 4500. If not behind NAT, we recommend disabling NAT-T.
  - IKE version              : IKEv1 
  - Authentication Method    : Pre-Shared Key 
  - Pre-Shared Key           : <YOUR PSK>
  - Authentication Algorithm : sha1
  - Encryption Algorithm     : aes-128-cbc
  - Lifetime                 : 28800 seconds
  - Phase 1 Negotiation Mode : main
  - Diffie-Hellman           : Group 2


  -- 중략 --


  The Customer Gateway inside IP address should be configured on your tunnel
interface. 

Outside IP Addresses:
  - Customer Gateway                 : 52.79.125.78 
  - Virtual Private Gateway            : 52.78.178.100

Inside IP Addresses
  - Customer Gateway                 : 169.254.101.166/30
  - Virtual Private Gateway             : 169.254.101.165/30

위 텍스트에서 필요한 부분은 각 터널에 대한 Pre-Shared Key와 각 Tunnel의 Outside IP Address이다. 이 정보를 ipsec.d/ 디렉토리 안에 명시 할 것이다.

sudo su를 입력하여 root권한으로 다음과 같이 두개의 파일을 작성해야 한다.

 

 

 

---------------------------------------------------------------------------------------------------------------------------

20191202 트러블슈팅

VPN Connection에 대해 기본적으로 2개의 터널이 제공됩니다. 단일 터널로 실행했을 때는 문제가 없었으나, 2개의 터널을 모두 사용할 때 터널 status는 모두 on임에도 불구하고 ping이 제대로 되지 않던 문제가 있었다.

해당 문제에 대한 로그는 다음과 같다.

"2SVPN2" #4: cannot install eroute -- it is in use for "2SVPN1" #3

"2SVPN1" #4: cannot install eroute -- it is in use for "2SVPN2" #3
"2SVPN1" #4: deleting state (STATE_QUICK_I1) and NOT sending notification
"2SVPN1" #4: ERROR: netlink response for Del SA esp.b5b1185b@15.164.153.107 included errno 3: No such process
"2SVPN1" #1: next payload type of ISAKMP Hash Payload has an unknown value: 31 (0x1f)
"2SVPN1" #1: malformed payload in packet

이미 먼저 연결이 성립된 customer gateway가 사용중이었고, 사용중이므로, 다른 연결 요청에 대해서는 응답을 하지 않게 된다. 키가 다르면 응답을 하지 않기 때문에 서버는 인증 요청이 잘못되어 에러가 난것으로 최종 간주하였다.

이를 해결하기 위해 구글링 한 결과, overlapip라는 다중 터널 구성시, 같은 customer ip를 사용할 수 있도록 하는 설정이 있었다. 이를 설정해주니 2중 터널 구성이 정상적으로 작동하였다.

---------------------------------------------------------------------------------------------------------------------------

 

 

VPN 구성 정보 (vi /etc/ipsec.d/2SVPN.conf)

conn 2SVPN1                       # Tunnel 1
        authby = secret
        auto = start
        left = %defaultroute
        leftid = 15.164.118.208   # Public Customer Gateway IP Address
        right = 15.164.153.107    # Public Virtual Private Gateway IP Address
        type = tunnel
        ikelifetime = 8h
        keylife = 1h
        phase2alg = aes128-sha1;modp1024
        ike = aes128-sha1;modp1024
        keyingtries = %forever
        keyexchange = ike
        leftsubnet = 20.0.0.0/16  # Customer Side VPC CIDR
        rightsubnet = 10.0.0.0/16 # AWS Side VPC CIDR
        dpddelay = 10
        dpdtimeout = 30
        dpdaction = restart_by_peer
        overlapip=yes            


conn 2SVPN2                        # Tunnel 2
        authby = secret
        auto = start
        left = %defaultroute
        leftid = 15.164.118.208    # Public Customer Gateway IP Address
        right = 15.164.186.29      # Public Virtual Private Gateway IP Address
        type = tunnel
        ikelifetime = 8h
        keylife = 1h
        phase2alg = aes128-sha1;modp1024
        ike = aes128-sha1;modp1024
        keyingtries = %forever
        keyexchange = ike
        leftsubnet = 20.0.0.0/16
        rightsubnet = 10.0.0.0/16
        dpddelay = 10
        dpdtimeout = 30
        dpdaction = restart_by_peer
        overlapip=yes

 

 

 

VPN Tunnel PSK 설정 (vi /etc/ipsec.d/2SVPN.secrets)

psk설정 파일의 이름은 확장자를 제외하고 구성정보를 명시한 파일의 이름과 같아야한다.

15.164.118.208 15.164.153.107: PSK "<YOUR TUNNNEL1 PSK>"
15.164.118.208 15.164.186.29: PSK "<YOUR TUNNEL2 PSK>"

위같이 2개의 파일에 대해 작성하고 저장한 다음,

_sudo service network restart, sudo service ipsec restart_를 터미널에 입력하여 ipsec서비스를 실행시킨다.

실행 시키고 난뒤, sudo service ipsec status를 입력하여 다음과 같은 메시지가 출력되면 제대로 VPN Tunnel이 설정 된 것이다.

"2SVPN2" #2: STATE_MAIN_I2: sent MI2, expecting MR2
"2SVPN2" #2: STATE_MAIN_I3: sent MI3, expecting MR3
"2SVPN1" #1: Peer ID is ID_IPV4_ADDR: '15.164.153.107'
"2SVPN1" #1: STATE_MAIN_I4: ISAKMP SA established {auth=PRESHARED_KEY cipher=aes_128 integ=sha group=MODP1024}
"2SVPN1" #3: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS+UP+OVERLAPIP+IKEV1_ALLOW+IKEV2_ALLOW+SAREF_T...MODP1024}
"2SVPN2" #2: Peer ID is ID_IPV4_ADDR: '15.164.186.29'
"2SVPN2" #2: STATE_MAIN_I4: ISAKMP SA established {auth=PRESHARED_KEY cipher=aes_128 integ=sha group=MODP1024}
"2SVPN2" #4: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS+UP+OVERLAPIP+IKEV1_ALLOW+IKEV2_ALLOW+SAREF_T...MODP1024}
"2SVPN1" #3: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP/NAT=>0x5f303410 <0x8d8726...D=active}
"2SVPN2" #4: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP/NAT=>0x03158d89 <0x8f026e...D=active}

 

 

 

 

3.5. Ping, SSH 테스트

 

Virtual Private Gateway는 단일 연결만 지원하기 때문에 Virtual Private Gateway를 통해 2쌍 이상의 연결을 할 수 없습니다. 하나의 연결이 성립된 상태에서 다른 VPN Connection을 요청할 경우, 기존 VPN Connection이 disconnect됩니다. 동시다발적으로 연결을 원할 경우, Transit Gateway를 사용해야한다.

필자는 VPC-A public === VPC-B public VPN연결이 성립된 상태에서

VPC-A public === VPC-B private 연결을 추가 요청하니 전자의 연결이 끊기고 후자의 연결이 성립되었다.

ping명령어를 통하여 private ip로 응답이 있는지 확인한다.

 

 

 

Customer → AWS

 

 

AWS → Customer

마찬가지로 SSH 접속이 되는지 확인한다.

 

 

Customer → AWS

 

 

AWS → Customer

 

 

 

또한, 2개의 터널이 정상적이라면 다음과 같이 터널의 상태가 UP을 출력할 것이다.

 

  1. rain 2020.04.09 19:10

    똑같이 따라했는데 ipsec status가
    Apr 09 10:07:26 ip-20-0-20-209.ap-northeast-2.compute.internal pluto[9989]: "test_VPN1" #46: STATE_MAIN_I1: retransmission; will wait 4 seconds for response
    Apr 09 10:07:26 ip-20-0-20-209.ap-northeast-2.compute.internal pluto[9989]: "test_VPN2" #45: STATE_MAIN_I1: retransmission; will wait 4 seconds for response
    Apr 09 10:07:30 ip-20-0-20-209.ap-northeast-2.compute.internal pluto[9989]: "test_VPN1" #46: STATE_MAIN_I1: retransmission; will wait 8 seconds for response

    이렇게 뜨면서 연결이 안되는 무엇일까요.. sg는 올오픈

    • JeongHyeongKim 2020.04.10 00:29 신고

      먼저 환경 변수 세팅(ip address, key 등등)이 제대로 되어있는지 확인해주시면 감사드려요!
      예전에 환경 변수를 잘못 세팅하니 서로 패킷을 주고받지 못하여, 패킷트레이서를 보면서 저 문제를 해결하였던 기억이 있습니다!
      만약 그래도 해결이 되지 않으신다면,
      괜찮으시다면 로그 일부분이 아닌 풀 로그를 정중하게 요청드립니다...!
      댓글이나 maladroit1@likelion.org로 캡쳐본을 보내주시면 함께 고민해보겠습니다 :)

1. 문제 설명

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다.

예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.

-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3

 

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

 

 

2. 제한사항

  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

 

 

3. 입출력 예

numbers target return
[1, 1, 1, 1, 1] 3 5

 

 

4. 문제를 보고 가진 생각 정리

위 문제는 5개수를 모두 사용하여 나올 수 있는 경우의 수를 생각하여야 한다. 위 테스트 케이스 기준 나올 수 있는 총 경우의 수는 2^5로 32개이다. 이 경우의 수를 이진 그래프로 나타내보았다.

 

모든 경우의 수를 표현하려면 그림이 너무 커져서 2개의 수에 대해서만 생각을 해보았다. 문제 예시처럼 5개의 수가 주어진다면, 깊이가 5인 곳에서의 모든 경우의 수에 대한 합을 구하여 target과 일치하는 로직으로 풀이를 하면 될 것이라고 생각하였다. 또한, 깊이 우선으로 탐색을 하여야 하기 때문에, 함수에서 함수를 호출하는 재귀 함수를 선택하기로 하였다. 

 

 

5, 풀이 코드

class Solution {
    
    int answer = 0;
    
    public int solution(int[] numbers, int target) {
    	//4번의 그림에서 start와 같은 로직
        search(numbers, target, 0);
        return answer;
    }
    
    public void search(int[] numbers, int target, int depth){
    
    	//입력된 numbers의 length까지 탐색을 완료하였을 경우, 배열의 합을 구하여 target과 비교
        if(numbers.length == depth){
            int sum=0;
            for(int i=0;i<numbers.length;i++){
                sum+=numbers[i];
            }
            if(sum==target)
                answer++;
        //탐색이 완료되지 않았다면, 다음 depth에 해당하는 탐색을 진행한다.
        //numbers에서 제공된 수가 양수일 수도 있고, 음수일 수도 있기 때문에 두 경우에 대해 탐색 진행.
        }else{
            search(numbers, target, depth+1);
            numbers[depth]*=-1;
            search(numbers, target, depth+1);
        }
    }
}

'IT > Algorithm' 카테고리의 다른 글

[프로그래머스] 타겟 넘버  (0) 2020.05.07
[프로그래머스] 완주하지 못한 선수  (0) 2020.04.29

1. 문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

 

 

2. 제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

 

 

3. 입출력 예

participant completion return
[leo, kiki, eden] [eden, kiki] leo
[marina, josipa, nikola, vinko, filipa] [josipa, filipa, marina, nikola] vinko
[mislav, stanko, mislav, ana] [stanko, ana, mislav] mislav

 

 

 

4. 입출력 예 설명

예제 #1
leo는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
vinko는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
mislav는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 

 

 

 

5. 문제 해석 및 회고

위 문제는 배열을 비교하여 participant 배열에는 없는 것을 찾는 문제였다. 지금까지 C++위주로 학습하다 JAVA로 풀이하려니 JAVA 자료형에 대한 이해가 부족한 것을 많이 느꼈다. 다음은 내가 몰랐던 부분이거나, 짚고 넘어가야 할 부분이다.

 

  • Java에서 Map 자료형은 같은 key가 입력될때, 기존 값을 덮어쓰기 해버린다
  • String[] 자료형과 ArrayList자료형의 길이(사이즈)를 구할때는 각각 .length와 .size()를 사용한다.
  • Map자료형을 탐색시, Iterator를 사용하여 키 값을 기준으로 탐색이 가능하다.

맨 처음 풀때는, string값 하나하나를 .equals()로 비교하다보니 정답은 나왔지만 효율성에서 매우 꽝이었다. 효율성을 위해 고민한 결과, 탐색시, 나왔던 값과 나오지 않은 값에 대한 판단을 HashMap에 <key, value>로 담아 관리하게 되면 string 비교를 하지 않고 등장 횟수 처리를 통해 조금 더 효율적으로 처리할 수 있을 것이라 판단했다.

위 생각을 확장하면, 데이터가 모두 다른 사람으로 주어진다면, 0 or 1로 처리가 가능하다. 그러나 이 문제는 동명이인이 있을 수 있기 때문에, 이에 대한 처리도 필요하였다. 그래서 달릴 거리가 남아 있는 상태를 1 이상의 수, 완주하여 complete한 상태를 0으로 하여 문제를 풀기로 마음먹었다. 풀이 코드는 다음과 같다.

 

 

 

 

6. 풀이 코드

import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;

class Solution {
    public String solution(String[] participant, String[] completion) {

        String answer = new String();
        Map<String, Integer> map = new HashMap<>();
        
        //마라톤 참가자의 map 등록, 동명이인은 1번 더 같은 거리를 뛰는 것으로 간주하고, 동일인 취급.
        for(int i=0;i<participant.length;i++){
            if(map.get(participant[i])==null){
                map.put(participant[i], 1);
            }else{
                map.put(participant[i], map.get(participant[i])+1);
            }
        }
        
        //완주자는 완주거리에 대한 값 빼줌.
        for(int i=0;i<completion.length;i++){
                map.put(completion[i], map.get(completion[i])-1);
        }

		//아직 뛸 거리가 남은 사람을 탐색한다.
        //완주할 거리가 남아있으면, 1이상의 값을 나타낸다.
        //완주 하였으면 더이상 뛸 거리가 없으므로 0으로 표기한다.
        Iterator<String> iter = map.keySet().iterator();
        while(iter.hasNext()){
            answer = iter.next();
            //완주하지 못한 사람이 걸리면 바로 값을 return 한다.
            if(map.get(answer)!=0){
                return answer;
            }
        }
        
        //while문에 안걸리면 마지막 Map 원소의 key값이 덜 뛴 사람이다.
        return answer;
    }
}

 

 

 

 

7. 출처

https://programmers.co.kr/learn/courses/30/lessons/42576

'IT > Algorithm' 카테고리의 다른 글

[프로그래머스] 타겟 넘버  (0) 2020.05.07
[프로그래머스] 완주하지 못한 선수  (0) 2020.04.29

+ Recent posts