728x90

프로그램이 실행되다가 실행이 끝나면 프로그램이 종료되기 때문에 실행창이 바로 꺼지는 것이다.

이 때 return 문 앞에 system("pause"); 이 코드는 실행이 끝나도 창이 바로 꺼지지 않고 멈춰있게 하는 것이다.

system("pause");
return 0; //리턴문 앞에
728x90
728x90

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

 

6321번: IBM 빼기 1

문제 '2001: 스페이스 오디세이'는 아서 C. 클라크의 소설이자 스탠리 큐브릭 감독의 영화이다. 이 작품에서 우주선은 토성으로 가고 있다. 긴 여행동안 선원들은 모두 정체 상태에 빠져있고, 두 선원은 깨어나 있다. 우주선은 인공지능 컴퓨터 HAL이 조정하고 있다. HAL은 점점 이상하게 행동하더니 선원들을 죽이기 시작했다. 자세한 이야기는 소설을 읽거나 영화를 보면 알 수 있다. 영화가 유명해지고 난 이후에 사람들은 '2001: 스페이스 오디세이'에

www.acmicpc.net

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


int main() {
	int n;
	cin >> n;
	for (int t = 0; t < n; t++) {
		string s;
		cin >> s;
		cout << "String #" << t + 1 << '\n';
		for (int i = 0; i < s.size(); i++) {
			if (s[i] != 90) cout << (char)(s[i] + 1);
			else cout << 'A';
		}
		cout << "\n\n";
	}
	return 0;
}

'\n'을 두 번 쓸 때에는 "\n\n"이라고 쓰는 거 주의하자. 한 줄만 띄는 게 습관이 되어서 자꾸 '\n\n' 한다. 문제는 그렇게 해도 오류가 안 난다. 'hi'이렇게 알파벳은 컴파일 에러가 나는데 \n은 안 난다.

728x90
728x90

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

 

6378번: 디지털 루트

문제 양의 정수 N의 디지털 루트를 구하려면 N을 이루고 있는 모든 자리수를 더해야 한다. 이때, 더한 값이 한 자리 숫자라면, 그 수가 N의 디지털 루트가 된다. 두 자리 이상 숫자인 경우에는 다시 그 수를 이루고 있는 모든 자리수를 더해야 하며, 한 자리 숫자가 될 때 까지 반복한다. 24의 디지털 루트를 구해보자. 2+4=6이다. 6은 한 자리 숫자이기 때문에, 24의 디지털 루트는 6이 된다. 39의 경우에는 3+9=12이기 때문에, 한 번 더 더

www.acmicpc.net

처음에는 이렇게 제출했었는데 틀렸다.

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


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	while (true) {
		int n;
		cin >> n;
		if (n == 0) break;
		while (true) {
			vector<int> v;
			while (n != 0) {
				v.push_back(n % 10);
				n /= 10;
			}
			int total = 0;
			for (int i : v) {
				total += i;
			}
			if (total < 10) {
				cout << total << '\n';
				break;
			}
			else {
				n = total;
			}
		}
	}
	return 0;
}

보니까 숫자는 최대 1000자리수라고 했다.

그러니 당연히 아무리 범위가 큰 타입을 써도 오버플로우가 날 수밖에 없었다.

따라서 문자열로 받아서 풀었다.

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


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int numbers[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	char charNumbers[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
	string stringNumbers[10] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
	map<char, int> m;
	map<int, string> sm;
	for (int i = 0; i < 10; i++) {
		m[charNumbers[i]] = numbers[i];
		sm[numbers[i]] = stringNumbers[i];
	}
	while (true) {
		string n;
		cin >> n;
		if (n == "0") break;
		while (true) {
			int total = 0;
			for (int i = 0; i < n.size(); i++) {
				total += m[n[i]];
			}
			if (total < 10) {
				cout << total << '\n';
				break;
			}
			else {
				n = "";
				while (total != 0) {
					n.append(sm[total % 10]);
					total /= 10;
				}
			}
		}
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 4641번 Doubles  (0) 2020.02.11
[백준] 6321번 IBM 빼기 1  (0) 2020.02.10
[백준] 6679번 싱기한 네자리 숫자  (0) 2020.02.10
[백준] 2845번 파티가 끝나고 난 뒤  (0) 2020.02.10
[백준] 9012번 괄호  (0) 2020.02.10
728x90

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

 

6679번: 싱기한 네자리 숫자

문제 싱기한 네자리 숫자란, [1000,9999]인 10진수 숫자중에서,  다음의 조건을 만족하는 숫자를 말한다. 숫자를 10진수, 12진수, 16진수로 나타낸 다음, 각각의 숫자에 대해, 각 숫자의 자리수를 더했을 때, 세 값이 모두 같아야 한다. 여러분은 싱기한 네자리 숫자를 모두 출력해야 한다. 입력 입력은 주어지지 않는다. 출력 싱기한 네자리 숫자를 오름차순으로 한줄에 하나씩 출력한다. 예제 입력 1 복사 예제 출력 1 복사 2992 2993 29

www.acmicpc.net

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


int main() {
	ios_base::sync_with_stdio(false);
	for (int i = 1000; i < 10000; i++) {
		vector<int> binary;
		vector<int> hexadecimal;
		vector<int> decimal;
		int n = i;
		while (n != 0) {
			binary.push_back(n % 12);
			n /= 12;
		}
		n = i;
		while (n != 0) {
			int a = n % 16;
			hexadecimal.push_back(a);
			n /= 16;
		}
		n = i;
		while (n != 0) {
			decimal.push_back(n % 10);
			n /= 10;
		}
		int hexadecimalSum = 0;
		int decimalSum = 0;
		int binarySum = 0;
		for (int num : decimal)
			decimalSum += num;
		for (int num : hexadecimal) {
			hexadecimalSum += num;
		}
		for (int num : binary)
			binarySum += num;
		if (binarySum == decimalSum && decimalSum == hexadecimalSum)
			cout << i << '\n';
	}
	return 0;
}

정말 오늘따라 더 느끼는 문제 똑바로 읽기의 중요성.

2진수인줄 알고 2진수, 10진수 16진수로 했는데 답이 안 나와서 이걸가지고 한 시간을 헤맸다. 그런데 12진수였다.

문제를 똑바로 읽자

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 6321번 IBM 빼기 1  (0) 2020.02.10
[백준] 6378번 디지털 루트  (0) 2020.02.10
[백준] 2845번 파티가 끝나고 난 뒤  (0) 2020.02.10
[백준] 9012번 괄호  (0) 2020.02.10
[백준] 2252번 줄 세우기  (0) 2020.02.10
728x90

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

 

2845번: 파티가 끝나고 난 뒤

문제 파티가 끝나고 나면, 사람들은 누가 파티에 왔는지와 얼마나 많은 사람들이 왔는지를 궁금해한다. 보통 파티는 매우 크게 열리기 때문에, 정확하게 몇 명이 참가했는지 알 수가 없다. 지난주 토요일에 상근이는 자신의 3학년 진학을 기념하면서 매우 성대한 파티를 열었다. 그리고, 상근이는 1m2당 몇 명의 사람이 있었는지 알고있다. 상근이의 파티는 정말 엄청난 규모였기 때문에, 대부분의 신문에도 기사가 실렸다. 상근이는 서로 다른 5개의 신문을 보면서 그

www.acmicpc.net

#include <iostream>
using namespace std;


int main() {
	int l, p;
	cin >> l >> p;
	for (int i = 0; i < 5; i++) {
		int a;
		cin >> a;
		cout << a - p * l << " ";
	}
	return 0;
}

오늘 다시 한 번 느낀 것. 문제를 똑바로 읽자. l이 기사의 개수인 줄 알고 for문을 i =0부터 i < l까지 돌려서 틀렸었다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 6378번 디지털 루트  (0) 2020.02.10
[백준] 6679번 싱기한 네자리 숫자  (0) 2020.02.10
[백준] 9012번 괄호  (0) 2020.02.10
[백준] 2252번 줄 세우기  (0) 2020.02.10
[백준] 2161번 카드1  (0) 2020.02.09
728x90

1편에 이어지는 글이다. (↓1편 링크)

https://breakcoding.tistory.com/113

 

[Java] 컬렉션 프레임워크 (List, Set, Queue, Map) 1

데이터의 모임(컬렉션)을 다룰 때 배열을 사용하면 중간에 끼워넣기에도 불편하고 크기를 늘릴 수도 없어 여러 가지로 불편한 점이 많다. 그래서 더 편리한 자료구조를 만든 것이 컬렉션이다. 컬렉션과 컬렉션 프..

breakcoding.tistory.com

지난 포스팅의 내용을 간단히 정리하자면 컬렉션 프레임워크는 인터페이스와 클래스로 구성되어 있는데 Collection, List, Queue, Set, Map 이 5가지가 인터페이스이다. (이 인터페이스 5가지는 꼭 알아두자.)

List 인터페이스의 ArrayList는 자주 사용하므로 꼭 알아놔야 하고 LinkedList의 특이한 점은 List의 구현 클래스이자 Queue의 구현 클래스라는 거. Vector는 ArrayList와 똑같은데 Vector는 동기화를 지원하고 ArrayList는 동기화를 지원한다는 거, 따라서 동기화가 필요한 멀티스레딩이 아니라면 ArrayList를 쓰는 게 낫다. 멀티스레딩이 아닌데 굳이 Vector를 쓰면 performance가 더 떨어진다.

Set은 순서가 중요하지 않고 동일한 데이터가 없는 자료구조이다. Set에는 HashSet과 TreeSet이 있다는 것 정도는 알아두자. 굳이 HashSet과 TreeSet의 차이점을 말하자면 HashMap은 동기화를 지원하지 않고 Hashtable은 동기화를 지원한다. 그리고 HashMap은 key 값이든 value 값이든 null을 사용할 수 있는데 Hashtable은 null의 사용이 불가능하다.

 

List는 인터페이스이기 때문에 객체를 생성하지 못한다. 따라서 자식 클래스인 ArrayList 등을 사용해야 하는데 선언할 때에는

List<Integer> list = new ArrayList<>();

ArrayList가 아니라 이렇게 List 타입으로 많이 선언하는 것 같다. 그리고 나서 객체를 생성할 때에 구현 클래스로 생성하는 것이다. 대부분 이렇게 많이 쓰므로 그냥 관습에 따르는 것이 좋다.

 

List와 Set은 서로 반대되는 성질을 가지고 있다.

List는 순서가 있고 중복될 수 있는 반면 Set은 순서가 없고 중복될 수 없다.

 

Collection 인터페이스에서는 여러가지 메소드로 다양한 기능들을 제공한다. (지난 포스팅에 메소드들을 정리해놓았다.) 하지만 배열은 그렇지 않다. 메소드가 없다. 즉 기능이 별로 없다. 배열의 크기를 알고 싶으면 배열이름.length()가 아니라 배열이름.length이다. 메소드가 아니다. 하지만 String은 문자열의 길이를 알고 싶으면 문자열.length()이고 컬렉션도 컬렉션에 저장된 원소의 개수를 알고 싶다면 컬렉션객체.size()이다. 이렇게 크기를 알아내는 방법만 봐도 기능이 많은 String과 Collection은 메소드로 크기를 알아낸다.

따라서 가능하면 기초형보다는 참조형이 좋다. 사실 배열도 참조형인데 기초형의 데이터를 여러개 모아놓은 정도이기 때문에 기능이 별로 없다.

컬렉션은 제네릭 타입이기 때문에 <> 사이에 타입을 써주는 것이 좋다. <> 사이에는 int, double, boolean과 같은 기초타입은 쓰면 안 되고 참조 타입을 써줘야 한다. 기초타입을 쓰고 싶다면 Integer, Double, Boolean과 같은 Wrapper 클래스로 써줘야 한다. 그래도 자동 형변환이 되어 오류가 안 난다.

 

이제 본격적으로 Map을 배워보자. 일단 기본적인 Map의 메소드들부터 살펴보자.

void clear() 맵에 있는 모든 엔트리를 삭제한다.
boolean containsKey(Object key) key라는 키를 가진 엔트리가 있는지 없는지를 반환한다.
boolean containsValue(Object value) value라는 값을 가진 엔트리가 있는지 없는지 반환한다.
Set> entrySet() 맵에 있는 모든 엔트리를 원소로 하는 Set 객체를 만든다.
V get(Object key) key에 해당하는 value를 반환한다.
boolean isEmpty() 맵 객체가 비어있는지 아닌지를 반환한다.
Set keySet() key값들을 모아 Set 객체를 만든다.
V put(K key, V value) key-value 엔트리를 맵 객체에 추가한다.
V remove(Object key) key에 해당하는 엔트리를 삭제한다.
int size() 맵 객체에 저장된 엔트리의 개수를 반환한다.
Collection values() 맵에 저장된 value들을 모아 컬렉션 객체를 만든다.

Map 인터페이스는 키와 값을 쌍으로 저장한다. 메소드만 봐도 containsKey(), containsValue()라는 메소드가 있다.

Map에 저장된 객체 중에 해당 key 또는 value가 있는지를 알아낼 수 있다.

get 메소드는 key를 주면 value가 나오는 메소드이다. key가 유일하기 때문에 key로 접근해서 value를 얻어올 수 있다.

isEmpty()는 굳이 외우지 않아도 당연히 알테고 put 메소드는 Collection으로 따지면 add와 같은 메소드이다. Map 객체가 타입이고 맵 객체 이름이 map이라면 map.put("one", 1); 이렇게 하면 one을 key로, 1을 value로 하는 하나의 쌍이 Map에 추가된다.

 

Map은 key와 value 이렇게 두 가지 데이터를 하나의 쌍으로 저장하기 때문에 Collection과는 조금 다르다. 하지만 Map 타입을 Collection으로 바꿔야 할 수도 있다. Map을 Collection처럼 이용하고 싶다면 3가지 방법이 있다.

keySet()

keySet()을 이용하면 결과는 Set이 나온다. 맵이 Map<K, V> 였다면 Set은 Set<K>가 반환타입으로 나온다.

맵의 key값들을 모으니 당연히 Set의 원소들의 타입은 Map의 key 타입이 나올 것이다.

즉, Map에서 key 타입이 String이었다면 keySet()의 반환타입은 Set<String>이라는 것이다.

Map에서 key 값들은 유일하기 때문에 중복된 값이 없는 자료구조인 Set이 딱이다.

다음 코드는 Map 객체에서 key값들만 뽑아내서 Set에 저장하는 코드이다.

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class CollectionTest {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("김철수", 15);
        map.put("김영희", 15);
        map.put("홍길동", 40);
        System.out.println(map);
        Set<String> names = map.keySet();
        System.out.println(names);
    }
}

Map 객체에 데이터를 추가하려면 put() 메소드를 쓰면 된다. 첫 번째 원소는 key, 두 번째 원소는 value.

위 코드의 실행 결과

Map에서의 key값이었던 이름들을 모아서 Set으로 잘 만들어진 것을 볼 수 있다.sfdasfafasfaf

2. values()

key값이 아니라 value 값들만 모아서 Collection으로 만들고 싶다면 values() 메소드를 사용하면 된다.

Map에서 key값과 달리 value 값들은 중복이 있을 수도 있고 순서가 중요할 수도 있으므로 Set으로는 못 만든다. 그리고 사용자가 Queue로 바꾸고 싶은지 Set으로 바꾸고 싶은지 List로 만들고 싶은지 모르기 때문에 일단 가장 최상위 클래스인 Collection 타입으로 반환한다. 그 후에 사용자가 원하는 타입으로 바꾸면 된다. ArrayList로 바꾸고 싶으면 ArrayList로 바꿀 수 있다. (그 방법은 뒤에서 설명할 것이다.)

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class CollectionTest {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("김철수", 15);
        map.put("김영희", 15);
        map.put("홍길동", 40);
        System.out.println(map);
        Collection<Integer> ages = map.values();
        System.out.println(ages);
    }
}

위 코드의 실행 결과

여기에서 영희와 철수의 나이는 모두 15살인데 정보가 손실되지 않고 15가 두 개 다 들어간 것을 볼 수 있다.

Map에서 value 값들은 중복될 수 있다는 것을 잊지말자.

3. entrySet()

entrySet()은 Map의 key-value 한 쌍을 하나의 원소로 보는 Collection으로 바꿔준다. 이는 Map과 다르게 하나의 원소 자체가 pair이다. Map.Entry 이렇게 쓴 것에서 알 수 있듯이 Entry는 Map 인터페이스의 내부 인터페이스이다. (내부인터페이스 또는 내부클래스는 외부인터페이스.내부인터페이스 이렇게 쓴다.)

entrySet()은 Map을 key와 value를 합쳐서 한 개의 데이터로 사용하는 Collection으로 바꾸겠다는 것이다.

반환타입은 Set<Map.Entry<K, V>>이다. 왜 Set일까? value는 중복이 있을 수 있지만 key값과 value값을 합치면 유일하다.

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class CollectionTest {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("김철수", 15);
        map.put("김영희", 15);
        map.put("홍길동", 40);
        System.out.println(map);
        Collection<Map.Entry<String, Integer>> nameAndAges = map.entrySet();
        System.out.println(nameAndAges);
    }
}

위 코드의 실행 결과

위의 출력 결과는 {}인 것을 봐서 Map이고 아래는 []인 것을 봐서 Collection인 것을 알 수 있다. Map을 Collection으로 바꾼 것이다.

728x90
728x90

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

 

9012번: 괄호

문제 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(conc

www.acmicpc.net

괄호가 맞는지 아닌지는 스택을 사용하여 알아볼 수 있다.

#include <iostream>
#include <stack>
#include <string>
using namespace std;


int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int testCase;
	cin >> testCase;
	for (int t = 0; t < testCase; t++) {
		string s;
		stack<char> stack;
		cin >> s;
		bool flag = false;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] == '(') {
				stack.push('(');
			}
			else {
				if (!stack.empty()) {
					char c = stack.top();
					stack.pop();
					if (c != '(') { //짝이 안 맞으면 NO
						cout << "NO" << '\n';
						flag = true;
						break;
					}
				}
				else {
					cout << "NO" << '\n'; //아직 끝까지 안 봤는데 벌써 스택이 비어있으면 NO
					flag = true;
					break;
				}
			}
		}
		if(!flag && !stack.empty()) cout << "NO" << '\n';
		else if (!flag && stack.empty()) cout << "YES" << '\n';
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 6679번 싱기한 네자리 숫자  (0) 2020.02.10
[백준] 2845번 파티가 끝나고 난 뒤  (0) 2020.02.10
[백준] 2252번 줄 세우기  (0) 2020.02.10
[백준] 2161번 카드1  (0) 2020.02.09
[백준] 1120번 문자열  (0) 2020.02.09
728x90

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

 

2252번: 줄 세우기

첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이다. 학생들의 번호는 1번부터 N번이다.

www.acmicpc.net

처음에는 이렇게 제출했는데 시간초과가 났다.

#include <iostream>
#include <queue>
using namespace std;


int main() {
	int n, m;
	cin >> n >> m;
	vector<int> student[32001];
	for (int i = 0; i < m; i++) {
		int shorter, taller;
		cin >> shorter>> taller;
		student[taller].push_back(shorter);
	}
	vector<int> result;

	while(result.size() < n) {
		for (int i = 1; i <= n; i++) {
			if (student[i].size() == 0 && result.size() < n) {
				result.push_back(i);
				for (int j = 1; j <= n; j++) {
					for (int k = 0; k < student[j].size(); k++) {
						if (student[j][k] == i) student[j].erase(student[j].begin() + k);
					}
				}
			}
		}
	}
	for (int i = 0; i < result.size(); i++) {
		cout << result[i] << " ";
	}
	return 0;
}

딱 봐도 시간초과가 날 것인게, while문 안에 3중 for문을 썼다. 반복문을 4개를 중첩해서 쓰니까 당연히 그럴 수밖에 없다.

그래서 다시 풀었다. 

#include <iostream>
#include <queue>
using namespace std;


int main() {
	int n, m;
	cin >> n >> m;
	vector<int> student[32001];
	vector<int> inDegree(n + 1);
	for (int i = 0; i < m; i++) {
		int shorter, taller;
		cin >> shorter>> taller;
		student[shorter].push_back(taller);
		inDegree[taller]++;
	}
	queue<int> q;
	for (int i = 1; i <= n; i++) {
		if (inDegree[i] == 0) q.push(i);
	}
	while(!q.empty()) {
		int cur = q.front();
		q.pop();
		cout << cur << " ";
		for (int i = 0; i < student[cur].size(); i++) {
			inDegree[student[cur][i]]--;
			if (inDegree[student[cur][i]] == 0) q.push(student[cur][i]);
		}
	}
	return 0;
}

역시 알고리즘은 정석대로 자료구조 책에 있는 방법대로 해야 하나보다. 그래도 자료구조 수업에서 위상정렬을 배운지 거의 6개월이 넘었는데 방법을 잊지 않고 스스로 구현했다는 것이 대단하다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 2845번 파티가 끝나고 난 뒤  (0) 2020.02.10
[백준] 9012번 괄호  (0) 2020.02.10
[백준] 2161번 카드1  (0) 2020.02.09
[백준] 1120번 문자열  (0) 2020.02.09
[백준] 1547번 공  (0) 2020.02.09
728x90

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

 

2161번: 카드1

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다. 예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리

www.acmicpc.net

#include <iostream>
#include <queue>
using namespace std;


int main() {
	queue<int> q;
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		q.push(i);
	}
	while (true) {
		if (q.size() == 1) break;
		int discard = q.front();
		q.pop();
		cout << discard << " ";
		if (q.size() == 1) break;
		int cur = q.front();
		q.pop();
		q.push(cur);
	}
	cout << q.front();
	return 0;
}
728x90
728x90
 

1120번: 문자열

길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다. 두 문자열 A와 B가 주어진다. 이때, A의 길이는 B의 길이보다 작거나 같다. 이제 A의 길이가 B의 길이와 같아질 때 까지 다음과 같은 연산을 할 수 있다. A의 앞에 아무 알파벳이나 추가한다. A의 뒤에 아무 알파벳이나 추가한다. 이때, A와 B의 길이가 같으

www.acmicpc.net

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


int main() {
	string a, b;
	cin >> a >> b;
	int minCount = 0;
	if (a.size() == b.size()) {
		for (int i = 0; i < a.size(); i++) {
			if (a[i] != b[i]) minCount++;
		}
	}

	else {
		int difference = b.size() - a.size();
		minCount = 51;
		for (int i = 0; i <= difference; i++) {
			int count = 0;
			for (int j = i; j < i + a.size(); j++) {
				if (a[j - i] != b[j]) count++;
			}
			if (count < minCount) minCount = count;
		}
	}
	cout << minCount;
	return 0;
}
728x90

+ Recent posts