안녕하세요 좋은 강의 감사합니다. 저는 _mp[세로줄][점선] 이렇게 생각해서 구현했습니다. 문제에서 나온것과는 다르게 사다리가 놓을수 있는 곳을 세로로 생각해서 코드를 짰습니다. 그래서 UP DOWN이 있습니다. 구현과정에서 인덱스는 0부터 시작하도록 설정했습니다. http://boj.kr/a4dda6bde3c04184b402349de75eefbc 시간초과가 나서 수정해보다가 안되서 질문올립니다. 감사합니다.
public int solution(String s){ int answer = 0; HashMap<String, Integer> map = new HashMap<>(); HashSet<Integer> hs = new HashSet<>(); //유일하게 존재해야한다 => 해시셋 사용 String[] list = s.split(""); for(int i=0; i<list.length; i++) { map.put(list[i], map.getOrDefault(list[i], 0)+1); } for(String x : map.keySet()) { int check = map.get(x); while(hs.contains(check)) { //셋에 이미 숫자가 있으면 하나를 감소 check--; if(check==0) { //0은 넣지 않는다. answer++; break; } answer++; } hs.add(check); } return answer; } 이처럼 작성했는데 답은 모두 맞게 출력되는데, 강사님이 작성하신 알고리즘이랑 동일한 건가요???
안녕하세요, 큰돌님 완전탐색을 해서 풀었습니다. 제가 생각한 시간초과의 이유가 맞는지 궁금합니다. 2^26으로 하면 시간복잡도는 대충 10^7? 10^8정도인데, cal연산의 시간복잡도는 어림잡아 50*15을 해서 10^3 정도여서 10^8 * 10^3 을 하면, 시간복잡도는 어림잡아 10^11 정도가 되어 시간초과가 나는건가요? https://www.acmicpc.net/source/61970109
맞은 코드: http://boj.kr/ed84ee795122447db8c315de4b963c10 틀린 코드 (시간 초과) : http://boj.kr/fb273c695c8844afb5f3d72ff539970e 안녕하세요 강사님 :) 해당 문제에서 시간 초과가 계속 나서 이것저것 고쳐보다가 결국 정답을 받긴 했는데.. 정답 코드와 틀린 코드가 물론 다른 코드이지만, 맞고 틀리고에 어떤 영향을 준 것인지 이해가 잘 되지 않아서 질문드립니다. 두 코드의 차이점은 간단하게 tracing을 위한 코드인 while문에서의 차이입니다. 맞은 코드는 while문을 첫 번째 정답인 dp[n]의 최솟값만큼 반복합니다. int temp = n; int repeat = dp[n]; while(repeat--) { cout << temp << ' '; temp = prev_[temp]; } cout << 1 << '\n'; 틀린 코드는 while문(tracing)을 1이 나올 때까지 반복합니다. int temp = n; while(1) { cout << temp << ' '; temp = prev_[temp]; if(temp == 1) break; } cout << 1 << '\n'; 틀린 코드는 98~99%쯤 시간 초과가 나는데 혹시 이유가 있을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 수고 많으십니다. 연결리스트 (Linked List) - 1 : 17분부터 이해가 안가서 문의 남깁니다. append(2) → append(3)으로 갈 때 1-1) new_node = Node(value) 에서 append(2),(3)의 위치값은 둘다 0x00000 로 지정되고 1-2) 그 다음 명령어인 else로 오면 append(2)의 위치 값이 생기는 걸로 설명해주셨습니다. 1-3) 그리고 그 다음에 append(4)가 실행되면 그냥 위에서 했던것 처럼 진행하면 append(3)방에는 위치값이 생기고 append(4)방은 0x00000으로 지정되는거 아닌가요? 왜 while 문을 써줘야되는지 모르겠습니다. → 혹시 class Node 로부터 명령어가 계속 이어져서 그런건가요? class Node에서 first.next = second / second.next = third로 지정해놨는데 third.next를 지정하지 않아서 둘다 0x0000으로 위치 값이 된건가요? 2. 18분 24초 while 문에서 while( current.next ): 명령어가 current의 next node가 none 까지 반복하라는 거라고 말씀해주셨는데 while( current.next ) 이 한 문장에 함축적으로 명령어가 담겨져 있는 건가요? 왜 while 문이 저걸 의미하는지 모르겠네요ㅠ → 혹시 class Node 로부터 명령어가 계속 이어져서 그런건가요? class Node에서 next 초기 값을 none으로 지정해줘서 current.next 가 none 값을 찾아라는 의미일까요? 감사합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강사님 강의 잘듣고 있습니다. 3-E 뮤탈리스크 문제 관련해서 질문이 있는데요. 풀이강의 듣기전에는 저런식으로 재귀함수를 생각했는데요. 데미지를 계산하는 함수를 만들고 그 안에 데미지 9,3,1에 대해서 순열을 계산해서 나온 6개에 대한 재귀함수를 각각 작성해서 끊임없이 내부에서 돌다가, SCV 3개의 피가 모두 0이하가 되면 return 해서 빠져나오는걸 생각했습니다. 뭐 보시다싶이...모든 케이스 다 틀리게 나오고 cnt도 1000이상씩 증가하는거보면 완전히 로직도 이상한것 같습니다만 디버깅 돌려봐도 워낙 복잡해서 그런지... 어디서 잘못된거지 정확히 이해가 안가서요. 혹시 로직이 어떤게 잘못된거지 봐주실수 있나요? 아니면 아예 접근법 자체가 완전히 틀려서 안되는건지 궁금합니다..... #include <iostream> #include <vector> #include <algorithm> #include <queue> #include <climits> using namespace std; int cnt = 0; int ret = INT_MAX; int n,aa,bb,cc; void attack(int a, int b, int c) { cnt++; if (a <= 0 && b <= 0 && c <= 0) { ret = ret < cnt ? ret : cnt; //cout << "cnt : " << cnt << " a : " << a << " b : " << b << " c : " << c<<endl; cnt--; return; } attack(a - 9, b - 3, c - 1); attack(a - 9, b - 1, c - 3); attack(a - 3, b - 9, c - 1); attack(a - 3, b - 1, c - 9); attack(a - 1, b - 3, c - 9); attack(a - 1, b - 9, c - 3); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> aa >> bb >> cc; attack(aa, bb, cc); cout << ret << '\n'; }
import java.util.Scanner; public class Main { private String solution(String str) { String result = ""; String[] words = str.split(" "); for (String word : words) { if (result.length() == word.length()) continue; // 가장 길이가 긴 단어가 여러개일 경우 문장속에서 가장 앞쪽에 위치한 단어를 답으로. if (result.length() < word.length()) result = word; } return result; } public static void main(String[] args) { Main main = new Main(); Scanner in = new Scanner(System.in); String str = in.nextLine(); System.out.println(main.solution(str)); } 선생님 코드와 많이 다른데 효율성 측면에서 좋지 못한 코드인지 궁금합니다!
저는 투포인터로 생각하고 각 경우의 수에 따라 바이토닉을 판별하는 걸로 했는데, 답이 다르긴한데 이렇게 구현하면 안되는 건가요??? public int solution(int[] nums){ int answer = 0; //다음 숫자가 지금 숫자보다 커여한다 //반복하면 안됨 //증가하다가 줄어든다 (정답 후보) //같은 수가 나오면 안된다. int cnt=0; boolean flag = false; //바이토닉 여부를 판별하기 위한 boolean변수 int ans = 0; int lt=0; for(int rt=1; rt<nums.length; rt++) { if(nums[lt]<nums[rt]) { //다음 숫자가 더 크면 바이토닉 가능 lt++; flag = true; //바이토닉이다 continue; } else if(nums[lt]==nums[rt]) { //다음 숫자랑 지금 숫자랑 같으면 바이토닉 아니다. lt++; if(flag) { //만약 이전까지 바이토닉이였다면 길이 구해주기 cnt = rt-lt+1; } flag = false; //바이토닉 판별을 초기화 continue; } else if(nums[lt]>nums[rt] && flag) { //다음 숫자가 지금보다 작고 바이토닉이면 지금까지의 길이를 구해줌 cnt = rt-lt+1; } else if(nums[lt]>nums[rt] && !flag) { //다음 숫자가 지금보다 작지만 바이토닉이 아니였다면 무시 lt++; continue; } ans = Math.max(ans, cnt); //최대 길이 갱신 } System.out.print(ans); return answer; }
def solution(moves): move2direction={'U':[-1,0], 'R':[0,1], 'L':[0,-1], 'D':[1,0]} nr, nc = 0, 0 for move in moves: dr, dc = move2direction[move] nr += dr nc += dc return [nr, nc]
안녕하세요 선생님의 코드를 보면서 이해가 안가는 부분이 있습니다. 영상에서 64~66번째 줄에서 ch[i][j]=0으로 초기화를 시키는데 그 이유가 뭔지 알 수 있을까요? 제 생각엔 심바가 이동을 한 map에서만 0을 적용해서 구하면 될 거 같은 생각이 들어서 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. function solution(alphaStr1, alphaStr2) { let answer = "YES"; let alphaMap = new Map(); for(let i of alphaStr1) { if(alphaMap.has(i)) alphaMap.set(i, alphaMap.get(i) + 1); else alphaMap.set(i, 1); } for(let i of alphaStr2) { if(alphaMap.has(i)) alphaMap.set(i, alphaMap.get(i) - 1); else return "NO"; } for(let [key, val] of alphaMap) { if(val != 0) answer = "NO"; } return answer; } let alphaStr1 = "AbaAeCe"; let alphaStr2 = "baeeACA"; console.log(solution(alphaStr1, alphaStr2));