StreamReader, StreamWriter / Graphics, Bitmap 클래스
·
C#
개발이라고 하기에 작은 프로젝트였지만 아무튼, 이번 프로젝트에서 처음 배웠는데 가장 많이 사용한 클래스가 두 가지였다. 첫 번째는 StreamReader, StreamWriter 클래스. csv 파일 불러오기와 저장하기에 쓰였다. 깃허브에서 얻어온 포켓몬 스트라이프의 파일명이 모두 영어였다. 영어를 한글로 번역하기 위해 파일명을 불러온 후에 단어 쌍을 csv 파일로 만들고 다시 불러와야했다. using System.IO; using System.Collections.Generic; Dictionary dict = new Dictionary(); StreamReader sr = new StreamReader(string path); string str = string.Empty; while((str = s..
포켓몬 픽셀아트 생성기 v2.02
·
C#
원하는 기능을 모두 구현하진 못했지만 일단 필요했던 기능은 모두 담아 완성했습니다. 1번부터 905번까지의 도감 번호를 기반으로 난수를 뽑습니다. 30배로 뽑히는 안농과 70배로 뽑히는 마휘핑은 이제 없습니다. 시리즈에 합류한 세대를 구분해 뽑을 수 있는 방식입니다. 모든 체크박스를 해제하면 뽑기 버튼이 사라집니다. 포켓몬의 세대 구분은 나무위키를 참조했습니다. 이로치 확률은 0.1%로 표기되어있지만 실제로는 5%입니다. 우측 상단의 콤보박스에서 폼체인지, 픽셀아트 난이도(색상 수)를 조절할 수 있습니다. 프린트 폼을 구현해보려 노력했지만 해상도를 맞추는데 어려움이 있었습니다. 그냥 이미지로 저장하도록 했습니다. 저장하기를 누르면 픽셀아트로 만들어 이미지를 저장합니다. 바탕화면에 저장 체크박스를 체크하면..
포켓몬 픽셀아트 생성기 v2.0 - 30%
·
C#
띠부띠부씰처럼 완전 랜덤으로 순수한 본인의 운을 시험해볼 수 있는 프로그램을 구현했지만 실제 교실에서 사용해보니 아이들은 자기가 아는 십수가지 포켓몬만 좋아할 뿐이고 못생긴(...) 나머지 포켓몬들은 뽑히면 오히려 더 아쉬워하는 문제가 있습니다. 공유도 해봤더니 다른 반의 반응도 비슷했던 모양입니다. 일단 빠르게 세대, 지역을 구분해서 뽑는 기능을 추가하고, 한 포켓몬이 여러개의 폼을 갖는 경우(특히 마휘핑...) 기존 방식으로는 뽑힐 확률이 높아지기 때문에 넘버링 기반의 뽑기 시스템을 도입해야합니다. 그렇게 하기 위해 우선 모든 포켓몬의 이미지 데이터와 이름, 번호를 매칭시키는 작업을 해야합니다. 픽셀아트를 만드는 것이 핵심 기능이기 때문에 색상을 단순화해야합니다. 1344개에 이르는 이미지를 따로 수..
OpenFileDialog, FolderBrowserDialog
·
C#
외부 파일을 불러오거나 폴더를 지정하기 위해 사용할 수 있는 클래스 string path = string.Empty; // 파일 경로를 저장할 string OpenFileDialog dialog = new OpenFileDialog(); // 인스턴스화 dialog.InitialDirectory = @"C:"; // 초기 경로 지정 dialog.Filter = "bmp files (*.bmp)|*.bmp|gif files (*.gif)|*.gif|All files (*.*)|*.*"; // 파일 필터 설정 |로 구분 dialog.FilterIndex = 1; // 필터 인덱스 설정 dialog.RestoreDirectory = false; // 마지막 탐색 경로 저장 여부 if (dialog.ShowDi..
포켓몬 픽셀아트 생성기 v1.0
·
C#
요즘 포켓몬빵이 아이들 사이에서 굉장히 귀합니다. 편의점에 들어온 빵은 아이들이 학교갈 시간이면 이미 다 매진이라 아이들은 띠부띠부씰 구경도 못하고 있는 현실입니다. 안타까워서 애들이 좋아할 프로그램을 만들어봤습니다. winform을 열심히 배우고 있습니다. 이제 배운 걸 써먹을 수 있는 구현에 발을 들여보았습니다. 생각보다 잘 되는게 놀랍고 생각보다 복잡하고 어려워서 당황스럽고 여러가지 입니다. 1-6세대의 포켓몬이 뽑힙니다. 이로치 포켓몬도 1%의 확률로 나옵니다. 출력 기능을 넣어보려 했지만 이상적인 결과가 나오지 않아 좀 더 공부한 후에 추가해보겠습니다. 다음 업데이트에는... 7세대 포켓몬과 일부 포켓몬의 폼체인지, 메가진화를 추가, hwp파일로 내보내기 기능을 추가해 출력할 수 있는 기능 추가..
C# 백준 11650 좌표 정렬하기(정렬, 람다식)
·
PS/BOJ
11650번: 좌표 정렬하기 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다. www.acmicpc.net IDEA 처음 봤을 때는 쉬운 정렬 문제구나 했다. 리스트를 만들었고 그냥 정렬해서 출력했다. 대신 List 형식의 요소를 꺼내올 때 하나씩 따로 꺼내오는 걸 몰라서 지저분하게 String 메소드를 이것저것 갖다 붙이게 됐다. 너무 맘에 안들어..하던 와중에 2차원 배열의 정렬 방법을 다른 분의 코드에서 찾았다. 리스트에서 특정 항목을 기준으로 배열하는 방법인데 엑셀에서 필터 적용하는 것과 비슷한 개념인 것 같..
C# 백준 1182 부분수열의 합(백트래킹, 브루트포스)
·
PS/BOJ
1182번: 부분수열의 합 첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다. www.acmicpc.net IDEA 공집합을 제외한 모든 부분 집합의 원소의 합을 계산해보는 문제다. 하나만 고르는 경우, 둘을 고르는 경우, 이렇게 따로따로 생각하면 어떻게 접근해야할지 좀 막막한데 백트래킹의 원리를 생각해보면 모든 경로를 탐색하고, 매 탐색마다 탐색 중인 정점의 수치를 더해주고 되돌아갈 때 더했던 값을 다시 빼주면 1~N개까지의 원소를 갖는 모든 부분 집합을 한번씩 탐색할 수 있다. CODE using System; class Pro..
점프 문 (goto)
·
C#
점프문에는 break, return, continue 등이 있다. 여기서는 goto 키워드만 간단히 알아본다. goto 키워드는 switch 문 안에서 사용하는 것이 보통이지만 그게 goto 키워드를 사용할 때 꼭 필요한 조건은 아니다. 하지만 goto 문은 가이드 상에서도 사용하지 않는 것을 권장하고 있고 코드를 어지럽게 만들거나 해결하기 굉장히 어려운 버그의 원인이 되기도 하기 때문에 간단한 한개의 goto문으로 정리되는 코드이거나 정말 필요한 경우가 아니면 사용하지 않는 것이 좋다. (라고 배웠다.) using System; class Program { static void Main() { Start: Console.Write("당신의 혈액형은 무엇인가요?\nAnswer:"); string bloo..
C# 백준 1247 부호 (BigInteger)
·
PS/BOJ
1247번: 부호 총 3개의 테스트 셋이 주어진다. 각 테스트 셋의 첫째 줄에는 N(1 ≤ N ≤ 100,000)이 주어지고, 둘째 줄부터 N개의 줄에 걸쳐 각 정수가 주어진다. 주어지는 정수의 절댓값은 9223372036854775807보다 작거 www.acmicpc.net 굉장히 쉬운 문제다. 그냥 입력을 받고 더해준 다음 부호를 확인해주고 출력하면 된다. BigInteger 형식을 쓴다면 말이다. 그렇게 쉽게 풀었다. using System; using System.Numerics; class Program { static void Main() { var n = new int(); var b = new BigInteger(); for(int i = 0; i < 3; i++) { b = 0; n = ..
C# 백준 1987 알파벳 (깊이우선탐색)
·
PS/BOJ
1987번: 알파벳 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으 www.acmicpc.net IDEA 모든 가능성을 탐색하고 최적의 결과를 얻어내는 문제다. 처음에는 아무 생각 없이 BFS를 시도했다. 이 문제는 탐색 과정에 문자를 계속 붙여나가고 이걸 String으로 관리한다면 쓸모없는 메모리가 엄청 늘어날 것이다. 그래서 나는 StringBuilder로 경로를 저장하고 이걸 큐에 돌려 BFS를 실행하기로 했다. 너무 짧은 생각이었다. 문자 형식 데이터는 16바이트를 차지한다. 만약 한 지점에서 모든 방향이 가능했고 1회 탐색을 시도했다면 32..
C# 백준 20162 간식 파티 (동적계획법)
·
PS/BOJ
20162번: 간식 파티 서울이는 입맛이 까다로운 고양이다. 입맛이 까다로운 서울이는 전에 먹었던 간식보다 더 맛있는 간식만 먹는다. 서울이는 간식의 평점이 높을수록 맛있다고 느낀다. 집사는 서울이에게 N 일 www.acmicpc.net IDEA 이 문제는 아주 오래전 시도했다가 틀린 문제다. 입출력만 겨우겨우 하던 당시에는 너무 어렵다고 생각해서 취침 시간을 12분 남겨놓고 포기했던 모양이다. 문제를 간단히 정리하면 이렇다. 1. 서울이는 N일 동안 이어지는 간식 파티에서 간식을 골라 먹는다. 2. 서울이는 이전에 먹었던 간식보다 더 평점이 높은 간식만 먹는다. 3. 간식 파티가 끝날 때까지 서울이가 먹은 간식의 평점 총합의 최고치는? 오늘이 i일이고 오늘 주어지는 간식의 평점을 snack[ i ], ..
C# 백준 12100 2048 (Easy) (백트래킹, 브루트포스)
·
PS/BOJ
12100번: 2048 (Easy) 첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2 www.acmicpc.net IDEA 브루트포스 문제는 복잡한 생각을 할 필요가 없어서 좋다. 한 때 재밌게 하던 2048 게임을 구현하는 문제다. 모든 가능성을 탐색해서 원하는 결과를 뽑아내면 된다. 탐색 과정에서 이전 과정을 기억해두고 되돌아가 다른 경로를 탐색할 수 있도록 하는 것이 관건이다. N * N 크기의 배열을 스택에 담아 탐색 과정을 관리하도록 했다. 처음에는 N * N 배열을 매개변수로 하는 재귀 호출로 구현했다. 그런데 매개변수로 받아온 데이터는..
전라남도교육지원청
맞았습니다!!