본문 바로가기

전체 글

(164)
[SWEA] JAVA - 3499 퍼펙트 셔플 (설명 오늘내로 업로드 예정입니다!!!) N개의 카드가있으면 이를 정확하게 반으로 나누고 나눈것들을 교대로 카드를 뽑아 새로운 덱을 만드는 문제이다. 이때 반으로 나눈 카드들을 각각 맨 앞에 있는 카드를 먼저 뽑아야 한다. 맨 앞에 있는 카드를 먼저 뽑아야 하는 순서를 지켜야 하기 때문에 Queue 를 활용하여 풀었다. 이때 N이 홀수일경우 먼저 놓는쪽에 한장이 더 들어가게 처리해줘야 하기 때문에 N이 짝수인 경우와 홀수인 경우를 나눠서 처리해줬다. 1. 카드를 반으로 나눈것들중 왼쪽의 카드와 오른쪽의 카드를 저장하기 위한 left, right 큐를 만들었다. 2. left 큐에서 한장뽑은다음 right 큐에서 한장을 한쪽의 큐가 모두 비어있을때까지 반복해주었다. 3. 이렇게 뽑힌 카드들의 순서를 저장하..
[SWEA] JAVA - 1210 Ladder1 (설명 오늘내로 업로드 예정입니다!!) 재귀함수로 문제를 풀고싶어 y=0이고 좌표값이 1인 x 좌표들 중에서 출발하여 y가 마지막 행 까지 도달할때 해당 x 좌표값을 반환하는 재귀 함수를 구현하려고 시도하였습니다. 하지만 이렇게 시작을 문제에서 주어진대로 접근하는 경우 보다 문제를 거꾸로 뒤집어서 도착점~출발점 을 찾아가는 방식으로 풀어야 한다는것을 배운 문제였습니다. 우선 도착점에서 시작하여 좌,우 방향으로 방향 전환이 가능할경우 방향 전환을 해주었습니다. 만약 좌우 방향 모두 이동할수없을 경우 전진 이동을 해야합니다. (저는 좌우 방향의 이동 우선순위가 더 높은줄 모르고, 이동 분기점에서 제일 첫번째 if문에 직진이 가능할 경우를 설정해서 코드를 수정했습니다 ㅠㅠ) 재귀함수로 구현한 go 함수에서 y..
[SWEA] JAVA - 1873 상호의 배틀필드 (설명 오늘내로 업로드 예정입니다!!) 처음 문제를 읽고 잘못 이해해서 엄청 헤맸다ㅠㅠ 첫번째로 헤맨 부분은 방향 명령어가 들어온다면 이동하거나 이동할수없을때(벽돌벽이던 강철벽이든 물이든) 모두 방향전환을 먼저 처리해줘야하는걸 놓쳤다. 두번째로는 전차와 포탄의 좌표는 별개의 값이므로 각각 처리해줘야한다. 만약 포탄을 발사했는데 계속해서 평지이면 포탄을 계속 이동시킨다. 문제를 처음 읽었을땐 풀만한데?ㅎㅎ 이러고 풀었다가 정말 정말 반성했다. 이렇게 잘못짜버린 코드를 쉽게 버릴수도없고 테스트 케이스도 99개?중에 80개가 맞게 나와서 더욱 힘들었다. (결국 같은반 알고리즘 스터디 조원으로부터 방향처리가 잘못됐다는 지적을 받아 풀수있었다^-ㅠ 고마워 우재!! ) 지난주부터 알고리즘 보충수업을 들으면서 교수님..
[SWEA] JAVA - 1223 계산기2 중위표기법을 후위표기법으로 바꾼다음 계산 결과를 출력하는 문제입니다. 분명 이번주에 배웠는데 중위표기법을 후위표기법으로 바꾸는 부분이 잘 떠오르지 않아 구글링해가며 로직을 다시 이해했습니다. 이 문제에서는 '+', '*' 연산자만 나오기 때문에 연산자 우선순위를 간단하게 비교할수 있습니다. 먼저 중위표기법을 후위표기법으로 바꿀때, 피연산자를 만나면 후위표기법 리스트에 저장합니다. 만약 연산자가 들어온다면 이 연산자가 입력값(연산자)과 우선순위를 비교하여 우선순위가 높은 연산자를 pop해준뒤 다음 새로운 연산자를 스택에 넣어줍니다. 그 다음으로 연산자 스택에 쌓여있는 값들을 모두 후위표기법 리스트에 붙여줍니다. 마지막으로 후위표기법으로 표시된 리스트에서 연산작업을 해줍니다. 아래와 같이 동작합니다. 피연산..
[SWEA] JAVA - 1225 암호생성기 8개의 숫자를 앞에서부터 차례대로 1~5까지 감소시키고 맨앞의 원소를 감소시키면 감소된값을 다시 tail 로 붙이는 작업을 반복한다. 이러한 과정을 반복하기때문에 Queue를 사용해서 풀었다. 1~5까지 감소시키는 과정이 한 싸이클이다. 이렇게 계속 싸이클을 진행시키다가 0보다 같거나 작아지는 원소가 발생할때 이 원소를 0으로 유지한다음 종료시킨다. package com.ssafy.off; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class SWEA_1225 { static int[] password; private static void solve(int[] password) { Queue q..
[SWEA] JAVA - 1218 괄호 짝짓기 열린괄호만을 저장하고 닫힌 괄호와 가장 최근에 저장한 열린 괄호와 매칭 시켜주기 위해 스택 자료구조를 사용해서 풀었습니다. 만약 닫는 괄호가 왔는데 스택이 비어있다면 잘못된 괄호이고, 스택의 pop 원소와 새로 들어오는 괄호의 짝이 맞지 않아도 잘못된 괄호입니다. 이때 각 괄호마다 짝을 지어주기 위해 HashMap 의 Key-Value 특징을 사용하여 Key 값에 열린 괄호들을 넣고 Value에는 닫힌 괄호들을 넣어 서로 짝을 지어줬습니다. (다른분들의 코드를 보니 case방식으로 짝을 많이 맞춰줬는데 좋은 방법인것같습니다.) package com.ssafy.off; import java.util.HashMap; import java.util.Scanner; import java.util.Stack; p..
[SWEA] JAVA - 5432.쇠막대기 자르기 처음에 문제를 어떻게 풀것인지에 대해 '오늘 수업에서 스택을 배워서 스택 자료구조를 사용할껏같습니다'라고 생각했다가 반성한 문제입니다. 처음 아이디어가 떠오르지 않아 수업을 듣고나서 이해했습니다. 또한 스택을 사용해서 풀어도 되지 않은 문제이고 레이저가 나올때 누적한 쇠막대기값과 나와있는 쇠막대기 개수를 더해나가면 되는 문제였습니다. 만약 () 이런 형식의 레이저가 아니고 ')' 만 나왔을때는 쇠막대기가 끝나는 지점이므로 나와있는 쇠막대기 개수인 cnt값을 -1 감소시키고 누적 쇠막대기 값도 +1만 더해주면된다 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util..
2월 첫째주 주말동안 할일!! 이번주에 재귀함수와 시뮬레이션 문제들을 풀어보았다... 수업시간에 함수가 재귀적으로 호출하는 동작 방식을 계속 쫓아가지말고 "Flat" 하게 생각하라고 해주셨는데 머리로는 그렇게 생각해도 막상 문제를 풀때는 어려운것같다ㅜㅜ 시뮬레이션 문제도 바로 문제에 대한 아이디어를 떠올리고 바로 구현하는것이 아니라 생각을 정리한 다음에 논리적으로 구현하는 습관을 확실하게 잡아야할껏같다. 계속 연습해야지!! 이번 주말동안은 풀었던 알고리즘문제([SWEA]배틀필드, [SWEA]1210_Ladder1)를 다시 복습하자!! 화이팅!!