티스토리 뷰

728x90
반응형

https://www.acmicpc.net/submit/11866/45301836

 

로그인

 

www.acmicpc.net

문제 접근은 쉽게 하였다. 하지만, 내가 푼 방식과 다르게 풀 수 있는 방법이 알고리즘 분류에 소개되어 있어 두 가지의 방법을 소개하려 한다. 

1. 리스트

2. 큐

 

1번부터 알아보자. 리스트로 어떻게?

바로 iterator를 이용하는 것이다.

리스트에 대한 개념이 잡혀있지 않다면 다음 글을 보고 오자.

https://jhcard.tistory.com/14

 

[C++] List 라이브러리

List 라이브러리 - 노드를 통해 만들어진 자료구조이다. 이전에 말했던 vector처럼 배열 구조라고 말하기에는 힘들다. 노드라는 하나의 구조체(클래스)를 생성하여 서로 연결시키는 관계이기 때문

jhcard.tistory.com

iterator는 list의 한 요소를 가리키는 포인터라 생각하면 된다.

K만큼 오른쪽으로 이동한다. 이동하는 도중에 l.end()를 만나게 된다면 l.begin()으로 이동하고 K만큼 이동한다. K번째 이동한 후, 그 요소를 erase함수를 사용하여 삭제해준다. 여기에서 erase함수를 사용하여 삭제를 하면 erase함수는 다음을 가리키는 iterator를 반환하게 된다. 그것을 계속해서 유지해준다. 이 행위를 반복하여 리스트가 비워질 때 까지 반복하는 것이다.

#include <cstdio>
#include <list>

int main(void) {
	int N, K; scanf("%d %d", &N, &K);
	std::list<int> l;
	std::list<int>::iterator it;

	for (int i = 1; i <= N; i++) l.push_back(i);
	it = l.begin();
	int turn = 1;
	printf("<");
	while (l.size() != 1) {
		if (turn == K) {
			printf("%d, ", *it);
			it = l.erase(it);
			turn = 1;
		}
		else {
			it++;
			turn++;
		}
		if (it == l.end()) it = l.begin();
	}
	printf("%d>", l.front());
}

 

2. 다음으로 큐 이다. 

개념은 내가 위에서 설명한 내용과 비슷하다.

아. 큐에 대한 이해가 부족하다면 다음 글을 참고하자.

https://jhcard.tistory.com/69

 

[C++] queue 라이브러리

queue는 list자료구조와 매우 유사하다. list에서 파생된 자료구조라 생각하면 편하다. FIFO구조로 first in first out / 먼저 들어간 친구가 먼저 나오게 되는 그런 구조이다. 먼저 list를 이해하고 오는 것

jhcard.tistory.com

그러니까 K번 만큼 큐에서 가장 앞에 있는 요소를 맨 뒤로 보내고, K번째가 되면 해당 요소를 출력한 후, 삭제하는 것이다. 그러니까 pop과 front()함수를 이용하여 계속해서 반복해주는 것이다.

#include <cstdio>
#include <queue>

int main(void){
    int N, K; scanf("%d %d", &N, &K);
    std::queue<int> q;
    for(int i = 1; i<= N; i++) q.push(i);
    int turn = 1;
    printf("<");
    while(q.size() != 1){
        if(turn == K){
            printf("%d, ", q.front());
            q.pop();
            turn = 1;
        }
        else{
            turn++;
            q.push(q.front());
            q.pop();
        }
    }
    printf("%d>", q.front());
}

내가 이 글을 작성한 이유는 이러한 종류의 문제를 만나게 된다면 queue를 사용하는 것이 아마 더 효과적일 것이다. 상황에 맞게 큐와 리스트를 구분하여 사용하는 것이 좋다. 참고하도록 하자.

 

728x90
반응형

'코딩테스트 > Silver 5' 카테고리의 다른 글

[S5] 11653. 소인수분해  (0) 2022.07.03
[S5] 11651. 좌표 정렬하기 2  (0) 2022.07.03
[S5] 1676. 팩토리얼 0의 개수  (0) 2022.07.03
[S5] 10815. 숫자 카드  (0) 2022.07.02
[S5] 1094. 막대기  (0) 2022.07.01