어흥

[백준 3107] IPv6 (C++, Java) 본문

알고리즘/백준

[백준 3107] IPv6 (C++, Java)

라이언납시오 2022. 1. 4. 19:46
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/3107

 

3107번: IPv6

첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.

www.acmicpc.net

1. 주의할 점

- : 를 기준으로 어떻게 나눌것인가

- ::를 어떻게 처리할 것인가

 

2. 구현

- C++의 경우에는 sstream을 통해, Java의 경우에는 split을 통해 세미콜론을 처리했다. 다만, Java의 경우 끝에 ::가 있을 때 처리를 못해서 추가 코딩이 필요하다

- 세미콜론을 기준으로 문자열을 잘랐을 때, 해당 문자의 길이에 따라 조건을 처리하고 V 벡터 or Li 리스트에 추가한다

- 길이가 4면 그대로 추가

- 길이가 (0,4)에 속하면 앞에 0을 추가하여 길이가 4가 되도록 만든 후, 추가한다

- 길이가 0이라면, ::라는 의미이므로 -1을 추가한다

- 모든 작업이 끝난 후, 추가된 벡터/리스트의 원소를 하나씩 살피며 -1이 아니라면 그대로 다른 저장소에 추가한다

- 만약 -1이라면 전체 길이 8에서 세미콜론으로 나눠진 부분(Part)을 뺀 횟수만큼 0000을 추가한다

 

[C++]

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int part = 0;
	string str, s;
	vector<string> v, temp;
	cin >> str;

	istringstream ss(str);
	while (getline(ss, s, ':')) {
		int len = s.size();
		if (len) {
			part++;
			if (len < 4) {		//축약
				while (len < 4) {
					s = "0" + s;
					len++;
				}
			}
		}
		else if (len == 0)	s = "-1";
		v.push_back(s);
	}

	bool add = false;
	for (int i = 0; i < v.size(); i++) {
		s = v[i];
		if (s == "-1") {
			if (!add) {
				int repeat = 8 - part;
				while (repeat--) {
					temp.push_back("0000");
				}
				add = true;
			}
		}
		else temp.push_back(s);
	}
	for (int i = 0; i < 8; i++) {
		cout << temp[i];
		if (i < 7)
			cout << ":";
	}
	return 0;
}

 

[Java]

import java.util.*;
import java.lang.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine().trim();
		String list[] = str.split(":");
		List<String> li = new ArrayList<>();
		List<String> temp = new ArrayList<>();
		int part = 0;
		
		for(String s : list) {
			int len = s.length();
			if(len>0) {
				part++;
				if(len<4) {
					while(len<4) {
						s = "0"+s;
						len++;
					}
				}
			}
			else s = "-1";
			li.add(s);
		}
		
		boolean add = false;
		for(String ss: li) {
			if(ss.equals("-1")) {
				if(add) continue;
				int repeat = 8-part;
				while(repeat>0) {
					temp.add("0000");
					repeat--;
				}
				add=true;
			}
			else temp.add(ss);
		}
        //마지막이 ::일때 못잡기 때문
		while(part<8) {
			temp.add("0000");
			part++;
		}
		for(int i=0;i<8;i++) {
			System.out.print(temp.get(i));
			if(i<7) System.out.print(":");
		}
	}
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2026] 소풍 (C++, Java)  (0) 2022.01.16
[백준 9007] 카누 선수 (C++)  (0) 2022.01.12
[백준 2064] IP 주소 (C++)  (0) 2021.12.29
[백준 14940] 쉬운 최단거리 (C++)  (0) 2021.12.26
[백준 19538] 루머 (C++)  (0) 2021.12.24
Comments