백준 5430 AC

백준 5431 AC
처음 든 생각은 RR이 있을 때는 무효한 연산이 되고,
RRDRRDRD…라는 함수 문자열이 주어졌을 때 R은 head, tail 인덱스를 가리키고, D는 그 첫 위치가 바뀔 때마다의 자리를 앞에서 첫째자리, 둘째자리…와 ,같은 식으로 하면 되겠다싶었다.

Continue reading

SWEA 2805 농작물 수확하기

전략은 잘 세웠다.
빠른 시간 안에 나만의 풀이법을 잘 찾았는데,
포문에서 if, continue,dir++순서에서 한 번 막혔고
j로 돌아가는 포문을 하나 더 둬야 좌우로 뻗어나가면서 탐색하는 데 초반에 풀 때는 이걸 간과했다.
한 20분, 30분 안에는 풀 수 있을 것 같았는데 아쉽다.

Continue reading

SWEA 1210 Ladder1

문제전략

델타 방식으로 좌우 탐색을 먼저 진행한다.
만약 1로 칠해진 곳이 있으면 2로 체크하고 isTurned를 true로 바꿔준다.
만약 여기서 토글되지 않으면, 좌우로 갈 곳이 없다는 뜻이니까 아래의 if문으로 가서 좌표를 위쪽 방향으로 진행시킨다.
만약 if문에서 map[–i][j]와 같이 하면 i가 0일때 outOfBound가 나니까 while문 상단에서 체크를 해줬다.

Continue reading

SWEA 1208 Flatten

문제전략

크기가 100인 배열을 준비하고, 높이를 입력받은 후 그 높이를 인덱스로 갖는 원소를 1만큼 증가시킨다.
예를 들어 42층의 블록이 들어오면, arr[42]++;을 한다.
입력 받을 때 max,min을 갱신한다.
입력 받고 나서, 덤프횟수에 맞춰서 arr[max]–, arr[max-1]++을 하고
arr[min]–,arr[min+1]++;을 한다.

Continue reading

백준 1244 스위치 켜고 끄기

흠 백준에서 자바는 채점이 정말 느리다. 채점을 5분이상 기다려본 적이 없는데 신기하다.
처음에 제출할 때 public class Main 으로 안 해서 컴파일 에러가 났다.

문제전략

기지국 문제를 풀고 와서 영향을 받았는지 다른 쪽으로 생각나질 않았다.
학생이 여성일 경우 좌우탐색을 한칸,두칸, 세칸 순으로 진행하게 포문을 돌렸다.
static int[] dx = { -1, 1 };
for (int j = 1; j < N; j++) {
int left = dx[0]j + NUM;
int right = dx[1]
j + NUM;
} 이런식으로 돌게 만들었다.

Continue reading

IM 기지국

문제를 간단히 설명하자면 기지국 A,B,C는 각각 사방으로 한칸, 두칸, 세칸의 영향력을 미침. 그 범위 안에 들어오지 못하는 집이 몇개나 있는 지 세는 문제였다.
교수님의 코드는 하단에 추가했다.
다른점은,
첫번째로 toCharArray()와, for문에서 charAt()으로 받는 것.
두번째로, 나는 델타를 12개의 배열로 하드코딩했는데 교수님은 ABC기지국에 카운트를 줘서 cnt = map[r][c] - 65 + 1; 와 같이 쓰셨다.
이렇게 하면 for문을 하나만 써도int nc = c + dc[k] * d;처럼 쓸 수 있다.

Continue reading

SWEA 1289 원재의 메모리 복구하기

BufferedReader를 써봤다.
String으로 받은 뒤에 Integer.parseInt를 해야하나 고민하다가
그냥 char 자체로 인식해서 풀었다.
가장 메인 아이디어는 이전 배열의 원소가 다르면 카운트가 증가한다.
이번 기회에 SWEA에 제출은 처음 해보았다.
첫 줄에 package명은 제거하고,
파일 입출력으로 테스트했던 문장도 지워야했다.
System.setIn(new FileInputStream(“Input.txt”));
한 가지 실수를 더 했는데, test case가 1부터 시작하는 걸 습관처럼 0부터 해서 살짝 헤맸었다.
교수님 코멘트 : 처음에 배열 두 개를 사용하는 것을 풀어보세요. 보다 직관적인 방법이니까.

Continue reading

백준 1927 최소힙

최대힙과 유사한 문제다. 코드한줄만 변경하면 된다.
최대힙에서는 priority_queue q; 와 같이 만들었다면, 최소힙은 functional을 헤더에 추가해야하고, priority_queue<int, vector, greater> q;와 같이 작성해야한다.

Continue reading

백준 18870 좌표압축

이 문제에서 좌표압축을 처음 접했다. 내 언어로 정리해보자면, -10부터 10까지 범위에서 -10,2,5,10으로 네 수가 있을 때 0,1,2,3으로 인덱싱을 해서 좌표공간을 압축한다. 만약 중복값이 있다면 제거하고 인덱싱을 하면 된다.
입력받은 배열을 먼저 sort함수로 정렬한 후 unique함수로 중복값을 제거한다. 이렇게 정리한 배열의 하한값- 배열의 첫 요소를 빼면 0이 나올 것이다. 배열의 나머지 요소들도 같은 방식으로 해결하면 된다.

Continue reading

백준 11723 집합

보통 이런 문제는 큐나, 스택에서 많이 보던 유형인데 특별히 저장되는 순서는 상관없었고
stl vector를 사용하면 될 것 같았다. add, remove, check 등의 기능을 가진 함수를 각각 만들고 main함수에서 string을 입력받은 후 각 함수를 호출하는 식으로 풀었다.

Continue reading

백준 11399 ATM

문제설명이 좀 복잡하다고 생각했습니다.
제가 더 간단하게 설명할 순 없을 것 같지만,
인출시간이 짧은 사람부터 줄세워야 각 사람이 돈을 인출하는데 필요한 시간의 합이 최소가 될 것임을 알 수 있습니다.
따라서 이 문제는 그리디문제로서 오름차순 정렬이 우선되어야함을 직관적으로 알 수 있습니다.

Continue reading

백준 1697 숨바꼭질

온라인 알고리즘 마라톤 2주차 문제로 풀게 되었습니다.
이전에 바킹독님 강의에서도 한 번 본 적이 있어서 수월하게 풀었던 것 같습니다.

간단하게 문제를 요약하자면,
수빈이와 동생의 위치를 입력받고,
수빈이가 x-1, x+1, 2*x로 움직이면서 그 거리에 동생이 위치하였는지 알아보는 문제였습니다.

Continue reading

백준 11723 집합

//이전에 제출한 코드에서 코드반복 줄임. 
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> v;
int check(int n) {
	vector<int>::iterator iter;
	iter = find(v.begin(), v.end(), n);
	if (iter == v.end()) //없음
		return 0;
	else
		return 1;
}
void remove(int n) { //원소가 있는지 사전에 체크한 후 실행
	vector<int>::iterator iter;
	iter = find(v.begin(), v.end(), n);
	v.erase(iter);
} 
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int m, n;
	cin >> m;
	string str;
	while (m--) {
		cin >> str;
		if (str == "check") {
			cin >> n;
			cout << check(n) << '\n';
		}
		else if (str == "add")
		{
			cin >> n;
			if (!check(n)) v.push_back(n);
		}
		else if (str == "remove")
		{
			cin >> n;
			if (check(n)) remove(n);
		}
		else if (str == "toggle")
		{
			cin >> n;
			if (check(n)) remove(n);
			else v.push_back(n);
		}
		else if (str == "empty")
			v.clear();
		else if (str == "all") {
			v.clear();
			for (int i = 0; i < 20; i++)
				v.push_back(i + 1);
		}
	}
}

Continue reading

programmers lv1 이상한 문자 제거하기

공백을 기준으로 입력받은 s를 토큰으로 나누어야하나 잠깐동안 고민했음.
그러나 생각을 바꿔서, i를 기준으로 작동하는 포문 1개에서 j변수를 같이 사용하기로 했다.
아스키코드 기준으로 [65,91]이 대문자, [97,123]이 소문자다.
알파벳 개수는 26개지만 대문자와 소문자 사이의 간격은 32라서, 소문자에서 32를 빼면 대문자가 되고 대문자일 때 32를 더하면 소문자가 되는 것을 이용했다. ```cpp #include #include

Continue reading

programmers lv1 제일 작은 수 제거하기

벡터를 사용해서 간단하게 풀 수 있는 문제였다.
굳이 반환하는 벡터 vector answer를 할당하지 않고 arr를 재활용했다. 처음에는 최소값을 포문에서 일일이 찾아서 벡터 answer에 복사하는 코드를 써봤는데 시간초과가 났었다. 아래가 최종 작성한 코드. STL vector에서 min_element와 erase를 적절히 사용했다. ```cpp #include #include #include using namespace std;

Continue reading

종만북 27장 그래프

7부 그래프

  • 27장 : 인접행렬, 인접리스트 구현법, 이에 대한 장단점
  • 28장 : DFS(깊이우선탐색)
  • 29장 : BFS(너비우선탐색). 가중치가 없는 그래프 상에서 최단경로를 찾기 위한 대표적인 알고리즘
    추가적으로 양방향 탐색과 점점 깊어지는 탐색에 대해서 소개함
  • 30장 : 가중치가 있는 그래프 상에서 정점 사이의 최단경로를 찾기 위한 알고리즘
    경로의 출발점이 하나로 고정되어있는지에 따라 각각 다른 알고리즘을 사용해야한다. 대표적으로 다익스트라, 벨만-포드, 플로이드 알고리즘.
  • 31장 : 가중치가 있는 그래프 상에서 가중치의 합이 최소가 되도록 간선의 부분 집합을 선택해 정점들을 모두 연결하는 문제- 최소신장트리
  • 32장 : 각 간선에 대해 길이뿐 아니라 용량을 정의했을 때 풀 수 있는 문제인 그래프의 최대 유량문제. 최적화 문제로, 그래프와는 상관없어 보이는 여러 문제를 풀 때 유용하다. 대표적으로 포드-풀커슨 알고리즘.

Continue reading

programmers 소수찾기

#include <iostream>
using namespace std;
int arr[100];
bool Prime(int x) {
	if (x == 1)
		return false;
	else if (x == 2)
		return true;
	else {
		for (int i = 2; i < x; i++) {
			if (x % i == 0)
				return false;
		}
	}
	return true;
}
int main() {
	int n;
	cin >> n;
	int cnt = 0;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
		if (Prime(arr[i]))
			cnt++;
	}
	cout << cnt;
}

Continue reading

백준 1018 체스판 다시 칠하기

처음 생각한 풀이 : 보드를 입력받은 배열에 첫번째가 B,W인지 확인하면서 새로운 배열에 B,W를 새로 작성하기.
막힌 부분 : 첫번째 요소가 B이면 그대로 두고 다음 요소를 W로 쓰려고 할 때, flag를 사용한다.
이런식으로 해서 (0,0)~(7,7)까지 한 번 배열을 작성하고, 총 재작성한 횟수를 어딘가에 또 저장해야하는가? 여기서 부딪힘.
뭔가 비효율적임을 깨달음;

Continue reading

Pagination


© 2020.08. by ritajeong

Powered by ritajeong